如何生成混淆過的可執行的jar程序
最近因為工作需要提供幾個Android 相關的小工具,這幾個工具最終都是以可執行的jar的方式提供,開發期間遇到了一些問題,在這里專門總結一下備忘一下。
怎么生成可執行java程序
相關源碼:
具體案例
可執行Java程序只需要一個入口程序即可,想要把哪個類作為執行入口,只需要在對應類實現static的main函數即可。例如源碼中的 CheckAndroidSignature.java 。
在添加了main函數以后,cd到src目錄即可編譯運行對應的java程序。例如下面就完成了編譯了運行:
? src git:(master) javac com/bihe0832/checksignature/CheckAndroidSignature.java
? src git:(master) ? java com.bihe0832.checksignature.CheckAndroidSignature --version
com.tencent.ysdk.CheckAndroidV2Signature version 1.0.1 (CheckAndroidV2Signature - 2)
homepage : https://github.com/bihe0832/AndroidGetAPKInfo
blog : http://blog.bihe0832.com
github : https://github.com/bihe0832
怎么生成可執行jar
上一步演示了如果生成可以執行的Java程序,但是這并不方便提供給第三者使用,因此我們需要把可執行的java代碼進一步封裝為一個可執行的jar。接下來會分別介紹包含第三方jar和不包含第三方jar的Java程序怎么生成可執行jar。兩種方法都是直接使用Eclipse導出的方法,沒有使用maven等其余方法。
不包含第三方jar
相關源碼:
具體案例
CheckAndroidV2Signature 是一個完全自己寫的,沒有依賴第三方jar的java程序,接下來會step by step來介紹導出過程。
-
1.選擇項目工程,然后右擊選擇導出,如下圖:
- 2.在彈框(Select)中選擇Java分類下面的 Jar File ,之后下一步。
-
3.在新的彈框(JAR File Specification)中,選擇你要導出的工程,并選擇Jar包含的內容,一般一些IDE的配置文件之類的就不用導出了。然后選擇并指定導出文件的路徑和地址,之后下一步,如下圖:
- 4.在新的彈框(JAR Packaging Options)中,保持默認的配置,然后繼續下一步。
-
5.在新的彈框(JAR Mainfest Specification)中,在最下方選擇應用的主入口(Select the class of the application entry point)如下圖:
- 6.設置OK以后直接點擊Finish,如果不出意外,就會在之前設置的路徑生成對應的jar
-
7.執行命令檢查效果,已經OK
? src git:(master) ? java -jar ./../CheckAndroidV2Signature.jar --version com.tencent.ysdk.CheckAndroidV2Signature version 1.0.1 (CheckAndroidV2Signature - 2) homepage : https://github.com/bihe0832/AndroidGetAPKInfo blog : http://blog.bihe0832.com github : https://github.com/bihe0832
包含第三方jar
在開發中發現,包含第三方jar和不包含的,處理方法會不太一樣,目前還沒有仔細研究不一樣的原因,只確定用下面的方法可以解決。
相關源碼:
具體案例
GetApkInfo 是一個使用了AXMLPrinter和jdom寫的java程序,運行時依賴兩個jar。接下來會step by step來介紹導出過程:
-
1.選擇項目工程,然后右擊選擇導出,如下圖:
- 2.在彈框(Select)中選擇Java分類下面的 Runnable JAR file ,然后下一步。
-
3.在新的彈框(Runnable Jar File Specification)中,選擇你程序運行的入口類,指定導出文件的路徑和地址,之后點擊完成,如下圖:
-
4.如果不出意外,就會在之前設置的路徑生成對應的jar。執行命令檢查效果,已經OK
? java -jar getPackageInfo-inner.jar --version com.bihe0832.getPackageInfo version 1.0.1 (getPackageInfo - 2) homepage : https://github.com/bihe0832/AndroidGetAPKInfo blog : http://blog.bihe0832.com github : https://github.com/bihe0832
jar 怎么混淆
我們有時候雖然需要提供可執行jar給第三方,但是并不想很簡單的讓第三方了解我們的實現邏輯,因此最有效的辦法就是代碼混淆。Android中的代碼混淆我們都很熟,對于Jar文件的代碼混淆怎么做呢?
混淆工具
Android的sdk工具包里面已經整合了代碼混淆相關的工具,放在sdk目錄下的$tools/proguard/bin/中。
混淆規則文件
-injars getPackageInfo-inner.jar # 混淆前的文件
-outjars getPackageInfo.jar # 混淆后的文件
-libraryjars <java.home>/lib/rt.jar # Java運行時
#常規的代碼混淆規則
-dontwarn org.**
-keep class org.** { *;}
-keep public class com.bihe0832.packageinfo.Main {
public static void main(java.lang.String[]);
}
關于代碼混淆文件有幾點說明:
- 混淆前后的文件不要同名
- Java可執行程序的入口函數不能被混淆
混淆方法
將上面的混淆規則保存為文件,例如 proguard.pro ,把 proguard.pro 和待混淆的文件 getPackageInfo-inner.jar 按照 proguard.pro 中的路徑設置,然后運行命令
? $ANDROID_HOME/tools/proguard/bin/proguard.sh @proguard.pro
程序執行完成以后就生成了對應的jar,指定命令的時候注意混淆規則文件簽名的 @ 符號。OK,至此就生成了可以混淆的可執行jar。
來自:http://blog.bihe0832.com/runnable-jar.html