首页 > 系统 > Android > 正文

在Android Studio中的混淆debug与release

2019-11-09 15:46:45
字体:
来源:转载
供稿:网友

一.有关混淆:什么是代码混淆java是一种跨平台的、解释型语言,Java源代码编译成中间“字节码”存储于class文件中。由于跨平台的需要,Java字节码中包含了很多源代码信息,如变量名、方法名,并且通过这些名称来访问变量和方法,这些符号带有许多语义信息,很容易被反编译成Java源代码。为了防止这种现象,我们可以使用Java混淆器对Java字节码进行混淆。混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义。被混淆过的程序代码,仍然遵照原来的档案格式和指令集,执行结果也与混淆前一样,只是混淆器将代码中的所有变量、函数、类的名称变为简短的英文字母代号,在缺乏相应的函数名和程序注释的情况下,即使被反编译,也将难以阅读。同时混淆是不可逆的,在混淆的过程中一些不影响正常运行的信息将永久丢失,这些信息的丢失使程序变得更加难以理解。混淆器的作用不仅仅是保护代码,它也有精简编译后程序大小的作用。由于以上介绍的缩短变量和函数名以及丢失部分信息的原因,编译后jar文件体积大约能减少25%,这对当前费用较贵的无线网络传输是有一定意义的。

二.在Android Studio中混淆做以下总结:

首先,需要在app/PRoguard-rules.pro文件中,添加混淆文件;

然后,在build.gradle中去开启混淆:
buildTypes {          debug {              //启用代码混淆              minifyEnabled true              //混淆规则配置文件              proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'              //              signingConfig signingConfigs.debug          }          release {              //是否优化zip              zipAlignEnabled true              // 移除无用的resource文件              shrinkResources true              //启用代码混淆              minifyEnabled true              //混淆规则配置文件              proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'              //              signingConfig signingConfigs.release          }      }

三.混淆模版:

-optimizationpasses 5          # 指定代码的压缩级别-dontusemixedcaseclassnames   # 是否使用大小写混合-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    # 保持哪些类不被混淆# 保留support下的所有类及其内部类-keep class android.support.** {*;}	# 保留R下面的资源-keep class **.R$* {*;}-keepclasseswithmembernames class * {  # 保持 native 方法不被混淆    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 * {     # 保持枚举 enum 类不被混淆    public static **[] values();    public static ** valueOf(java.lang.String);}-keep class * implements android.os.Parcelable { # 保持 Parcelable 不被混淆    public static final android.os.Parcelable$Creator *;}-dontwarn android.net.**  #忽略某个包的警告-keep class android.net.SSLCertificateSocketFactory{*;}-keepattributes *Annotation*-keep class xx   #保持自己定义的类不被混淆(如json,model,webview等等)#第三方依赖库不被混淆(部分)(对于引用第三方库的情况,可以采用下面方式避免打包出错:  -dontwarn com.xx.yy.**      -keep class com.xx.yy.** { *;}《参数来保持第三方库中的类而不乱,-dontwarn和-keep 结合使用,意思是保持com.xx.yy.**这个包里面的所有类和所有方法而不混淆,接着还叫ProGuard不要警告找不到com.xx.yy.**这个包里面的类的相关引用。》)#Gson#如果有用到Gson解析包的,直接添加下面这几行就能成功混淆,不然会报错。-keepattributes Signature# Gson specific classes-keep class sun.misc.Unsafe { *; }# Application classes that will be serialized/deserialized over Gson-keep class com.google.gson.** { *; }-keep class com.google.gson.stream.** { *; }#高德定位-dontwarn com.amap.api.**-keep class com.amap.api.** {*;}#Fresco-dontwarn com.facebook.**-keep class com.facebook.** {*;}#科大讯飞-dontwarn com.iflytek.**-keep class com.iflytek.** {*;}四.在混淆过程中出现的问题:混淆release打包后,运行出现crach,并报错:
java.lang.SecurityException: Permission Denial: get/set setting for user asks to run as user -2 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL                                                    at com.android.server.am.ActivityManagerService.handleIncomingUser(ActivityManagerService.java:13175)                                                    at android.app.ActivityManager.handleIncomingUser(ActivityManager.java:2044)                                                    at com.android.providers.settings.SettingsProvider.callFromPackage(SettingsProvider.java:615)                                                    at android.content.ContentProvider$Transport.call(ContentProvider.java:279)                                                    at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:273)                                                    at android.os.Binder.execTransact(Binder.java:388)                                                    at dalvik.system.NativeStart.run(Native Method)百度这个问题许久都没有得出解决办法,后来在同学的帮助下给出思路,先在debug模式下混淆运行,看看有问题否,能不能成功。

结果按此方法,在运行下发现问题,去除错误的混淆,解决掉问题,最终混淆release打包成功。

注意:混淆出错80%是因为你混淆了不该混淆的类!!


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表