ProGuard 代码混淆

Summary: Author: 张亚飞 | 阅读时间: 2 minute read | Published: 2018-09-26
Filed under Categories: LinuxTags: Note,

Reference:

ProGuard 的输出文件及用处

混淆之后,会给我们输出一些文件,在 gradle 方式下是在 /build/proguard/ 目录下,ant 是在 /bin/proguard 目录,eclipse 构建在 /proguard 目录像.

C:\Users\yafei\DevelopWorkspace\StudioProjects\ShangYun\app\build\outputs\mapping\dev\release

分别有以下文件:

  • dump.txt 描述apk文件中所有类文件间的内部结构.
  • mapping.txt 列出了原始的类,方法,和字段名与混淆后代码之间的映射.
  • seeds.txt 列出了未被混淆的类和成员
  • usage.txt 列出了从apk中删除的代码

当我们发布的 release 版本的程序出现 bug 时,可以通过以上文件(特别时 mapping.txt)文件找到错误原始的位置,进行 bug 修改.同时,可能一开始的 proguard 配置有错误,也可以通过错误日志,根据这些文件,找到哪些文件不应该混淆,从而修改 proguard 的配置.

Proguard 一些其它问题

开启代码混淆

release {
    minifyEnabled true
}

后报以下错误:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.coam.shangyun/com.coam.ui.menu.activity.CommonServiceCircleActivity}: android.view.InflateException: Binary XML file line #77: Error inflating class android.support.v7.widget.RecyclerView
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2201)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2250)
    at android.app.ActivityThread.access$800(ActivityThread.java:141)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1213)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5065)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
    at dalvik.system.NativeStart.main(Native Method)
Ca.used by: android.view.InflateException: Binary XML file line #77: Error inflating class android.support.v7.widget.RecyclerView
    at android.view.LayoutInflater.createView(LayoutInflater.java:623)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:699)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:495)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:400)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
    at android.support.v7.app.AppCompatDelegateImplV7.a(Unknown Source)
    at android.support.v7.app.AppCompatActivity.setContentView(Unknown Source)
    at com.coam.ui.menu.activity.CommonServiceCircleActivity.onCreate(Unknown Source)
    at android.app.Activity.performCreate(Activity.java:5249)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2165)
    ... 11 more

proguard-rules.pro 文件下添加如下代码解决错误:

-keep public class * extends android.support.v7.widget.RecyclerView$LayoutManager {
    public <init>(...);
}

参考 Error inflating class android.support.design.widget.NavigationView in v23.1.0 if I use Proguard

注意,使用 GSON. fastjsonJSON 解析框架所生成的对象类,加入下面的混淆规则即可.假设 com.coam.bean 包下所有的类都是 JSON 解析生成对象的类

-keep class com.coam.bean.**{*;}//不混淆所有的com.clock.bean包下的类和这些类的所有成员变量
-keep class com.coam.bean.CloudUploadState{*;} // 在其他类中继承的类对象 CloudStorageUploadState 也要禁止代码混淆,否则解析数据失败
-keep class com.coam.api.bean.**{*;}
-keep class com.coam.api.model.**{*;}

Comments

Cor-Ethan, the beverage → www.iirii.com