刚写的一个自动编译、混淆、打包jar的代码,做个记录

用到的NuGet:

<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="DotNetZip" version="1.10.1" targetFramework="net45" />
<package id="Newtonsoft.Json" version="10.0.2" targetFramework="net45" />
</packages>

  

using Ionic.Zip;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ApiCloudModulePackage
{
class Program
{
static string tempPath;
static ToolConfig toolConfig;
static void Main(string[] args)
{
tempPath = Path.GetTempPath() + Guid.NewGuid().ToString("N") + "\\";
if (Directory.Exists(tempPath) == false)
{
Directory.CreateDirectory(tempPath);
}
toolConfig = Newtonsoft.Json.JsonConvert.DeserializeObject<ToolConfig>( File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + "projects.json") );
try
{
foreach (ProjectConfig project in toolConfig.projects)
{
//compile jar
jarProject(project);
} Console.Write("需要现在生成模块的zip文件吗?[y/n]:");
while(true)
{
var keyResult = Console.ReadKey();
if (keyResult.Key == ConsoleKey.Y)
{
Console.WriteLine("\r\n");
//make zip file from module folder
foreach (var moduleFolder in toolConfig.modules)
{
makeZip(getPathFromConfig(moduleFolder));
Console.WriteLine("打包输出:" + moduleFolder + ".zip");
}
break;
}
else if (keyResult.Key == ConsoleKey.N)
{
Process.GetCurrentProcess().Kill();
}
} Console.WriteLine("打包完成! 按任意键退出");
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
try
{
Directory.Delete(tempPath, true);
}
catch
{
} Console.ReadKey();
} static void makeZip(string folder)
{
string zipfilepath = Path.GetDirectoryName(folder) + "\\" + Path.GetFileName(folder) + ".zip";
if (File.Exists(zipfilepath))
File.Delete(zipfilepath);
using (ZipFile zip = new ZipFile(zipfilepath))
{
string root = Path.GetFileName(folder);
zip.AddDirectoryByName(root);
zip.AddDirectory(folder , root);
zip.Save();
}
} static void jarProject(ProjectConfig project)
{
Console.WriteLine("正在编译" + project.sourceFolder);
string srcPath = getPathFromConfig(project.sourceFolder);
//create temp folder
string tempFolder = tempPath + Guid.NewGuid().ToString("N") + "\\";
string classTempFolder = tempFolder + Guid.NewGuid().ToString("N") + "\\";
string jarDstFolder = tempFolder + "jar\\";
string proguardFolder = tempFolder + "jar\\"; if (Directory.Exists(jarDstFolder) == false)
{
Directory.CreateDirectory(jarDstFolder);
}
if (Directory.Exists(classTempFolder) == false)
{
Directory.CreateDirectory(classTempFolder);
}
List<string> javaFiles = new List<string>();
getFiles(javaFiles, srcPath , "*.java");
//copy java files to temp folder
string encoding = null;
foreach( string javafile in javaFiles )
{
if(encoding == null)
{
var encode = GetFileEncodeType(javafile);
if(encode == System.Text.Encoding.UTF8)
{
encoding = "utf-8";
}
else
{
encoding = "GBK";
}
}
File.Copy(javafile, tempFolder + Path.GetFileName(javafile) , true);
}
StringBuilder libJars = new StringBuilder();
StringBuilder proguardJars = new StringBuilder();
if (!string.IsNullOrEmpty(project.libPath))
{
List<string> jarList = new List<string>();
Program.getFiles(jarList, Program.getPathFromConfig(project.libPath), "*.jar"); if (jarList.Count > 0)
{
libJars.Append(" -cp ");
foreach (string jarfile in jarList)
{
libJars.Append('"');
libJars.Append(jarfile);
libJars.Append('"');
libJars.Append(';');
proguardJars.Append(" -libraryjars ");
proguardJars.Append('"');
proguardJars.Append(jarfile);
proguardJars.Append('"');
}
}
} ProcessStartInfo proStartInfo = new ProcessStartInfo("javac");
// -source 1.6 -target 1.6 表示按照jdk1.6标准编译,默认是1.8,太高了,eclipse使用时会出错,因为eclipse项目里面设置的是1.6
proStartInfo.Arguments = $"-Xlint:unchecked -Xlint:deprecation -source 1.6 -target 1.6 -encoding {encoding} -bootclasspath {AppDomain.CurrentDomain.BaseDirectory}android.jar {libJars} -d {classTempFolder} {tempFolder}*.java";
proStartInfo.UseShellExecute = false;
Process process = Process.Start(proStartInfo);
process.WaitForExit(); if(true)
{
//build jar, jar file actually is zip file
using (ZipFile zip = new ZipFile($"{jarDstFolder}result.jar"))
{
zip.AddDirectory(classTempFolder); var content = @"Manifest-Version: 1.0
Created-By: 1.8.0_40 (Oracle Corporation) ";
byte[] bs = System.Text.Encoding.UTF8.GetBytes(content);
zip.AddEntry("META-INF/MANIFEST.MF", bs);
zip.Save();
}
}
else
{
////这里是利用jar程序生成jar文件
//List<string> classFiles = new List<string>();
//getFiles(classFiles, tempFolder, "*.class");
//foreach (string classfile in classFiles)
//{
// File.Copy(classfile, jarDstFolder + Path.GetFileName(classfile), true);
//}
//proStartInfo = new ProcessStartInfo("jar");
//proStartInfo.Arguments = $"cvf {jarDstFolder}result.jar {jarDstFolder}*.class";
//proStartInfo.UseShellExecute = false;
//process = Process.Start(proStartInfo);
//process.WaitForExit();
} if(!string.IsNullOrEmpty(project.proguardConfigFile))
{
Console.WriteLine("正在混淆代码...");
process = Process.Start(new ProcessStartInfo("java")
{
Arguments = $"-jar proguard.jar @{project.proguardConfigFile} -injars {proguardFolder}result.jar -outjars {proguardFolder}result2.jar -libraryjars android.jar {proguardJars}",
UseShellExecute = false
});
process.WaitForExit();
if (!File.Exists(string.Format("{0}result2.jar", proguardFolder)))
{
throw new Exception(project.sourceFolder + "代码混淆出错");
}
File.Delete( $"{proguardFolder}result.jar");
File.Move($"{proguardFolder}result2.jar", $"{proguardFolder}result.jar");
} if (File.Exists($"{jarDstFolder}result.jar") == false)
throw new Exception("编译"+ project.sourceFolder +"失败!"); //copy jar to destination
foreach ( var dstpath in project.buildDestinations )
{
string destination = getPathFromConfig(dstpath);
File.Copy($"{jarDstFolder}result.jar", destination, true);
Console.WriteLine($"Maked {destination}");
}
} static System.Text.Encoding GetFileEncodeType(string filename)
{
using (System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read))
{
System.IO.BinaryReader br = new System.IO.BinaryReader(fs);
Byte[] buffer = br.ReadBytes(2);
if (buffer[0] >= 0xEF)
{
if (buffer[0] == 0xEF && buffer[1] == 0xBB)
{
return System.Text.Encoding.UTF8;
}
else if (buffer[0] == 0xFE && buffer[1] == 0xFF)
{
return System.Text.Encoding.BigEndianUnicode;
}
else if (buffer[0] == 0xFF && buffer[1] == 0xFE)
{
return System.Text.Encoding.Unicode;
}
else
{
return System.Text.Encoding.Default;
}
}
else
{
return System.Text.Encoding.Default;
}
}
} static string getPathFromConfig(string path)
{
if (path[1] == ':')
return path.Replace("/", "\\");
else
{
return AppDomain.CurrentDomain.BaseDirectory + path.Replace("/", "\\");
} } static void getFiles(List<string> result, string folder , string pattern)
{
var files = Directory.GetFiles(folder, pattern);
result.AddRange(files); var dirs = Directory.GetDirectories(folder);
foreach( var dir in dirs )
{
getFiles(result, dir , pattern);
}
}
}
}

  

