Android混淆注意事项

    xiaoxiao2021-04-18  57

    1、四大组件默认不进行混淆也不能进行混淆,因为发包时清单文件中内容不会改动,混淆后便找不到对应的组件 2、每个module的 proguard-rules.pro作用于该module,引用不继承混淆规则 3、 混淆规则每个module都有两个,一个是sdk默认提供的,一个是自己书写的,sdk的位于sdk目录下的\tools\proguard中的proguard-android.txt 4、sdk提供的混淆规则有:

    #不使用混合大小写的类名 -dontusemixedcaseclassnames #不去忽略非公共的库类 -dontskipnonpubliclibraryclasses #混淆时是否记录日志 -verbose #默认关闭优化。 Dex不喜欢通过ProGuard运行的代码优化和预验证步骤(并自行执行其中一些优化)。 -dontoptimize #不预校验 -dontpreverify #假如项目中有用到注解,应加入这行配置 -keepattributes *Annotation* #特定的类 -keep public class com.google.vending.licensing.ILicensingService -keep public class com.android.vending.licensing.ILicensingService #native方法不混淆 -keepclasseswithmembernames class * { native <methods>; } #在view中保留get和set方法以便动画可以正常运行 -keepclassmembers public class * extends android.view.View { void set*(***); *** get*(); } #以便正常反射在xml中设置的onClickWe -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } #保持枚举 enum 不被混淆 -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } #保持 Parcelable 不被混淆(aidl文件不能去混淆) -keepclassmembers class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator CREATOR; } #保持R文件中的静态变量不被混淆,否则,你的反射是获取不到资源id的 -keepclassmembers class **.R$* { public static <fields>; } #不需要提醒这个肯定安全(文档就是这么说的) -dontwarn android.support.** # Understand the @Keep support annotation. -keep class android.support.annotation.Keep -keep @android.support.annotation.Keep class * {*;} -keepclasseswithmembers class * { @android.support.annotation.Keep <methods>; } -keepclasseswithmembers class * { @android.support.annotation.Keep <fields>; } -keepclasseswithmembers class * { @android.support.annotation.Keep <init>(...); }

    5、引入的第三方jar包中的代码不是我们的目标和关心的对象,所以可以忽略不用进行混淆,例如: 便可以

    #声明lib文件 -libraryjars libs/libammsdk.jar #不提示警告 -dontwarn com.tencent.mm.opensdk.** #不进行混淆 -keep com.tencent.mm.opensdk.** { *;}

    6、用于json转换的实体类的变量名称不能进行混淆,例如:

    #转换JSON的JavaBean,类成员名称保护,使其不被混淆 -keepclassmembernames class org.zero.commontemplate.common.model.** { *; }

    7、此外还有一些通用的(后续遇到会更新):

    #通用 -keepnames class * implements java.io.Serializable #需要序列化和反序列化的类不能被混淆(注:Java反射用到的类也不能被混淆) -keepattributes Signature #过滤泛型(不写可能会出现类型转换错误,一般情况把这个加上就是了) -keepattributes *Annotation* #假如项目中有用到注解,应加入这行配置 -keep class **.Webview2JsInterface { *; } #保护WebView对HTML页面的API不被混淆 -keepclassmembers class * extends android.webkit.WebViewClient { #如果你的项目中用到了webview的复杂操作 ,最好加入 public void *(android.webkit.WebView,java.lang.String,android.graphics.Bitmap); public boolean *(android.webkit.WebView,java.lang.String); } -keepclassmembers class * extends android.webkit.WebChromeClient { #如果你的项目中用到了webview的复杂操作 ,最好加入 public void *(android.webkit.WebView,java.lang.String); } #对WebView的简单说明下:经过实战检验,做腾讯QQ登录,如果引用他们提供的jar,若不加防止WebChromeClient混淆的代码,oauth认证无法回调,反编译基代码后可看到他们有用到WebChromeClient,加入此代码即可。

    8、混淆成功后在app/build/output/mapping下可以找到dump.txt、mapping.txt、seeds.txt、usage.txt四个文件,dump.txt中记录所有类文件间的内部结构,mapping.txt中列出了原始的类、方法、变量名与混淆后的映射对应关系,这张表每次发布线上包要保存下来,以便线上出bug后能从混淆后的类、方法中倒推出原始的类、方法,seeds.txt列出了未被混淆的类、方法,usage.txt中列出了从apk中删除的代码

    转载请注明原文地址: https://ju.6miu.com/read-675409.html

    最新回复(0)