为了防止代码被反编译,一般在签名导出前需要对代码进行混淆。最近发现自己的一个项目工程在代码混淆后,使用中出现了异常。以下是自己这几天在解决代码混淆以及引入第三方jar包导致混淆出现的问题处理的一些心得:

1.需要做混淆保护的内容:

(1.一般四大组件都会默认不被混淆

(2.自定义组件的类也要设置为不被混淆,否则找不到控件,例如:

1
2
3
-keep public class rongqin.musicplayer.view.LrcView
-keep public class com.viewpagerindicator.TitlePageIndicator
-keep public class com.viewpagerindicator.LinePageIndicator

(3.被调用的第三方jar包的类等

2.找到混淆后编译异常问题所在的类

代码混淆后,类名就都被改变了。以下是自己摸索的一种比较笨的快速确认异常类的方法。

(1 首先根据异常信息,可以知道异常出现在 com.a.a.c.a这个文件夹里

这些类文件都在反编译后的classes.dex.dex2jar.jar文件里。

(2 将eclipse的项目视图切换为package presentation -> Hierarchical,切换后就可以看到工程的目录结构了。

(3 然后就可以根据比照大概的目录结构去找到对应的类了。

比如com.a.a.c.a这个类,自己的工程包名都是rongqin,com包是导入的第三方jar包的包名,根据com.a.a目录下有abcd四个文件夹加上一堆class,比照后就可以发现是gson这个jar包导致的问题。需要在proguard-project.txt中对gson类进行代码混淆保护。

找到文件夹后,如果目录里包含多个class文件,则还需要确定混淆后的class对应于哪个类。这时可以通过项目里的proguard目录下的mapping文件去查找每个class的混淆对应关系,从而确认到出异常的class。

3.对gson类防代码混淆的处理

使用gson类需要在proguard-project对gson类进行代码混淆的保护,防止被混淆。可以直接在proguard-project中加上下面的语句:

1
2
3
4
5
6
7
8
9
10
##---------------Begin: proguard configuration for Gson ----------
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.** { *; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { *; }
##---------------End: proguard configuration for Gson ----------

参考资料:http://stackoverflow.com/questions/8129040/proguard-missing-type-parameter

另外,因为使用gson类在解析json时,对应的类型key变量名需要与json文件里的一致,所有这部分的class也要进行防混淆保护。例如:

1
2
3
4
5
6
7
8
-keep public class rongqin.util.SongJson
-keep public class rongqin.util.SongJson.** { *; }
-keepclassmembers class rongqin.util.SongJson {
   public *;
}
-keepclasseswithmembernames class rongqin.util.SongJson {
public *;
}

至此,算是终于大功告成,不再弹出异常了。可能还有更有效的办法,希望高人赐教,多多交流。

其他笔记:

1.Eclipse打包Android项目时用到proguard.cfg后,出现的Warning:can't find referenced class问题的解决方案

找不到引用的这个类是第三方包里面的,很多时候我们只需要打乱自己的代码就行了,第三方包的代码就是否要打乱就不要管了。

我们可以使用
-dontwarn com.xx.bbb.**
-keep class com.xx.bbb.** { *;}
参数来保持第三方库中的类而不乱,-dontwarn和-keep 结合使用,意思是保持com.xx.bbb.**这个包里面的所有类和所有方法而不混淆,接着还叫ProGuard不要警告找不到com.xx.bbb.**这个包里面的类的相关引用。

2.如何通过代码风格实现更好的混淆效果

Proguard对一般用途来说足够了,但是也需要注意一些程序风格,增强proguard的效果:

1. 特定类的public函数不做实际的事情,只做简单处理后调用private函数。proguard对会对一些特定类的public函数不做混淆,以便被AndroidManifest.xml和各种layout引用。
2. 会被AndroidMinifest.xml和layout引用的类放在浅层的包中,需要隐藏的类放在较深处,以便proguard混淆包名带来好处。如果一个包中有需要不混淆的内容,则整个包名都不会被混淆。
3. 将函数根据功能分细切短也会有些益处。

如果隐藏代码的要求比较高,还是用native好了。

本文转自 glblong 51CTO博客,原文链接:http://blog.51cto.com/glblong/1264660,如需转载请自行联系原作者

Android笔记:防反编译、代码混淆中,解决第三方jar包不被混淆的一些心得,及gson防混淆方法...相关推荐

  1. 在maven项目中解决第三方jar包依赖的问题

    在maven项目中解决第三方jar包依赖的问题 参考文章: (1)在maven项目中解决第三方jar包依赖的问题 (2)https://www.cnblogs.com/nuccch/p/6122938 ...

  2. Android Studio 在项目中引用第三方jar包

    在Android Studio项目中引用第三方jar包的方法: 步骤: 1.在build.gradle文件中添加如下代码: 备注:要添加在Android作用域下 sourceSets {main {j ...

  3. 关于如何正确地在android项目中添加第三方jar包

                  在android项目中添加第三方jar包虽然不是一个很复杂的问题,但是确实给很多开发者带来了不小的困扰.我自己就曾经碰到过calss not found exception ...

  4. android 工程中引入第三方JAR包后安装APK时老是提示找不到库文件?

    网上查都说是通过添加中Build Path或者使用User library来添加,我不知道这些复杂粘贴的人测试过没,反正我测试了好久都不行,估计是我RP不行,这样添加到后编译会通过,但运行的时候就会提 ...

  5. maven 项目中引入第三方jar包的方法

    说明:这里说的第三方jar包是指maven库中没有改jar包,但是你的项目是maven项目,需要引入该jar包 1 将jar包放入项目的libs(我的路径是/Users/ma/workspace/bi ...

  6. android 混淆过滤,android studio 代码混淆如何忽略第三方jar包

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 最近在打包混淆时,遇到一个问题,混淆编译都不出错,运行出错,一般遇到这种问题,肯定是在运行的地方有代码被混淆了,经过错误 ...

  7. android源码编译jar,在android源码编译中导入第三方jar包

    源码编译,我们可以只留下app的src,res目录和androidmanifest.xml文件,在app的根目录添加一个android.mk文件,还有我们需要导入的jar包,我这里是libjsoup- ...

  8. Android中引入第三方Jar包的方法(java.lang.NoClassDefFoundError)

    1.在工程下新建lib文件夹,将需要的第三方包拷贝进来. 2.将引用的第三方包,添加进工作的build path. 3.(关键的一步)将lib设为源文件夹. 在/libs 文件夹上右键--Build ...

  9. commons-pool2-2.3 jar包_[漏洞复现]FastJson 1.2.61远程代码执行漏洞(From第三方jar包)

    前言 最近FastJson更新了黑名单,升级到了1.2.61版本,我尝试bypass其黑名单,在AutType打开的情况下成功绕过了黑名单防护.(目前暂未修复,官方即将更新) 复现环境准备 1.JDK ...

最新文章

  1. 围绕云计算 虚拟化技术又呈现新面貌
  2. HashSet的使用
  3. 接口测试 -- 关闭 requests 打开的 file
  4. python【数据结构与算法】Floyd算法模拟
  5. freebsd ports安装mysql_FreeBSD Ports 方式安装MySQL及注意事项
  6. 160个Crackme023
  7. 实验详解——DNS网关服务器的分离解析
  8. SAP CRM BSPWDApplication.do
  9. python模块import具体用法
  10. 高效测试必学 | 用pytest生成测试报告
  11. C标准中的转义字符以及ASC码表
  12. 在C语言中使用中文,本地化全攻略
  13. Linux I/O编程
  14. 天耀18期 – 03.Java基本语法【作业】.
  15. Android下载保存gif图片
  16. python爬虫需要cookie_python爬虫(六) Cookie
  17. 恒大研究院|中国最具发展潜力的100个城市
  18. 计算机科学时间长被拒,计算机科学与探索外审一般多长时间 - 论文投稿 - 小木虫 - 学术 科研 互动社区...
  19. 虚拟化服务器怎么升级,巧借虚拟化实现服务器升级改造
  20. ios 点生成线路 百度地图_百度地图iOS SDK

热门文章

  1. 特征值与特征向量的几何含义(转)
  2. 理解并取证:广域网上的PPP协议
  3. WIN7上VM中的LINUX如何设置上网
  4. opensuse download
  5. gentoo linux mldonkey 问题解决
  6. Foxmail自动收取新邮件
  7. Windows 2003不同域之间迁移密码方法笔记截图
  8. matlab 查看函数属性,matlab – 使用FFT属性查找2D函数的导数
  9. Kali Linux下运行Sniffjoke出错的解决
  10. php 字节输出,PHP输出字节流带上BOM