您的位置:首页 > 移动开发 > Android开发

Android APK混淆编译出现的问题

2014-04-26 17:09 381 查看
首先我现在使用的是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 ,这句话是去除

apk运行时产生的警告导致程序异常终止,这是代码混淆造成的。
不混淆一下四个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.** { *; } 纠结啊,我都准备放弃了,最后还是弄出来了。哈哈。不知道大家有没有看懂,反正我是懂了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: