Android应用的Java代码,通过反编译apk文件(dex2jar、apktool)很容易得到源代码,所以在release版本的apk中一定要混淆一下一些关键的Java源码。

ProGuard是一个开源的Java代码混淆器(obfuscation)。ADT r8开始它被默认集成到了Android SDK中。

官网:http://proguard.sourceforge.net/

它具有以下功能:
  • 压缩 - 移除无效的类、属性、方法等
  • 优化 - 优化bytecode移除没用的结构
  • 混淆 - 把类名、属性名、方法名替换为晦涩难懂的1到2个字母的名字
当然它也只能混淆Java代码,Android工程中Native代码,资源文件(图片、xml),它是无法混淆的。而且对于Java的常量值也是无法混淆的,所以不要使用常量定义平文的密码等重要信息。

不是所有的Java类都可以被混淆的,比如:
  • (1) AndroidManifest.xml引用的类Activity/Service
  • (2) JNI调用的方法
  • (3) 动态调用的方法或者成员变量
  • (4) WebView中JavaScript调用的方法
  • (5) Layout布局使用的View构造函数、android:onClick等
如果不确定哪些需要手动配置,可以以默认的配置build,当运行中发现ClassNotFoundException异常时,即可找到哪个类不该被混淆。

(一)开启ProGuard
使用Android Studio新建Android工程之后,在工程的根目录下(<project_root>\app)自动生成了以下两个文件:
引用 build.gradle
proguard-rules.pro

默认build.gradle文件里关于proguard的配置是关闭的(minifyEnabled)。
引用 android {
...

buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
}

方法getDefaultProguardFile('proguard-android.txt')获取Android SDK默认的ProGuard 设置:%SDK_HOME%\tools\proguard\proguard-android.txt

系统默认的配置已经涵盖了许多通用的细节,如果需要额外的配置,可以添加在 proguard-rules.pro 文件中。

对于基于Ant的Eclipse ADT稍有不同!
  • ADT r13之前:default.properties、proguard.cfg
  • ADT r14 ~ r16 :「project.properties、proguard.cfg
  • ADT r17之后:project.properties、proguard-project.txt

(二)配置ProGuard规则

1)类

不混淆某个类
引用 -keep public class com.rensanning.example.Test
不混淆某个包所有的类
引用 -keep class com.rensanning.example.*
不混淆某个类的子类
引用 -keep public class * extends com.rensanning.example.Test
不混淆某个接口的实现
引用 -keep class * implementscom.rensanning.example.TestInterface {
public static final com.rensanning.example.TestInterface$Creator *;
}

2)方法

不混淆某个类的构造方法
引用 -keepclassmembers class
com.rensanning.example.Test {
public <init>(int,int);
}
不混淆某个类的特定的方法
引用 -keepclassmembers class
com.rensanning.example.Test {
public void setTestString(java.lang.String);
}

3)第三方包
-libraryjars ./libs/android-support-v4.jar #声明lib文件
-dontwarn android.support.v4.**{*;} #不提示警告
-keep class android.support.v4.**{*;} #不进行混淆
-keep interface android.support.v4.**{*;}

(三)ProGuard命令一览
  • optimizationpasses
  • dontoptimize
  • dontusemixedcaseclassnames
  • dontskipnonpubliclibraryclasses
  • dontpreverify
  • dontwarn
  • verbose
  • optimizations
  • keep
  • keepnames
  • keepclassmembers
  • keepclassmembernames
  • keepclasseswithmembers
  • keepclasseswithmembernames

(四)ProGuard中间文件
开启ProGuard,Android工程被Build后,会生成以下文件:<project_root>\app\build\outputs\mapping\release

1)dump.txt
apk文件中所有类的构成一览
2)mapping.txt
记录了混淆后的名字与混淆前的名字的对应关系,每一次混淆结果和映射关系都不一样。
当遇到Bug是,查看到的堆信息,要和混淆前的源码关联起来,所以管理这个文件很重要。
retrace.bat -verbose mapping.txt stacktrace.txt
引用 com.rensanning.example.androidsample.User -> com.rensanning.example.androidsample.g:
java.lang.String name -> a
java.lang.String hometown -> b
java.util.ArrayList getUsers() -> a
3)seeds.txt
未被混淆的类和方法一览
4)usage.txt
记录了从apk文件中删掉的代码。这个文件一定要认真确认,是否这些代码真的是多余的。

(五)不要混淆的内容

1)四大组件
引用 -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 com.android.vending.licensing.ILicensingService

2)自定义组件
引用 -keep public class * extends android.support.v4.app.Fragment
-keep public class * extends android.app.Dialog
-keep public class * extends android.view

3)第三方库
引用 -libraryjars libs/roboguice-2.0.jar
-dontwarn roboguice.**

参考:
http://developer.android.com/tools/help/proguard.html
http://segmentfault.com/a/1190000002910305
http://www.andr0o0id.com/?p=5340

更多相关文章

  1. Android通过url下载文件到手机本地
  2. 烧板子流程
  3. Android(安卓)Camera子系统之进程/文件View
  4. android中pull解析xml和生成xml
  5. android中使用SAX和DOM以及Pull对xml文件进行解析
  6. Android(安卓)开发(04)高级UI组件
  7. EditText背景 光标 下划线颜色
  8. 2.7-2 Android(安卓)studio gradle 文件 配置完整版
  9. Android(安卓)Studio 自带模拟器获取root权限

随机推荐

  1. android音乐播放器Media
  2. 自定义的跑马灯控件
  3. Android跟随手指运动的小球 …
  4. Mediastreamer2
  5. 滴滴插件化框架学习笔记之virtualapk-gra
  6. 自定义Android(安卓)ORM 框架greenDAO数
  7. Android(安卓)Annotations 仿微博Tabbar
  8. 语音识别(加注释)
  9. MQTT客户端移植Android
  10. 简单封装HttpUrlConnection异步请求