Android studio 代码混淆使用 —— ProGuard
来源:互联网 发布:magento block加载js 编辑:程序博客网 时间:2024/05/17 08:07
最近项目需要打包测试,想想上次打包测试已经是1年前了,这一年来需求换了好几版,app做了两个都没上线。这次终于要走到最后环节了。那么今天就来学习呀stuido代码混淆的一些知识。
- 项目从Eclipse中迁移过来的,两者混淆方案有什么异同
- 应该在那个文件中配置混淆规则
- 需要配置的内容有哪些
Eclipse代码混淆方法
我们先回顾下 Eclipse 中代码混淆的方法。参考链接
打开项目目录下的 project.properties 文件,解除以下代码的注释
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
编写
proguard-project.txt
文件添加自定义的混淆规则。
压缩代码和资源(谷歌官方介绍)
在网上搜索到一些资料后并没有达到自己想要的结果,于是试着Google官方Studio教程寻找答案先给出连接地址。谷歌官方部分中文版studio教程
以下是我自己看完的一些理解:
1 Google对于我们平时所说的代码混淆,更倾向于称作压缩代码+混淆代码。
代码压缩通过 ProGuard 提供,ProGuard 会检测和移除封装应用中未使用的类、字段、方法和属性,包括自带代码库中的未使用项(这使其成为以变通方式解决 64k 引用限制的有用工具)。ProGuard 还可优化字节码,移除未使用的代码指令,以及用短名称混淆其余的类、字段和方法。混淆过的代码可令您的 APK 难以被逆向工程,这在应用使用许可验证等安全敏感性功能时特别有用。
2 要启用通过 ProGuard 实现的代码压缩,请在项目主module下的build.gradle
文件相应的构建类型中添加 minifyEnabled true。
android { buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile(‘proguard-android.txt'), 'proguard-rules.pro' } } ...}
3 getDefaultProguardFile(‘proguard-android.txt')
方法可从Android SDK tools/proguard/
文件夹获取默认 ProGuard 设置。这一点与Eclipse混淆的时候一样,与Eclipse不同的是,studio的特殊混淆配置是proguard-rules.pro
文件中添加的,而不是在proguard-project.txt
中;这里注意两点:
studio工程下这个文件的名字可以更改,但是必须跟build.gradle中
proguardFiles getDefaultProguardFile(‘proguard-android.txt'),
加星号部分对应,否则会在打包的时候报错。
** proguard-rules.pro**如果你是从Eclipse中导入到stuido的项目,stuido默认会保留原
proguard-rules.txt
文件。在打包的时候并不会报错。但是有些混淆规则并没有应用。所以要手动将上述加星号的文件名改成proguard-rules.txt 即可。
4 以前没有注意构建完成后的build文件夹,其实每次打包完成后,studio会在<module-name>/build/outputs/mapping/release/
文件夹下生成4个文件,通过这四个文件可以检查混淆的执行情况。
dump.txt
说明 APK 中所有类文件的内部结构。
mapping.txt
提供原始与混淆过的类、方法和字段名称之间的转换。
seeds.txt
列出未进行混淆的类和成员。
usage.txt
列出从 APK 移除的代码。
这些文件保存在 /build/outputs/mapping/release/。
5 经过实际操作发现 studio的压缩方案比之前要优化很多,现在资源压缩可以压缩3M左右。我一个应用打包前有6M打包完了就剩3.4M了,好没成就感。写了一个月代码,就写了3.4M。
ProGuard基础语法和打包配置
同样为了弥补知识漏洞,特意从网上查了些混淆资料。其实这些并不需要记住。因为如果你引用第三方的库。他们会告诉你应该填写什么,但是既然为了学习还是熟悉一边比较好,免得看到一脸懵逼。参考链接,以下内容为连接作者所总结,我只是拿来作为二次查看所用,如有特殊要求,请联系连接作者。
- libraryjars class_path 应用的依赖包,如android-support-v4
- keep [,modifier,…] class_specification 不混淆某些类
- keepclassmembers [,modifier,…] class_specification 不混淆类的成员
- keepclasseswithmembers [,modifier,…] class_specification 不混淆类及其成员
- keepnames class_specification 不混淆类及其成员名
- keepclassmembernames class_specification 不混淆类的成员名
- keepclasseswithmembernames class_specification 不混淆类及其成员名
- assumenosideeffects class_specification 假设调用不产生任何影响,在proguard代码优化时会将该调用remove掉。如system.out.println和Log.v等等
- dontwarn [class_filter] 不提示warnning
具体内容可以参考上述链接,这里说一下常用的几个语法:
- 不混淆所有com.clock包下的类 :
-keep class 替换为包名全路径(如class com.tencent.mm.opensdk).**
- 不混淆某个类和成员变量自定义实体类需要配置该混淆规则
-keep class 实体类包名.**{*;}
-dontwarn 包名或类名
打包的时候不提示warnning 注意:有些warning会导致打包失败或者打包完成后不能正常安装,在正式上线前最好进行完整测试。可依据gradle console中所报错误手动配置解除需要解除警告的类。- 另外需要注意,proguard-android.txt文件已经为我们做了几件事情。
- 指定不混淆所有的JNI方法
- 所有View的子类及其子类的get、set方法都不进行混淆
- 不混淆Activity及其子类
- 不混淆Enum类型的指定方法
- 不混淆R类里及其所有内部static类中的所有static变量字段
- 不混淆Parcelable和它的子类,还有Creator成员变量
- 不提示兼容库的错误警告
代码混淆实战
- 配置开启混淆:
minifyEnabled true
buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release } }
配置
proguard-rules.pro
文件(此步骤需要根据项目情况配置)1.代码中使用了反射
-keepattributes Signature-keepattributes EnclosingMethod
2.不混淆自定义实体类
-keep class com.goldenalpha.stock.master.entities.** { *; }
3.用到了微信登录和分享,支付功能,依据官方文档添加以下混淆规则
-keep class com.tencent.mm.opensdk.** { *;}-keep class com.tencent.wxop.** { *;}-keep class com.tencent.mm.sdk.** { *;}
3.用到了支付宝支付功能,依据官方文档添加以下混淆规则
-libraryjars libs/alipaySDK-20170309.jar//这个日期要根据所引用的jar包来确定而且,如果gradle配置了依赖此jar,请注释或者清除改行。-keep class com.alipay.android.app.IAlixPay{*;}-keep class com.alipay.android.app.IAlixPay$Stub{*;}-keep class com.alipay.android.app.IRemoteServiceCallback{*;}-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}-keep class com.alipay.sdk.app.PayTask{ public *;}-keep class com.alipay.sdk.app.AuthTask{ public *;}
4.继承了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();}
5.引用了retrofit 依据官方文档配置混淆规则 这里注意需要加上okHttp和okio也许要配置上
-dontwarn com.squareup.okhttp.internal.http.*-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement-keepnames class com.levelup.http.okhttp.** { *; }-keepnames interface com.levelup.http.okhttp.** { *; }-keepnames class com.squareup.okhttp.** { *; }-keepnames interface com.squareup.okhttp.** { *; }-dontnote retrofit2.Platform-dontwarn retrofit2.Platform$Java8-keepattributes Signature-keepattributes Exceptions-dontwarn okio.**
6.引用了Glide图片加载库,配置Glide混淆规则
-keep public class * implements com.bumptech.glide.module.GlideModule-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { **[] $VALUES; public *;}# for DexGuard only-keepresourcexmlelements manifest/application/meta-data@value=GlideModule
7.保持4大组件和Application不被混淆
-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
以上就是目前项目中所应用的混淆规则,希望大家看完能对混淆有所了解,毕竟不常用。总结一下以备后续只需。
- Android studio 代码混淆使用 —— ProGuard
- Android 使用 ProGuard 混淆代码
- 使用proguard混淆android代码
- 使用proguard混淆android代码
- 使用proguard混淆android代码
- 使用proguard混淆android代码
- 使用ProGuard混淆Android代码
- Android Studio的Proguard(代码混淆)
- Gradle minifyEnabled 使用proguard混淆android代码 android studio 打jar包并混淆
- Android studio 混淆proguard
- 关于Android使用proguard进行代码混淆
- 关于Android使用proguard进行代码混淆
- 关于Android使用proguard进行代码混淆
- Android使用ProGuard进行代码混淆
- 关于Android使用proguard进行代码混淆
- android 代码混淆中ProGuard使用详情
- android 代码混淆proguard
- android 代码混淆proguard
- 初学java整理
- 求两单链表交点
- POJ 2010 Moo University
- 反射基础(一)
- 上传项目到GitHub时遇到的问题
- Android studio 代码混淆使用 —— ProGuard
- VS2015 快捷键
- 匿名内部类
- MySQL入门(创建数据库以及插入,修改,查询数据)
- React Native 使用原生 UI 组件
- C# 饿了么接口API完整Demo
- 虚拟本地python环境——virtualenv
- python 5
- SEAndroid策略