贴一段自动编译java,并混淆编译的代码的更多相关文章

  1. Eclipse不自动编译java文件的终极解决方案

    最近我的eclipse经常犯傻,项目中总是有很多,启动项目也是没有启动类.查了下项目中生成的class文件,我靠竟然没有,或者还是以前的.原来是eclipse犯傻了,它没帮我自动编译java文件.一般 ...

  2. Eclipse不能自动编译 java文件的解决方案

    前段时间出现了eclipse 不自动编译java文件的问题,在网上找了好长时间,总算把问题解决了,现在把这个问题的解决方法总结一下. 1,看看project -- Build Automaticall ...

  3. eclipse新建web项目,发布 run as 方式和 new server然后添加项目方式。 后者无法自动编译java 成class文件到classes包下。

    eclipse新建web项目,发布 run as 方式和 new server然后添加项目方式. 后者无法自动编译java 成class文件到classes包下. 建议使用run as  -  run ...

  4. 《深入理解Java虚拟机》-----第10章 程序编译与代码优化-早期(编译期)优化

    概述 Java语言的“编译期”其实是一段“不确定”的操作过程,因为它可能是指一个前端编译器(其实叫“编译器的前端”更准确一些)把*.java文件转变成*.class文件的过程;也可能是指虚拟机的后端运 ...

  5. 使用maven编译Java项目 http://www.tuicool.com/articles/YfIfIrq

    使用maven编译Java项目 时间 2014-07-17 17:42:37  Way Lau's Blog 原文  http://www.waylau.com/build-java-project- ...

  6. java 源码编译

    Java语言的“编译期”其实是一段“不确定”的操作过程,因为它可能是指一个前端编译器(叫“编译器的前段”更准确)——把*.java文件转变成*.class文件的过程:也可能是虚拟机的后端运行期编译器( ...

  7. Java虚拟机 - Javac编译与JIT编译

    [深入Java虚拟机]之七:Javac编译与JIT编译 编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤 ...

  8. 使用maven编译Java项目

    摘要: 综述 本文演示了用Maven编译Java项目 需要 时间:15分钟 文本编辑器或者IDE JDK 6 或者更高版本 创建项目 本例主要为了展示Maven,所以Java的项目力求简单. 创建项目 ...

  9. 关于 .NET 与 JAVA 在 JIT 编译上的一些差异

    最近因为公司的一些原因,我也开始学习一些 JAVA 的知识.虽然我一直是以 .NET 语言为主的程序员,但是我并不排斥任何其它语言.在此并不讨论 JAVA .NET 的好坏,仅仅是对 .NET 跟 J ...

  10. Notepad++根据语言类型自动选择对应编译器来编译代码

    Notepad++的NppExec插件可以调用好多编译器来编译代码. 比如编译Java: NPP_SAVE javac "$(FULL_CURRENT_PATH)" java -c ...

随机推荐

  1. git SSL certificate problem: unable to get local issuer certificate

    cmd 命令行中输入  git config --global http.sslVerify false 之后再进行操作

  2. 问答:怎样规划CSS 中 的命名方式 怎样看待 CSS 中 BEM 的命名方式?

    好多盆友 非常纠结 css命名规则 怎么弄,还没起步就被绊住了.那么今天蝈蝈就针对这个问题来讨论一下 没什么技术 含量.但却对效率开发至关重要的 "问题". 下文是一些知乎大神的个 ...

  3. C#之out和ref区别

    out与ref的区别总结:1.两者都是通过引用来传递.2.两者都按地址传递的,使用后都将改变原来参数的数值.3.属性不是变量,因此不能作为 out或ref 参数传递.4.若要使用 ref 或 out, ...

  4. Android 驱动 (一) GPIO

    前面的博文对Lichee做了系列分析,事实上就是对在<七年之痒>中所说的,Android BSP具备的一项基本素养-SHELL脚本,所以我们Lichee系列的文章着重分析了SHELL脚本和 ...

  5. research plan1111

    Hello prof.Choi 感谢您的来电,与您的这次通话我已经期盼了很久.我来做个自我介绍,我叫陈飞,今年27岁了,是河北地质大学计算机科学专业的本科毕业生.我非常想提高自己的学历,现在经过刘老师 ...

  6. IOS系统控件高度

    以下是常见的几种控件的高度.Statusbar,Navigationbar和Tabbar的宽度极其图标大小. 下表是更为详细的参数,包括了Statusbar,Navigationbar.Tabbar. ...

  7. hibernate中id中的 precision 和 scale 作用

    转自:https://www.cnblogs.com/IT-Monkey/p/4077570.html <hibernate-mapping>     <class name=&qu ...

  8. PCB 规则引擎之脚本语言JavaScript应用评测

    世界上没有好做的软件,觉得好做,只是你的系统简单而已,而不是哪个行业简单,特别像我们PCB制造企业务逻辑的很复杂的,仅仅靠决策树中的每个节点布置决策逻辑是不能满足要求的,所以我们在制作PCB规则引擎必 ...

  9. P4166 [SCOI2007]最大土地面积

    传送门 首先,四边形的四个点肯定都在凸包上(别问我为什么我也不知道,感性理解一下好了) 那么我们可以求出凸包之后\(O(n^4)\)暴力枚举,据说在随机数据下凸包上的点只有\(O(logn)\)个可过 ...

  10. javascript 处理链接的多种方式

    在页面中的链接除了常规的方式以外,如果使用javascript,还有很多种方式,下面是一些使用javascript,打开链接的几种方式: 1.使用window的open方法打开链接,这里可是在制定页面 ...