因項目需要把 Android Framework 自主開發部分的代碼進行代碼混淆,首先的工具是 PROGUARD。但是 PROGUARD 更多是用于 APK 的代碼混淆。網絡上還沒有看到對 Framework 代碼混淆的案列。
網上找不到方法,隻好自己動手了。研究了兩天,終于實作了 Framework 層的代碼混淆。
1.修改 Android.mk
代碼放在 framework/base 目錄下,編譯生成 framework.jar,其實這不是一個很好的做法,因為與 Android 源生的代碼混合在一起,造成低耦合。前期考慮不當了,後期維護就相對麻煩。
最關鍵的一點,修改 Android.mk, 使需要混淆部分的包和類單獨編譯。因為 framework 其他代碼最好不要混淆,以免引起找不到類的出錯提示。
然後設定 LOCAL_PROGUARD_ENABLED := nosystem,很重要,不然類的方法不會混淆成abcd類似的名稱。
然後指定 proguard.flag,設定不混淆(保留)對外公開接口的類,重新編譯。可以用子產品編譯 mmm 指令提高編譯效率。
2.檢查 proguard_dictionary
首先 mmm 編譯後,會提示生成 proguard.classes.jar,這個時候 proguard 其實已經生效。但是我們還是要看一下實際的效果,jar 生成目錄會生成一個 proguard_dictionary(.out/target/common/obj/JAVA_LIBRARIES/framework-base_intermediates/proguard_dictionary),這個檔案記錄了混淆是如何生效的。例如:
float mCurrentX -> h
float mCurrentY -> i
3.反編譯檢查最終效果
.out/target/common/obj/JAVA_LIBRARIES/framework-base_intermediates/ 目錄下,
classes.jar 是沒有混淆前的包,而 javalib.jar 是混淆後的包,用 jd-gui 檢視混淆的效果是否滿意。
而更重要的是反編譯檢視 ./out/target/product/rk3288/system/framework/framework.jar, 因為這個是最終打包到系統裡面去的。
如圖,這個是我最終混淆後的結果:

4. 更新系統,檢查效果
将生成的新的 framework.jar push 到平闆,調用相關接口,看功能是否正常。如果不小心混淆了外部需要調用的接口,logcat 可以看到提示找不到類,那就會引起異常了。