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

用到的NuGet:

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( 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 javaFiles = new List();

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 jarList = new List();

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 classFiles = new List();

//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 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 混淆编译_贴一段自动编译java,并混淆编译的代码相关推荐

  1. idea java 代码混淆加密_使用 IntelliJ IDEA 开发一般 Java 应用程序时配置 Allatori 进行代码混淆...

    使用 IntelliJ IDEA 开发一般 Java 应用程序时通过 Allatori 进行代码混淆非常容易配置,下面总结一下本人经验,介绍一下配置方法. 首先在 IDEA 的 Module 所在硬盘 ...

  2. mac上java文件如何编译_如何在Mac上用Java编译和运行程序?

    小编典典 在Mac OSX或任何主要操作系统上编译和运行Java应用程序非常容易.Apple随OSX一起提供了一个功能齐全的Java运行时和开发环境,因此您要做的就是编写Java程序并使用内置工具来编 ...

  3. java 部分类_为什么微软部分类和Java不?

    微软成功的秘密(不再是秘密了)是GUI(图形用户界面). 如果你是像我这样的老家伙,你会记得直到80年代的操作系统都是基于DOS的,有那些黑色的窗口和残忍的命令,如dir, edit, mkdir,等 ...

  4. java核心面试_前100多个核心Java面试问题

    java核心面试 Core Java interview questions help you in preparing for java based interviews. Whether you ...

  5. java 底层运行_从表面到底层丨Java和JVM的运行原理,现在带给你

    Java,编程语言,被创造于90年代初,在经历了这么多年的风风雨雨,Java已经成长为世界第一的编程语言,根据往期以及目前的数据来看,Java的使用频率为全球第一,即使偶尔会有第二第三的情况,但是这依 ...

  6. fedora java 开发环境_在Linux(Fedora)下搭建JAVA开发环境

    参考ORACLE的官方文档: https://docs.oracle.com/javase/tutorial/getStarted/cupojava/index.html JAVA开发基本上有这三个平 ...

  7. java字节码_好的,每个接触Java字节码的人

    java字节码 Oracle诉Google一案认为,复制Java API的结构,序列和组织是侵犯版权的行为. 侵犯版权不仅是复制行为,而且还适用于拥有该作品副本的所有中间方. 那就是编写/编译任何JV ...

  8. ubuntu java classpath 设置_在Ubuntu中正确设置java classpath和java_home

    我有错误 Exception in thread"main" java.lang.NoClassDefFoundError: 当我尝试在Ubuntu上运行编译类时.我使用的是一个非 ...

  9. java自学难点_分享在达内教育培训Java的感受

    刚在达内教育培训完java,给即将来培训以及已经在培的学员分享下我的感受 回想一下在达内教育学习Java时的情景,我仍然兴奋不已,其实在刚接触Java时,自己确实有点晕,但经过一段时间学习,逐渐走出了 ...

最新文章

  1. Win7无法远程桌面
  2. 8分钟答辩稿_干货 | 论文答辩,该掌握哪些技巧?
  3. JSI2性能测试报告
  4. 7805输入电流有要求吗_防雷!防护电路在PCB走线方面的要求(某500强企业内部资料~)...
  5. 查python的软件_Python制作天气查询软件【python实战必学】
  6. Spring Boot源码分析
  7. ExecuteScalar的使用
  8. docker搭建python开发环境_PyCharm使用之利用Docker镜像搭建Python开发环境
  9. 普元EOS在运算逻辑里面调用HttpServletRequest ,HttpServletResponse
  10. Win10安装ST-Link驱动--无需下载驱动
  11. 徐思201771010132《面向对象程序设计(java)》第六周学习总结
  12. Photoshop设计精讲精练(读书笔记)
  13. 百度地图开发Sug检索Demo
  14. 学习自旋电子学的笔记06:“扫参数”批量微磁模拟,ubermag介绍,微磁模拟求助
  15. 新奥创:多APP场景端到端的技术体系探索与突破
  16. 23考研计算机:天津理工大学
  17. bzoj1008题解
  18. 软件测试的软件资源,软件测试都会都用到哪些工具?
  19. 集合类(collection、List、Set、Map、HashMap、TreeMap、、Properties、泛型类、可变长参数、增强for循环、Collections、数组与链表)
  20. 批处理文件调用oracle实例

热门文章

  1. OpenShift 4 - DevSecOps Workshop (Jenkins版)
  2. 使用TensorFlow.js的AI聊天机器人一:检测文本中的情绪
  3. 使用动态SQL获取具有非空字段的自定义表结构
  4. CentOS 7.7(1908)发布
  5. 使用JavaScript和jQuery添加工具提示
  6. teamspeak3服务器搭建_教你快速便捷的搭建Teamspeak 3 服务器和基友开黑必备!
  7. 同一路由器下两台电脑ping不通_复杂网络环境下路由器配置问题导致业务故障处理案例分享...
  8. c 语言中out的作用,C语言outData+是什么意思做什么用?
  9. 电脑扫描文件怎么弄_彻底清除手机垃圾文件,释放内存的方法
  10. aesmiyao php_php写的AES加密解密类分享