Android代码混淆需要知道以及注意的事情
2015-06-10 12:24
686 查看
自古英雄不问出处,奈何我却不是英雄!
转载请标明出处:/article/11256595.html
以前项目中没有做过代码混淆,近期公司项目被安全测试机构检测出安全问题,结果第一个就是混淆问题,木有办法,只有混淆了。没有做过混淆真是一头雾水,前前后后搞了三天,想想也是喝多了。
说道混淆,就要提一下为什么混淆。如果不加混淆分分钟把你代码反编译出来。至于有什么影响我这里就不说了,既然你们看到这篇文章那么你们就是出现各自的问题了。
要注意的是不同的版本,不同IDE之间是有一些不同的。Eclipse中老版本的ADT里面是proguard.cfg,然后在defult.properties加入proguard.config=proguard.cfg。defult.properties文件是这样的
新版ADT没有了proguard.cfg而是换成了project.properties和proguard-project.txt。其实没啥区别在project.properties加入proguard.config=proguard-project.txt。就可以了。proguard-project.txt文件是这样的。
这里要知道一个地方proguard.cfg是可以直接拿过来当proguard-project.txt用的。
新版ADT没下面说一下android studio的使用,到了android studio中又有了不同这回没有了proguard-project.txt变成了proguard-rules.txt其实就是名字变了而已。用法一样。不同的是studio中没有了eclipse里面的project.properties或者defult.properties。而是换成了build.gradle。build.gradle中有这么一段。只要把minifyEnabled
后面的false改为true就会执行混淆代码了。
说完了两个IDE已经不同版本之间的不同再来说一下混淆代码时候一些注意的地方
1、android studio下 jar问题
我想你应该见过下面的代码。需要知道的是这个在android studio中是不能用的如果你加了这个在编译的时候会出现
> java.io.IOException: The same input jar [D:\xx\app\libs\xx.jar] is specified twice.(我就不翻译了)在eclipse是不会有问题了
2、javabean解析为null
如果你的项目中用到了Gson。并且你的程序在混淆之后运行后发现获取了数据,但是在看解析成Gson的时候都是null,那么你就要加上下面的代码。这里要注意最后一行。这个是你javabean对象的路径
3、微信分享问题
微信的分享或者支付相当很多程序都有接入。很多第三方sdk为了在项目混淆的时候避免自己的sdk出现问题,在开发后台会提醒开发者在混淆的时候加上自己提供的一些-keep代码。来确保混淆的时候sdk不被混淆。如果你加上下面这段代码那么蛋疼的时候就来了,我看很多开发者因为这是在网上直接说微信分享就是垃圾。微信提供的是这句。
4、自定View问题
(这个问题我网上没看到和我相似情况的帖子)如果你项目中有自定义的View,那么要保持自定义View不被混淆。一般情况下网上的混淆帖子都会给出下面三个代码段中的后两个。但是我加上后两个之后仍然会出错,后来我又加上了第一个才解决了问题
如果你的项目中有webView页面比且需要和android交互的话,要注意加上下面的代码。如果不加在webView页面调用android代码会不起作用。下面代码用通配符的目的是解决如果一个项目中有多个webView页面的情况
这是我在项目中遇到的一些问题,感觉这些问题听普遍的,所以写了出来,希望能帮到也在做混淆的你们。以后这篇文章还会更新。
转载请标明出处:/article/11256595.html
以前项目中没有做过代码混淆,近期公司项目被安全测试机构检测出安全问题,结果第一个就是混淆问题,木有办法,只有混淆了。没有做过混淆真是一头雾水,前前后后搞了三天,想想也是喝多了。
说道混淆,就要提一下为什么混淆。如果不加混淆分分钟把你代码反编译出来。至于有什么影响我这里就不说了,既然你们看到这篇文章那么你们就是出现各自的问题了。
要注意的是不同的版本,不同IDE之间是有一些不同的。Eclipse中老版本的ADT里面是proguard.cfg,然后在defult.properties加入proguard.config=proguard.cfg。defult.properties文件是这样的
# This file is automatically generated by Android Tools. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! # # This file must be checked in Version Control Systems. # # To customize properties used by the Ant build system use, # "build.properties", and override values to adapt the script to your # project structure. # Project target. target=android-19 proguard.config=proguard.cfg
新版ADT没有了proguard.cfg而是换成了project.properties和proguard-project.txt。其实没啥区别在project.properties加入proguard.config=proguard-project.txt。就可以了。proguard-project.txt文件是这样的。
这里要知道一个地方proguard.cfg是可以直接拿过来当proguard-project.txt用的。
# This file is automatically generated by Android Tools. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! # # This file must be checked in Version Control Systems. # # To customize properties used by the Ant build system edit # "ant.properties", and override values to adapt the script to your # project structure. # # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): # proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt # Project target. target=android-19 proguard.config=proguard-project.txt
新版ADT没下面说一下android studio的使用,到了android studio中又有了不同这回没有了proguard-project.txt变成了proguard-rules.txt其实就是名字变了而已。用法一样。不同的是studio中没有了eclipse里面的project.properties或者defult.properties。而是换成了build.gradle。build.gradle中有这么一段。只要把minifyEnabled
后面的false改为true就会执行混淆代码了。
buildTypes { release { // minifyEnabled为true会执行proguard-rules.txt混淆代码 minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } }
说完了两个IDE已经不同版本之间的不同再来说一下混淆代码时候一些注意的地方
1、android studio下 jar问题
我想你应该见过下面的代码。需要知道的是这个在android studio中是不能用的如果你加了这个在编译的时候会出现
> java.io.IOException: The same input jar [D:\xx\app\libs\xx.jar] is specified twice.(我就不翻译了)在eclipse是不会有问题了
-libraryjars libs/alipaysdk.jar -libraryjars libs/alipaysecsdk.jar -libraryjars libs/alipayutdid.jar -libraryjars libs/android-support-v4-21.jar
2、javabean解析为null
如果你的项目中用到了Gson。并且你的程序在混淆之后运行后发现获取了数据,但是在看解析成Gson的时候都是null,那么你就要加上下面的代码。这里要注意最后一行。这个是你javabean对象的路径
-keepattributes Signature -keep class sun.misc.Unsafe { *; } -keep class com.google.gson.** { *; } -keep class com.xx.xx.**{ *; }
3、微信分享问题
微信的分享或者支付相当很多程序都有接入。很多第三方sdk为了在项目混淆的时候避免自己的sdk出现问题,在开发后台会提醒开发者在混淆的时候加上自己提供的一些-keep代码。来确保混淆的时候sdk不被混淆。如果你加上下面这段代码那么蛋疼的时候就来了,我看很多开发者因为这是在网上直接说微信分享就是垃圾。微信提供的是这句。
-keep class com.tencent.mm.sdk.openapi.WXMediaMessage {*;} -keep class com.tencent.mm.sdk.openapi.** implements com.tencent.mm.sdk.openapi.WXMediaMessage$IMediaObject {*;}谁会想到微信官方提供的竟然不能用。因为这段代码是可以用的,不过要放到以前。微信后来更新了支付还有其他的功能之后,那么这个jar包结构就变了。我因此也是弄了半天,本来一个复制粘贴的时候搞的这么悲催换了谁都会怒一把。加上下面这两句代码就可以(不要问我为什么)
-dontwarn com.tencent.mm.** -keep class com.tencent.mm.**{*;}
4、自定View问题
(这个问题我网上没看到和我相似情况的帖子)如果你项目中有自定义的View,那么要保持自定义View不被混淆。一般情况下网上的混淆帖子都会给出下面三个代码段中的后两个。但是我加上后两个之后仍然会出错,后来我又加上了第一个才解决了问题
-keepclasseswithmembers class * { public <init>(android.content.Context); } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet, int); }5、webview与js交互,方法无法调用
如果你的项目中有webView页面比且需要和android交互的话,要注意加上下面的代码。如果不加在webView页面调用android代码会不起作用。下面代码用通配符的目的是解决如果一个项目中有多个webView页面的情况
-keepattributes *JavascriptInterface* -keepclassmembers class com.xx.activity.**$**{ //通配符标识的分别是activity的名字和类名 注意下面的事例 public *; }项目实例
/** * AndroidHtml 5J函数说明 () */ final class MaiLeGouApp { // MaiLeGouApp 就是第二个通配符 @JavascriptInterface public void XX(String xx, String xx) { } }
这是我在项目中遇到的一些问题,感觉这些问题听普遍的,所以写了出来,希望能帮到也在做混淆的你们。以后这篇文章还会更新。
相关文章推荐
- Android——Lrucache内存缓存技术核心代码分析
- 通过intent意向书打开特点的activity
- 用XMPP实现完整Android聊天项目
- onActivityResult() 和onResume()的调用顺序问题
- androidstudio配置jvm内存大小
- Android Canvas的save(),saveLayer()和restore()浅谈
- android上传图片、视频、文件,服务端使用wcf接收
- android 保持session
- (转)Android Superuser提权漏洞分析
- Android 中各种权限深入体验及详解
- Android调用另一个程序的方法
- Android中获取apk基本信息
- 修改Android启动画面
- android Dialog给Activity 传参
- 方块大动员登陆iOS和Android平台,扫码就可立即体验超流畅的俄罗斯方块手游
- adb logcat命令查看并过滤android输出log
- androidの亮屏,灭屏,解锁广播使用
- Axure画Android原型
- eclipse查看Android系统源代码
- Android动画机制全解析