您当前的位置: 首页 >  android
  • 0浏览

    0关注

    674博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Android混淆需要keep的情况

沙漠一只雕得儿得儿 发布时间:2019-02-19 20:05:46 ,浏览量:0

不需要混淆的场景如下,否则会出现运行错误:

1.如果使用了Gson之类的工具要使JavaBean类即实体类不被混淆。

2.如果使用了自定义控件那么要保证它们不参与混淆。

3.如果使用了枚举要保证枚举不被混淆。

4.对第三方库中的类不进行混淆

5.如果使用了Gson之类的工具要保证实体类不被混淆

6.如果使用了自定义控件那就需要保证它们不参与混淆

7.第三方库中的类不进行混淆

8.代码中使用了反射,需要保证该反射类类名方法不变

9.继承了Serializable接口的类不混淆

10.在引用第三方库的时候,一般会标明库的混淆规则的,建议在使用的时候就把混淆规则添加上去,免得到最后才去找

11.有用到 WebView 的 JS 调用也需要保证写的接口方法不混淆

12.Parcelable 的子类和 Creator 静态成员变量不混淆,否则会产生 Android.os.BadParcelableException 异常

13.Android四大组件和Application最好也不要混淆

ProGuard默认会对第三方库也进行混淆的,而第三方库有的已经混淆过了,有的使用了Java反射技术,所以我们在进行代码混淆的时候要排除这些第三方库。排除对第三方库的混淆需要在混淆规则文件(通常是:proguard-project.txt或proguard.cfg或proguard-rules.pro或proguard-rules.txt也可以是其它的文件名只要在配置文件中将含有混淆规则的文件名配置进去就行了)中添加如下规则:

  • 具体需要保留keep的场景:

参考:https://www.cnblogs.com/cr330326/p/5534915.html

# 保留所有的本地native方法不被混淆
-keepclasseswithmembernames class * {
    native ;
}
 
# 保留了继承自Activity、Application这些类的子类
# 因为这些子类,都有可能被外部调用a
# 比如说,第一行就保证了所有Activity的子类不要被混淆
-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 * extends android.view.View
-keep public class com.android.vending.licensing.ILicensingService
 
# 如果有引用android-support-v4.jar包,可以添加下面这行
-keep public class com.xxxx.app.ui.fragment.** {*;}
 
# 保留在Activity中的方法参数是view的方法,
# 从而我们在layout里面编写onClick就不会被影响
-keepclassmembers class * extends android.app.Activity {
    public void *(android.view.View);
}
 
# 枚举类不能被混淆
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
 
# 保留自定义控件(继承自View)不被混淆
-keep public class * extends android.view.View {
    *** get*();
    void set*(***);
    public (android.content.Context);
    public (android.content.Context, android.util.AttributeSet);
    public (android.content.Context, android.util.AttributeSet, int);
}
 
# 保留Parcelable序列化的类不被混淆
-keep class * implements android.os.Parcelable {
    public static final android.os.Parcelable$Creator *;
}
 
# 保留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();
}
 
# 对于R(资源)下的所有类及其方法,都不能被混淆
-keep class **.R$* {
    *;
}
 
# 对于带有回调函数onXXEvent的,不能被混淆
-keepclassmembers class * {
    void *(**On*Event);
}
ProGuard的输出文件说明

混淆后,会在 /build/outputs/mapping/release(or debug)/目录下输出下面的文件

dump.txt 说明 APK 中所有类文件的内部结构。

mapping.txt 提供原始与混淆过的类、方法和字段名称之间的转换。

seeds.txt 列出未进行混淆的类和成员。

usage.txt 列出从 APK 移除的代码。

当我们需要处理crash log的时候,就可以通过mapping.txt的映射关系找到对应的类,方法,字段等。

mapping.txt的映射关系找到对应的类,方法,字段方法如下: sdk\tools\proguard\bin 目录下有个retrace工具可以将混淆后的报错堆栈解码成正常的类名window下为retrace.bat,linux和mac为retrace.sh,

使用方法如下:

  1. 将crash log保存为yourfilename.txt

  2. 拿到版本发布时生成的mapping.txt

  3. 执行命令retrace.bat -verbose mapping.txt yourfilename.txt

所以我们每次打包版本都需要保存最新的mapping.txt文件。如果要使用到第三方的crash统计平台,比如bugly,还需要我们上传APP版本对应的mapping.txt.每次都要保存最新的mapping文件,那不就很麻烦?放心,gradle会帮到你,只需要在bulid.gradle加入下面的一句。每次我们编译的时候,都会自动帮你保存mapping文件到本地的。

android {
applicationVariants.all { variant ->
        variant.outputs.each { output ->
            if (variant.getBuildType().isMinifyEnabled()) {
                variant.assemble.doLast{
                        copy {
                            from variant.mappingFile
                            into "${projectDir}/mappings"
                            rename { String fileName ->
                                "mapping-${variant.name}.txt"
                            }
                        }
                }
            }
        }
        ......
    }
}
参考:

https://juejin.im/post/5a5c08ca6fb9a01ca47a7834https://juejin.im/entry/5a4adacb51882538fe632107

比较有价值的相关文章整理:

https://medium.com/androiddevelopers/troubleshooting-proguard-issues-on-android-bce9de4f8a74 对应的译文:

https://juejin.im/post/5a5c08ca6fb9a01ca47a7834

Proguard用户手册:

https://www.guardsquare.com/en/products/proguard/manual/troubleshooting

配置学习:

https://juejin.im/entry/5a4adacb51882538fe632107

https://www.cnblogs.com/cr330326/p/5534915.html

http://www.imgeek.org/article/825308232

关注
打赏
1657159701
查看更多评论
立即登录/注册

微信扫码登录

0.4487s