一般正常发不出去的apk都是需要进行混淆打包的,否则太容易被破解了。比如用Android逆向助手这个工作,把apk转化为dex,然后dex再转化为jar,就可以通过工具查看java文件了。亲测,的确恐怖!然后再用这个工具反编译一下apk,拿到资源文件,这样一个apk就轻松的被破解了。此外除了java文件的混淆外,还有就是微信团队开源了一个混淆资源文件的方法,https://github.com/shwenzhang/AndResGuard,可以增加对代码可读性进行一定的包装。
下面是一点进行apk混淆的常用的方法。
-optimizationpasses 5 ->设置混淆的压缩比率 0 ~ 7 -dontusemixedcaseclassnames -> Aa aA -dontskipnonpubliclibraryclasses ->如果应用程序引入的有jar包,并且想混淆jar包里面的class -dontpreverify -verbose ->混淆后生产映射文件 map 类名->转化后类名的映射-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* ->混淆采用的算法.
-keep public class * extends android.app.Activity ->所有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
-keep public class com.android.vending.licensing.ILicensingService
-dontwarn android.support.v4.**
-dontwarn android.annotation
-libraryjars libs/android-support-v4.jar
-keepclasseswithmembernames class * { -> 所有native的方法不能去混淆.
native ;
}
-keepclasseswithmembers class * {
public (android.content.Context, android.util.AttributeSet); -->某些构造方法不能去混淆
}
-keepclasseswithmembers class * {
public (android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
-keepclassmembers enum * { -> 枚举类不能去混淆
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable { -> aidl文件不能去混淆.
public static final android.os.Parcelable$Creator *;
}
-keepclassmembers class * {
public (org.json.JSONObject);
}
-keep class android.support.v4.**{*;}
-keepattributes *Annotation*
============================================
对于引用第三方包的情况,可以采用下面方式避免打包出错:
-libraryjars libs/aaa.jar
-dontwarn com.xx.yy.**
-keep class com.xx.yy.** { *;}
网友评论