贴一段自动编译java,并混淆编译的代码

刚写的代码,做个记录

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]:\r\n\r\n");
                while(true)
                {
                    var keyResult = Console.ReadKey();
                    if (keyResult.Key == ConsoleKey.Y)
                    { 

                        //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\\";
            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 proguardLibJars = new StringBuilder();
            if ( !string.IsNullOrEmpty( project.libPath ))
            {
                //make sure link necessary jar files
                List<string> libfiles = new List<string>();
                getFiles(libfiles, getPathFromConfig(project.libPath), "*.jar");
                if(libfiles.Count > 0)
                {
                    libJars.Append(" -cp ");

                    foreach (var libfile in libfiles)
                    {
                        libJars.Append(‘\"‘);
                        libJars.Append(libfile);
                        libJars.Append(‘\"‘);
                        libJars.Append(‘;‘);

                        proguardLibJars.Append(" -libraryjars ");
                        proguardLibJars.Append(‘\"‘);
                        proguardLibJars.Append(libfile);
                        proguardLibJars.Append(‘\"‘);
                    }
                }

            }
            ProcessStartInfo proStartInfo = new ProcessStartInfo("javac");
            proStartInfo.Arguments = $"-Xlint:unchecked -Xlint:deprecation -encoding {encoding} -bootclasspath 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("正在混淆代码...");
                proStartInfo = new ProcessStartInfo("java");
                proStartInfo.Arguments = $"-jar proguard.jar @{project.proguardConfigFile} -injars {jarDstFolder}result.jar -outjars {jarDstFolder}result2.jar -libraryjars android.jar {proguardLibJars}";
                proStartInfo.UseShellExecute = false;
                process = Process.Start(proStartInfo);
                process.WaitForExit();
                if (File.Exists($"{jarDstFolder}result2.jar") == false)
                    throw new Exception(project.sourceFolder + "代码混淆出错");
                File.Delete($"{jarDstFolder}result.jar");
                File.Move($"{jarDstFolder}result2.jar", $"{jarDstFolder}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);
            }
        }
    }
}

  

时间: 2024-08-16 15:43:34

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

使用GCJ编译Java程序供Matlab调用Java对象方法实践

1 引言 以Matlab作为开发平台,进行数值计算,具有直接.高效的特点. 然而,在面向对象程序设计方面,现有的Matlab支持特性在开发和运行效率上并不高. 将Java语言面向对象及其平台特性引入Matlab,能够拓展其模型表达能力与手段.此外,Java本身的特性,也决定了其具有良好的开发性能. 与C语言编写mex动态链接库的开发目的不同(mex主要以速度见长),基于Java的matlab扩展能为matlab带来更大的灵活性.甚至于,Java平台下更多的类库,能够丰富matlab平台功能. 2

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

前段时间出现了eclipse 不自动编译java文件的问题,在网上找了好长时间,总算把问题解决了,现在把这个问题的解决方法总结一下. 1,看看project -- Build Automatically有没有勾上?如果没有,勾上以后,clean一下,重启eclipse 2,看看你的lib里面有没有不用的jar包,看你的.classpath文件中有没有错误的路径. 3,这是最重要的一点,有problems视图中查看有没有关于本项目的错误信息,一般都会有这样的话: The project canno

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

最近我的eclipse经常犯傻,项目中总是有很多,启动项目也是没有启动类.查了下项目中生成的class文件,我靠竟然没有,或者还是以前的.原来是eclipse犯傻了,它没帮我自动编译java文件.一般是如下几个步骤.但是还是不自动编译. 最基本的解决办法--这是前提 然后clean和refresh下项目.如果这样还是不行,用下面的方法吧,终极解决方案...... 1:去除项目中的jre的classpath 2:在将jre的包添加到classpath中来 OK,大功告成!再出现eclipse无法自

Java千百问_08JDK详解(008)_通过代码如何编译java文件

点击进入_更多_Java千百问 1.通过代码如何编译java文件 编译器是一个命令行工具(jdk自带的编译工具javac,了解javac看这里:javac是什么),但也可以使用API来调用(一般的IDE都会使用这一组API来封装自己的编译功能).编译器遵循Java语言规范(The Java Language Specification,JLS)和Java虚拟机规范(The Java Virtual Machine Specification,JVMS). 在Java 6之后,提供了标准包来操作J

使用maven编译Java项目

摘要: 综述 本文演示了用Maven编译Java项目 需要 时间:15分钟 文本编辑器或者IDE JDK 6 或者更高版本 创建项目 本例主要为了展示Maven,所以Java的项目力求简单. 创建项目结构 选择一个项目目录,在 *nix系统上使用下面语句 mkdir -p src/main/java/he 综述 本文演示了用Maven编译Java项目 需要 时间:15分钟 文本编辑器或者IDE JDK 6 或者更高版本 创建项目 本例主要为了展示Maven,所以Java的项目力求简单. 创建项目

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

Notepad++的NppExec插件可以调用好多编译器来编译代码. 比如编译Java: NPP_SAVE javac "$(FULL_CURRENT_PATH)" java -cp "$(CURRENT_DIRECTORY)" "$(NAME_PART)" 保存为:Run Java 编译Python: NPP_SAVE python "$(FULL_CURRENT_PATH)" 保存为:Run Python 然后就是自动切换

Java 命令行编译项目

(初学者的一些总结-高手们勿喷哈-) 原因: 以前一直用Eclispe编程环境运行Java.非常舒服,就像用傻瓜相机照相一般. 有看见许多高手都是直接用vim编辑文件,命令行编译运行,觉得那样不是反而更繁琐? 转折点是在前几天本科毕设题目选定之后.毕设题是一个基于java 字节码的类关系动态分析.需要对.class文件中字节码进行更改(具体的说是在许多指令后加入做标记的新指令,以实现动态跟踪的目的). 我发现,eclipse根本无法如此灵活,他无法直接装载运行一个我修改过的.class文件.它是

使用Maven自动部署Java Web项目到Tomcat问题小记

导读 首先说说自己为啥要用maven管理项目,一个直接的原因是:我在自己电脑上开发web项目,每次部署到服务器上时都要经历如下步骤: 首先在Eclipse里将项目打包成war包 将服务器上原来的项目文件夹删掉 cd /var/lib/tomcat7/webapps sudo rm XXX.war sudo rm -rf XXX 将war包传到服务器上,比如用pscp命令上传 pscp -pw "xxx" XXX.war [email protected]:/var/lib/tomcat

java 命令行 编译 运行程序

学习java使用IDE前最好先用用命令行的javac.java来跑一跑简单的程序,这样能够熟悉一下包管理对.class文件路径的影响. 我们先写一段简单的代码: package com.csdn.lkasdolka; public class test_1{ public static void main(String[] args){ for(int i = 0; i < 10; ++i ){ System.out.println(i); } } } 写好后保存为test_1.java,win