首先我现在使用的是Android4.0以上的版本,不过网上说的基本上都是Android2.3版本的Android的Apk混淆编译。
今天下午弄了两个小时终于弄好了,之间出现各种问题,纠结。
在看下面问题之前首先贴出我混淆成功编译之后的截图,给大家看看效果:
反编译之后,基本上都看不出来。
我是用这个软件查看混淆编译之后的代码的,你也可以通过结合dex2.jar和jd-jui工具查看。
首先打开sdk下的tools目录找到proguard文件夹.
然后找到proguard-android.txt这个文件.
打开之后,在最后面添加如下代码:
-ignorewarnings
-keep class android.support.v4.** {*;}
-keep class org.json.** {*;}
-keep class cn.sharesdk.** {*;}
-keep class com.sina.**{*;}
-keepattributes Signature
-keep class com.google.gson.stream.** { *; }
-keep class com.example.datamodel.** { *; }
也可以直接放在progurad-project.txt你们看下面的那个红线上方的那句,proguard-android.txt:proguard-project.txt
也就是说两个文件里面随便写哪个都一样。但是建议写在progurad-project.txt里面因为每个工程配置的信息都不一样。不建议在proguard-android.txt 。
同时你的Android应用工程目录下的project.properties文件里面的一句话的注释去掉:
OK!我的配置结束!
但是还是要结束下刚刚那个在proguard-android.txt里面配置的信息
-ignorewarnings ,这句话是去除
不混淆一下四个jar文件 是第三方类库。
-keep class android.support.v4.** {*;} -->V4包
-keep class org.json.** {*;} -->JSON解析用到
-keep class cn.sharesdk.** {*;} -->分享时用到
-keep class com.sina.**{*;} --->新浪授权时用到
另外一下这三句是防止混淆之后和GSON解析和实体类映射出现错误。
-keepattributes Signature
-keep class com.google.gson.stream.** { *; }
-keep class com.example.datamodel.** { *; } --->注意:这个必须是你实体类即javabean的完整包名路径.
通过以上几点就可以顺利通过混淆了。
=========================出现问题的解释======================================
问题1:Android4.0没有proguard.cfg怎么办?
其实在Android4.0之后google官方就不在帮你集成那个配置了。我在网上得到的解释是progurad.cfg已经被项目应用目录中proguard-project.txt替换掉了。所以我们可以使用proguard-project.txt这个文件。
问题2:在混淆编译的时候出现java.lang.RuntimeException: Missing type parameter.的错误
里面有错误提示是google gson包混淆出现了问题。
然后我在progurad-android.txt文件中加入了
-dontobfuscate
-dontoptimize
这两句话,程序可以运行了。但是代码没有被混淆。也就是说这两句话是强制所有的代码不混淆。这下我可郁闷了。
然后又试了这个,在网上搜到了如下:
-keepattributes Signature
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.examples.android.model.** { *; }
然后也能运行,但是一运行 到由Gson解析的数据的时候,将json解析以后放到javabean中去的,但是一直出问题,放进去的字符串是对的,解析出来的javabean却是空,我勒个去。。。然后登陆啊,评论啊,广告轮换啊都失效了。。。。
然后我有看到一个童鞋的解释原来是google官方给出解释的时候。是在它自己的类中写的model。你们看-keep class com.google.gson.examples.android.model.** { *; }
这行是什么????就是这行的问题。因为Gson和javaBean被混淆之后之间的映射出现了问题。我们应该保持model层不被混淆。这样就可以解决问题了。
我的model所在的路径是:com.example.datamodel.** { *; } ,所以我们应该这样写-keep class com.example.datamodel.** { *; } 纠结啊,我都准备放弃了,最后还是弄出来了。哈哈。不知道大家有没有看懂,反正我是懂了。