我在业余时间想看看android是如何混淆打包的,现在的android SDK都是带有Proguard工具的,这个工具的作用个人感觉其实就是为了时别人反编译你的apk文件后,无法轻松的阅读你的代码而使用的障眼法,功能有限,但是总比没有的好,哈哈。
现在开始正题吧。
(1)在Eclipse开发的项目下,会自动生成一个project.properties文件,里面的内容加上这么一句:
proguard.config=proguard.cfg这个proguard.cfg文件是在sdk2.3之前的版本中会自带的,2.3以后就是叫proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
这个其实是差不多的,不要在意,内容和性质一致。
(2)在相同的路径下修改(或者创建)这个配置文件proguard.cfg,大概可以写成如下形式:
-optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontpreverify -verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -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 -keep public class com.android.vending.licensing.ILicensingService -keepclasseswithmembernames class * { native <methods>; } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * { public <init>(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 { public static final android.os.Parcelable$Creator *; } -keep class com.tencent.mm.sdk.openapi.WXMediaMessage {*;} -keep class com.tencent.mm.sdk.openapi.** implements com.tencent.mm.sdk.openapi.WXMediaMessage$IMediaObject {*;} -libraryjars libs/android-support-v4.jar -dontwarn android.support.**
(3)现在有个问题,如果项目中存在第三方jar文件,如果被混淆的话,肯定是会出问题,可能在生成apk文件时报错,或者是无法安装和运行程序等等奇怪的错误。
通常上的方法,第三方jar文件,你可以在proguard.cfg文件中如下类似的配置:
-libraryjars /libs/nineoldandroids-2.4.0.jar -dontwarn com.nineoldandroids.** -keep class com.nineoldandroids.** { *;}
-ibraryjars libs/gson-2.2.2.jar -keep class sun.misc.Unsafe { *; } -keep class com.google.gson.stream.* { ; } -keep class com.google.gson.examples.android.model.* { ; } -keep class com.google.gson.* { *;}
android.library.reference.1=../projectNamex1跟第三方jar的处理很相似,在配置文件中增加
-libraryjars ../projectNamex1 -dontwarn com.projectNamex1.** -keep class com.projectNamex1.** { *;}
-libraryjars ..\第三方库的工程名--------引入的第三方库 -dontwarn 包名.** --------告诉ProGuard不要警告找不到包名.**这个包里面的类的相关引用 -keep class 包名.** { *;} --------对这个包里面的所有类和所有方法不进行混淆
。。。。
。。。
。。
。
经测试,使用proguard混淆后,我再反编译看源代码就有点难懂了。