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
分享到:
相关推荐
新写的proguard代码混淆的文档 大家可以看看
Android 2_3 代码混淆proguard技术介绍 - Zy的技术心
Android Java代码混淆工具:ProGuard简介及使用.docx
其中包括第三方jar混淆报错及解决办法,以及普通的代码混淆办法,相信能给你帮助
如何混淆Android项目代码(ProGuard)防止反编译.rar
ProGuard是一个SourceForge上非常知名的开源项目。...为了很好的保护Java源代码,我们往往会对编译好的class文件进行混淆处理。ProGuard的主要作用就是混淆。当然它还能对字节码进行缩减体积、优化等。
介绍了Android代码混淆的三种方法及可能出现的问题.通过jocky或proguard实现jar包混淆;通过proguard实现Android项目整体导出混淆。并总结了一些容易出现的问题
高版本Android项目下的proguard-project.txt,里边包含了常规混淆,以及防止第三方混淆的代码。
proguard混淆器可以对多种平台的JAVA源代码进行混淆,增加反编译代价。proguard混淆器是开源的软件,压缩包内含全部最新版源代码。压缩包根目录下有我修改的安卓JAVA项目混淆配置文件,proguard自带的混淆配置文件在...
解决android中混淆代码签名导出报错的proguard.cfg 第三方jar包,可类似 -libraryjars libs/android-support-v4.jar 添加在文件中
本篇文章主要介绍了Android代码混淆的写法总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
什么是代码混淆: Android SDK 自带了混淆工具Proguard。它位于SDK根目录\tools\proguard下面。如果开启了混淆,Proguard默认情况下会对所有代码,包括第三方包都进行混淆,可是有些代码或者第三方包是不能混淆的,...
android java代码混淆器·点击bin目录下的proguardgui.bat进行使用·
java代码混淆工具,配置灵活,易用,适用于android平台和其他java平台
得到别人写的AndroidStudio插件,先放着http://www.cnblogs.com/common1140/p/5569934.html 安装完成之后,在顶部Edit的第一个选项就是了
看了好多博客论坛对proguard混淆android/java代码的介绍,自己用起来总出错。现总结具体用法步骤,并亲测无误,其中不乏参考之处还请见谅!
Java字节码的开源优化器 ProGuard是最受欢迎的Java字节码优化...ProGuard代码本身受版权保护,并根据GNU通用公共许可证(GPL)第2版的条款进行分发。用户手册也受版权保护,只能以原始形式与未修改的代码一起重新分发。
Android proguard4.5.1 代码混淆
代码混淆—关于android被反编译的两种解决方案,使用方法参见我的博文:http://blog.csdn.net/online1989/article/details/7058743
Android代码混淆 1.什么是代码混淆: Android SDK 自带了混淆工具Proguard。它位于SDK根目录\tools\proguard下面。如果开启了混淆, Proguard默认情况下会对所有代码,包括第三方包都进行混淆,可是有些代码或者第三...