ProGuard

关于Android Studio的Gradle 系列文章

shwenzhang/AndResGuard
Android混淆打包攻略,同微信级别操作

ProGuard 的输出文件及用处

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

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

分别有以下文件:

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

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

Proguard 一些其它问题

开启 代码混淆

1
2
3
release {
minifyEnabled true
}

后报以下错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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)
Caused 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 文件下添加如下代码解决错误:

1
2
3
-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. fastjson等JSON解析框架所生成的对象类,加入下面的混淆规则即可.假设com.coam.bean包下所有的类都是 JSON 解析生成对象的类

1
2
3
4
-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.**{*;}
文章目录
  1. 1. ProGuard 的输出文件及用处
  2. 2. Proguard 一些其它问题