Android  的jar混淆踩坑之旅

来源:互联网 发布:淘宝发布宝贝商家编码 编辑:程序博客网 时间:2024/06/14 20:01

最近公司需要将将之前提供个客户的jar进行混淆以保护代码,防止信息泄露。然后在网上搜了一大堆相关的android jar混淆资料,然后实践下来各有各的坑爹!
网上关于android 打jar包,proguard混淆的资料比较多,笔者就赘述了,需要可以的可以google。
本文就记录混淆jar过程中遇到的各种坑及解决办法,希望对遇到同样问题的读者有所帮助。

问题1. 需不需要导入jdk 的jar包?

虽然有些文档提示需要导入jdk的中的rt.jar(正确地址为:/Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home/jre/lib)
然后实践下来发现不需要。

问题2. 那些jar 需要libraryjars 上面添加

一般情况下最需添加的是android jar包,地址为/Users/wanny/Library/Android/sdk/platforms/android-25/android.jar,另外就是这个jar所依赖的第三方包,例如常见的gson、okhttp、v7等jar包。

问题3. proguard 混淆时报 Can’t read [/Users/wanny/Library/Android/sdk/platforms/android-25/android.jar] (Can’t process class [java/text/CollationElementIterator.class] (Unsupported class version number [52.0] (maximum 51.0, Java 1.7))) 等类似错误

这个问题比较坑爹,错误信息显示我们的jdk版本超过了java 1.7 51.0 版本,等我们去下载jdk 1.7 51.0 版本又是一阵折腾。而且更坑爹的最新的mac 系统不支持jdk 1.7 51.0 这么低的版本,我们都安装不了

出现这个问题的用户很多都是用android SDK toos中自带的proguard,建议到Proguard官网上下载proguard 最新的版本,问题迎刃而解。

问题4. Proguard Load configuration 失败。

当我们将混淆的配置文件写好,load configuration 后,期待着proguard 一次性将我们jar 混淆好,可悲他竟然报错,加载不了我们辛辛苦苦写的配置文件。

一般出现这个问题肯定是我们的proguard 配置文件写的有问题。可能原因
- 地址injars,outjars,libraryjars 等地址有误
- proguard keep 语句写错,注意keep 语句开头一定记得加上-
- 其他注释语句没有用# 注释起来

···

当然类似出现此问题,唯一的解决途径就是仔细再仔细的检查proguard 的配置文件。

问题5,混淆后未找到混淆后jar文件。

这个问题,是用户没有在proguard 配置文件中写上outjars 地址,或者没有在add output 添加导出后地址,记得添加上去就行
另外注意在这个地方proguard 需要你提供一个已经存在的jar包作为混淆后输出的jar包,可以先用用”touch new.jar”新建了一个空白的jar包,然后将地址添加上去。

问题6,混淆后需要对外提供的class也不见了,只剩下寥寥几个class

这个问题是因为我们对外的提供类没有keep 好,被proguard 当成无用的代码直接优化掉。
因此我们需要对外提供接口需要暴露出来,不需要混淆,可在配置文件加上

-keep public class com.cardinfolink.test{    public <fields>;    public <methods>;}

其他的需要对外提供的接口都需要好好的暴露出来,及对外提供的成员变量也需要keep 好防止混淆后不可识别。
另外内部类及内部接口等也不要好好处理

另外顺便提供一份proguard 的配置文件以供参考。

 -injars /Users/wanny/Downloads/Android/CILPaySDK.jar -outjars /Users/wanny/Downloads/Android/demo/testdemo/libs/CILPaySDK.jar-libraryjars /Users/wanny/Downloads/Android/demo/testdemo/libs/libammsdk.jar-libraryjars /Users/wanny/Library/Android/sdk/platforms/android-25/android.jar-dontoptimize-dontusemixedcaseclassnames-keepattributes *Annotation*,Signature,InnerClasses,EnclosingMethod-dontpreverify-verbose-dontnote com.android.vending.licensing.ILicensingService,com.google.vending.licensing.ILicensingService,com.google.android.vending.licensing.ILicensingService,android.support.**-dontwarn android.support.**-keep public class com.google.vending.licensing.ILicensingService-keep public class com.android.vending.licensing.ILicensingService-keep public class com.google.android.vending.licensing.ILicensingService# Keep setters in Views so that animations can still work.-keepclassmembers public class * extends android.view.View {    void set*(***);    *** get*();}# We want to keep methods in Activity that could be used in the XML attribute onClick.-keep public class * extends android.app.Activity-keep public class * extends android.app.Application-keep public class * extends android.app.Service-keep public class * extends android.content.BroadcastReceiver-keep public class * extends android.content.ContentProvider-keep public class * extends android.app.backup.BackupAgentHelper-keep public class * extends android.preference.Preference-keepclasseswithmembernames class * {    native <methods>;}-keepclassmembers class * extends android.app.Activity {    public void *(android.view.View);}-keepclassmembers class * extends android.os.Parcelable {    public static final ** CREATOR;}-keepclassmembers class **.R$* {    public static <fields>;}# Preserve annotated Javascript interface methods.-keepclassmembers class * {    @android.webkit.JavascriptInterface    <methods>;}# Understand the @Keep support annotation.-keep class android.support.annotation.Keep-keep @android.support.annotation.Keep class * {    <fields>;    <methods>;}-keepclasseswithmembers class * {    @android.support.annotation.Keep    <methods>;}-keepclasseswithmembers class * {    @android.support.annotation.Keep    <fields>;}-keepclasseswithmembers class * {    @android.support.annotation.Keep    <init>(...);}# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native-keepclasseswithmembers,allowshrinking class * {    native <methods>;}# Also keep - Enumerations. Keep the special static methods that are required in# enumeration classes.-keepclassmembers enum  * {    public static **[] values();    public static ** valueOf(java.lang.String);}-keep class com.cardinfolink.view.** {    <fields>;    <methods>;}-keep public class com.cardinfolink.activity.** {    public <fields>;    public <methods>;}-keepclassmembers class com.cardinfolink.activity.PayModule{    public <fields>;    public <methods>;    protected <fields>; } -keep class com.cardinfolink.constants.** {*;}-keep public class com.cardinfolink.engine.CILPayEngine{    public <fields>;    public <methods>;}-keep public class com.cardinfolink.util.PayResult{    public <fields>;    public <methods>;}-keep public class com.cardinfolink.util.ResultJson{    public <fields>;    public <methods>;}
0 0
原创粉丝点击