什么是混淆:直观点说混淆就是把源码中的类名、变量名、函数名变成了a,b,c等魔数,使得反编译后的源码难以阅读,还有对程序运行不起作用的代码混淆之后会消失,比如注释什么的,这样呢就能压缩apk的体积。其中混淆规则是保持某些重要的代码不被混淆,如果混淆了,apk的运行很可能就会有问题,比如引进三方的时候,人家就有明确的要求一些东西不能被混淆,否则就会影响其功能。
1压缩app体积,没有用到的代码不会被生成class文件
2防止反编译(没有用到的代码被混淆掉,反编译出来看到的是魔数,有用的代码没被混淆怎么还防止反编译了?因为混淆之后你的apk是要能运行的,如果混淆了核心的东西,apk就无法运行了,比如:清单文件,自定义view,三方的规则,事件的监听事件)
加固的是debug包
附一份混淆规则供大家参考
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in D:\studio_sdk\sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
-ignorewarnings # 忽略警告,避免打包时某些警告出现
-optimizationpasses 5 # 指定代码的压缩级别
-dontusemixedcaseclassnames # 是否使用大小写混合
-dontpreverify # 混淆时是否做预校验
-verbose # 混淆时是否记录日志
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* # 混淆时所采用的算法
-dontwarn android.support.v4.**
-dontwarn android.os.** #缺省proguard 会检查每一个引用是否正确,但是第三方库里面往往有些不会用到的类,没有正确引用。如果不配置的话,系统就会报错。
#-libraryjars libs/fastjson-1.2.8.jar
#-libraryjars libs/universal-image-loader-1.9.5.jar
#-libraryjars libs/alipaySdk-20160516.jar
#-libraryjars libs/MobCommons-2016.0303.1229.jar
#-libraryjars libs/SMSSDK-2.0.2.aar
#-libraryjars libs/SMSSDKGUI-2.0.2.aar
-keep class android.support.v4.** { *; } # 保持哪些类不被混淆
-keep class android.os.**{*;}
-keep class com.mob.tools.**{*;}
-keep class com.mob.commons.**{*;}
-keep class cn.smssdk.**{*;}
-keep class com.alibaba.fastjson.**{*;}
-keep class com.nostra13.universalimageloader.**{*;}
-keep interface android.support.v4.app.** { *; }
-keep public class * extends android.support.v4.**
-keep public class * extends android.app.Fragment
-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.support.v4.widget
-keep public class * extends com.example.sj.library.base.BaseFragment{*;}
-keep public class * extends com.example.sj.library.base.BaseActivity{*;}
-keep class * implements com.example.sj.library.net.NetOverListener{*;}
-keep class com.example.sj.library.**{*;}
-keep class com.alipay.android.app.IAlixPay{*;}
-keep class com.alipay.android.app.IAlixPay$Stub{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
-keep class com.alipay.sdk.app.PayTask{ public *;}
-keep class com.alipay.sdk.app.AuthTask{ public *;}
-keepclasseswithmembernames class * { # 保持 native 方法不被混淆
native;
}
-keepclasseswithmembers class * { # 保持自定义控件类不被混淆
public(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * { # 保持自定义控件类不被混淆
public(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers enum * { # 保持枚举 enum 类不被混淆
public static **[] values();
public static ** valueOf(java.lang.String);
}