android 代码是开源的,这个大家都知道,不加密或者不混淆的话别人很容易通过反编译的工具查看我们的代码甚至是通过逆向工程什么的直接篡改我们的app,加个广告就当自己的应用上传上去。
因此,混淆是必要的。
网上有很多第三方加固,如百度加固,360加固等,但是这些加固会存在一些问题,比如在一些机型上跑不起来或者开启时卡顿的时间长。
因此,这篇简单的说下如何混淆。
具体的操作表现在我们修改eclipse代码项目中的proguard-project.txt文件,当然前提是我们在proguard-project.txt中把
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt从注释中拿出来放在最下面。
其次是在proguard-project.txt文件中编写我们的规则
-optimizationpasses 7 #指定代码的压缩级别 0 - 7 -dontusemixedcaseclassnames #是否使用大小写混合 -verbose #混淆时是否记录日志(混淆后生产映射文件 map 类名 -> 转化后类名的映射 -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* #淆采用的算法 -keepattributes Signature -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 -keepclasseswithmembernames class * { native <methods>; #保持 native 的方法不去混淆 } -keep class *****.album.bean.**{ *; } -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); #保持指定规则的方法不被混淆(Android layout 布局文件中为控件配置的onClick方法不能混淆) } -keep public class * extends android.view.View { #保持自定义控件指定规则的方法不被混淆 public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet, int); public void set*(...); } -keepclassmembers class * extends android.app.Service { #保持类成员 public void onCreate(); } -keepclassmembers enum * { #保持枚举 enum 不被混淆 public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { #保持 Parcelable 不被混淆(aidl文件不能去混淆) public static final android.os.Parcelable$Creator *; } -keepnames class * implements java.io.Serializable #需要序列化和反序列化的类不能被混淆(注:Java反射用到的类也不能被混淆) -libraryjars libs/android-support-v4.jar -dontwarn android.support.v4.** -keep class android.support.v4.** { *; } -keep interface android.support.v4.** { *; } -keep public class * extends android.support.v4.** -keep public class * extends android.app.Fragment -libraryjars libs/bugly_1.2.3.8__release.jar -dontwarn com.tencent.bugly.** -keep class com.tencent.bugly.** { *; } -libraryjars libs/encrypted-image-loader.jar -dontwarn com.nostra13.universalimageloader.** -keep class com.nostra13.universalimageloader.** { *; } -libraryjars libs/fastjson-1.1.43.android.jar -dontwarn com.alibaba.** -keep class com.alibaba.** { *; } -libraryjars libs/qr.jar -dontwarn com.google.zxing.** -keep class com.google.zxing.** { *; } -libraryjars libs/android_api_3.7.1.0.jar -dontwarn com.baidu.kirin.** -keep class com.baidu.kirin.** { *; } -libraryjars libs/xUtils-2.6.14.jar -dontwarn com.lidroid.xutils.** -keep class com.lidroid.xutils.** { *; } -libraryjars libs/nineoldandroids-2.4.0.jar -dontwarn com.nineoldandroids.** -keep class com.nineoldandroids.** { *; } -libraryjars libs/MiStats_SDK_Client_1_3_0.jar -dontwarn com.xiaomi.mistat.** -keep class com.xiaomi.mistat.** { *; } -libraryjars libs/vlc.jar -dontwarn org.videolan.** -keep class org.videolan.** { *; } -libraryjars libs/Volley.jar -dontwarn com.android.volley.** -keep class com.android.volley.** { *; }
因为大部分的第三方库都是已经混淆过的,因此我们在混淆就会出现空指针,unkowned source等错误。
因此,第三方库都要加上以免报错
-libraryjars libs/Volley.jar#第三方jar -dontwarn com.android.volley.** #第一层包名 -keep class com.android.volley.** { *; }
-keep class *****.album.bean.**{ *; }***什么的,复制bean所在的包名就去即可。
这样大致上就解决了问题了。
当然还可能出现一些问题,比如要引用到外面的库的时候,在项目中是add library,没生成第三方包的,我们要自己生成第三方包。
或者还出现其他的问题,这个时候只要复制错误如***.p.a的,在签名后自动生成的proguard文件夹中的mapping.txt查找下错误的出处,
其次是查看seeds.txt中是否包含了我们免除混淆的所有第三方包,没有的话还需在规则上添加。
谢谢!