android studio 配置代码混淆规则

对于现在稍微大型点的app都有一定的安全措施。比如采用https替换http,请求参数签名,加密.敏感数据jni方式保存.另外就是防止反编码提高安全度减小apk大小的代码混淆,今天我主要讲解下android studio  代码混淆配置规则:

1.对于每个独立的applicationid(理解不同app)要配置代码混淆都要在优先在其对应的app  gradle下配置以下属性:

minifyEnabled true//开启混淆
shrinkResources true//打开资源压缩
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//混淆配置文件,as默认自动生成了
signingConfig signingConfigs.release

minifyEnabled 为true的时候就表示开启混淆了,代码混淆的配置规则就在proguard-rules.pro文件下。首先说明一点:默认情况下as自动生成了proguard-rules.pro文件,如果你在gradle里设置了minifyEnabled true并且proguard-rules.pro里面你未添加任何配置,这时候你运行项目你会发现进入界面就自动闪退.因为你开启混淆了,但是有的第三方sdk类,或者四大组件,反射等是不能混淆的运行时系统找不到某些类所以会闪退.

shrinkResources 未true表示压缩资源文件,也可以理解为删除无用资源,一般情况我们都将其与minifyEnabled 配合使用

2.配置proguard-rules.pro文件

对于分moudle开发的项目或者没有分的我们一般只需要在app模块对应的proguard-rules.pro文件进行配置

代码混淆基本规则:

指定压缩级别
-optimizationpasses 5

#不跳过非公共的库的类成员
-dontskipnonpubliclibraryclassmembers
# 不做预校验,preverify是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。
-dontpreverify

#混淆时采用的算法
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

#把混淆类中的方法名也混淆了
-useuniqueclassmembernames
# 保留Annotation不混淆 这在JSON实体映射时非常重要,比如fastJson
-keepattributes *Annotation*,InnerClasses
#优化时允许访问并修改有修饰符的类和类的成员
-allowaccessmodification
# 列出从apk中删除的代码
-printusage unused.txt
#忽略警告
-ignorewarnings
#保留行号
-keepattributes SourceFile,LineNumberTable
#保持泛型
-keepattributes Signature
# 移除Log类打印各个等级日志的代码,打正式包的时候可以做为禁log使用,这里可以作为禁止log打印的功能使用
# 记得proguard-android.txt中一定不要加-dontoptimize才起作用
# 另外的一种实现方案是通过BuildConfig.DEBUG的变量来控制
-assumenosideeffects class android.util.Log {
    public static int v(...);
    public static int i(...);
    public static int w(...);
    public static int d(...);
    public static int e(...);
}

#保持所有实现 Serializable 接口的类成员
-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}
#四大组件相关不能混淆
-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.view.View
#
#----------------------------- (项目中没有可以忽略) -----------------------------
#
#webView需要进行特殊处理
-keepclassmembers class fqcn.of.javascript.interface.for.Webview {
   public *;
}
-keepclassmembers class * extends android.webkit.WebViewClient {
    public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
    public boolean *(android.webkit.WebView, java.lang.String);
}
-keepclassmembers class * extends android.webkit.WebViewClient {
    public void *(android.webkit.WebView, jav.lang.String);
}
#在app中与HTML5的JavaScript的交互进行特殊处理
#我们需要确保这些js要调用的原生方法不能够被混淆,于是我们需要做如下处理:
-keepclassmembers class com.ljd.example.JSInterface {
    ;
}
#百度地图
-keep class vi.com.**{*;}
-keep class com.baidu.** {*;}
-keep class vi.com.gdi.bgl.**{*;}
-keep class mapsdkvi.com.** {*;}
#native方法不被混淆
-keepclasseswithmembernames class * {
    native ;
}
#环信
-keep class com.hyphenate.**{*;}
-dontwarn com.hyphenate.**
-keep class com.superrtc.** {*;}
#一些实体类不混淆
-keep class com.cdxt.doctor.base.lib.SweetAlert.* {*;}
-keep class com.cdxt.doctor.base.model.** {*;}
-keep class com.cdxt.doctor.base.net.** {*;}
-keep class com.cdxt.doctor.base.param.** {*;}
-keep class com.cdxt.doctor.base.router.** {*;}

总之一般来说我们除了配置基本规则,就是项目中引用的第三方包,特别是第三方sdk这些混淆配置都是根据对应第三方文档要求复制过来的.

 

你可能感兴趣的:(android)