Android中jsoup的混淆规则【转】
Android中jsoup的混淆规则
版权声明:转载必须注明本文转自严振杰的博客:http://blog.yanzhenjie.com
说实话这篇文章的标题和内容我觉得很水,所以读者们要是也觉得这篇文章很水的话,你顺着网线来打我啊。哈哈,不开个玩笑这文章都没法继续往下写了。
这段时间每天工作到22点下班回家,到家后基本就23点了,周六周日也是一样的,所以Github上的项目有严重bug会在中午休息的时候抽时间修复,博客基本处于断更状态。不过庆幸的是昨晚已经把项目写完了,安排周一上线,今儿个是周日,终于可以休息了,也顺便把昨晚发现的一个关于jsoup的问题记录一下。
发现问题
项目中使用了jsoup来分析html文档,一切都很顺利,但是在代码混淆后在某些手机上却发生了异常导致App崩溃。于是赶紧搜索了jsoup的混淆规则,发现千篇一律的规则是:
-dontwarn org.jsoup.**
-keep class org.jsoup.**{*;}
1
2
这样的混淆规则不用试就知道肯定是可以解决问题的,但是把相当于把部分代码暴露了出去,于是我抓了下崩溃日志,最主要的地方如下:
Caused by: java.lang.ExceptionInInitializerError
at org.a.c.f$a.<init>(SourceFile:372)
at org.a.c.f.<init>(SourceFile:19)
at org.a.d.m.b(SourceFile:32)
at org.a.d.m.a(SourceFile:42)
at org.a.d.b.a(SourceFile:56)
at org.a.d.g.ay(SourceFile:100)
at org.a.a.hm(SourceFile:58)
Caused by: java.lang.IllegalStateException:
Could not read resource entities-xhtml.properties.
Make sure you copy resources for org.a.c.i
at org.a.c.i.a(SourceFile:301)
at org.a.c.i.b(SourceFile:25)
at org.a.c.i$b.<init>(SourceFile:53)
at org.a.c.i$b.<clinit>(SourceFile:34)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
通过下面这句话可以判断是jsoup抛出的异常没跑了:
Caused by: java.lang.ExceptionInInitializerError
at org.a.c.f$a.<init>(SourceFile:372)
1
2
然后目光迅速被吸引到这句话:
Could not read resource entities-xhtml.properties
1
哦这下明白了,原来是某个类中读取了entities-xhtml.properties资源文件,混淆之后读不出来了。凭经验来分析一下,假如有一个类叫A,那么java中读取资源文件我们一般是:
A.class.getResourceAsStream("fileName");
1
而class.getResourceAsStream(String)会指定要加载的资源路径与当前类所在包的路径一致。例如我们写了一个A类在包com.yanzhenjie.test下,那么A.class.getResourceAsStream("fileName") 会在com.yanzhenjie.test包下查找相应的资源。如果这个fileName是以/开头的,那么就会从classpath的根路径下开始查找。
注:此资源非彼资源文件,只涉猎Android开发的同学不要把这个资源文件和Android中/res下的资源文件混淆,不是同一个东西。
所以现在问题基本上已经浮出水面了,做了代码混淆之后,由于规则外的class文件和路径全部被混淆,而资源文件的路径不会被混淆,打包成apk后,class文件在apk/classes.dex中,classes.dex反编译成jar文件,jar文件再解压后class文件的路径会变成a.b.c.className,而资源文件在/apk/packageName下,它们的路径因为没有混淆还是com.yanzhenjie.test.fileName。因此class文件的路径是a.b.c.className,而资源文件的路径是com.yanzhenjie.test.fileName所以class.getResourceAsStream(String)会加载不到资源文件,剩下的就是看源码找出资源文件和class所在包并添加混淆规则了。
java包图:
根据上面的异常信息和包中的资源文件entities-xxx.properties判断下,大概加载资源文件的代码应该在Entities.class中吧,于是我们打开Entities.class文件,果然发现了报异常的代码:
再往下翻一点就可以看到一个枚举类,我们知道枚举相当于是常量。所以下图中类Entities被load的时候枚举EscapeMode的几个成员值就要初始化了,初始化即走自己的构造方法,在构造方法中又调用了上图中加载资源文件的代码:
因为我们发现问题是我们混淆了Entities.class所在包名导致的异常,所以我们只要保证这个包名不被混淆即可。
解决方案
最开始说的比较通用的混淆规则肯定是可以解决问题的:
-dontwarn org.jsoup.**
-keep class org.jsoup.**{*;}
1
2
但是这相当于没有混淆jsoup了,这里我们可以维持包名不混淆即可解决问题,我们只需要为jsoup添加如下混淆规则即可:
-keeppackagenames org.jsoup.nodes
1
我这样写可以解决我遇到的这个问题,如果其它人还遇到其它问题,可以在博客下方留言,我会给出解决方案。本文结束,一边带孩子一边写博客,写完了专心哄孩子去了,白白。
————————————————
版权声明:本文为CSDN博主「严振杰」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yanzhenjie1003/article/details/78384725
Android中jsoup的混淆规则【转】的更多相关文章
- Android中使用proguardgui混淆jar包
本文章的前提条件是,读者已经掌握了正确导出jar包的技能. 1.拷贝Android项目中"proguard.cfg"文件到你指定的位置,并改名为"proguard.pro ...
- Android中使用progurad混淆代码
第一步,取消project.properties中关于progurad的注释,开启progurad,默认的配置文件会被加载进来. proguard.config=${sdk.dir}/tools/pr ...
- Android 代码混淆规则
1. Proguard介绍 Android SDK自带了混淆工具Proguard.它位于SDK根目录toolsproguard下面.ProGuard是一个免费的Java类文件收缩,优化,混淆和预校验器 ...
- android中SELINUX规则分析和语法简介【转】
本文转载自:https://blog.csdn.net/LoongEmbedded/article/details/62430039 1. SELINUX是可以理解为一种Android上面的安全机制, ...
- android中SELINUX规则分析和语法简介
1. SELINUX是可以理解为一种android上面的安全机制,是有美国国家安全局和一些公司设计的一个针对linux的安全加强系统我们可以通过配置SELINUX的相关policy,来定制自己的手机的 ...
- Android中利用jsoup解析html页面
学习jsoup :jsoup学习网站 Android 中使用: 添加依赖 implementation 'org.jsoup:jsoup:1.10.1' 直接上代码: package com.load ...
- Android Studio实现代码混淆
1,在build.grandle添加,其中规则写在proguard-rules.pro中,也可以自定义一个文件,将其代替,比如eclipse常用的 proguard-project.txt: bui ...
- [转]Android Studio实现代码混淆
1,在build.grandle添加,其中规则写在proguard-rules.pro中,也可以自定义一个文件,将其代替,比如eclipse常用的 proguard-project.txt: bui ...
- Android studio打包APK混淆配置
要在打包APK时加入混淆需要在Module中的buid.gradle中加入如下信息 buildTypes { release { minifyEnabled true shrinkResources ...
随机推荐
- 关于视频解码总结--JavaCV
关于视频解码的所收集资料进行总结 前言:内容不全,但有一定参考性! 关于java后台视频解码 进行js将视频每秒或更低裁截传输,后台使用最优方案(自己感觉): JavaCV(点击进入) 缺点:整合工具 ...
- Android Exception Hook
承接上一篇文章Android Inline Hook,接下来我们看一下android系统中基于异常的hook方式,这种方式与inline hook相比实现较为简单,但执行效率是它的短板. except ...
- C++(四十)— C++中一个class类对象占用多少内字节
一个空的class在内存中多少字节?如果加入一个成员函数后是多大?这个成员函数存储在内存中什么部分? 一个Class对象需要占用多大的内存空间.最权威的结论是: 非静态成员变量总合. 加上编译器为了C ...
- MySQL事件自动kill运行时间超时的SQL
delimiter $create event my_long_running_trx_monitoron schedule every 1 minutestarts '2015-09-15 11:0 ...
- redis 设置密码并运行外部连接
redis默认是不能远程访问的,如果希望多台机子共用redis数据库,那就需要开启redis远程连接访问.既然可以远程连接了,那就需要密码登陆,否则不安全.下面是具体的方法,按照步骤一步一步来就OK了 ...
- [转]Serverless实践
转载的,原文: https://www.cnblogs.com/middleware/p/9470533.html ------------------------------------------ ...
- UVA1660 电视网络 Cable TV Network[拆点+最小割]
题意翻译 题目大意: 给定一个n(n <= 50)个点的无向图,求它的点联通度.即最少删除多少个点,使得图不连通. 解析 网络瘤拆点最小割. 定理 最大流\(=\)最小割 感性地理解(口胡)一下 ...
- 大数据之路week07--day06 (Sqoop 将关系数据库(oracle、mysql、postgresql等)数据与hadoop数据进行转换的工具)
为了方便后面的学习,在学习Hive的过程中先学习一个工具,那就是Sqoop,你会往后机会发现sqoop是我们在学习大数据框架的最简单的框架了. Sqoop是一个用来将Hadoop和关系型数据库中的数据 ...
- 复杂Java对象所占内存的大小
我们在Java单个对象内存布局中讲解了单个简单的Java对象所占内存的大小的计算.那么这篇文章主要是讲解复杂Java对象所占内存大小的计算,我们把继承.复合的对象称为复杂对象 继承对象 class P ...
- Tomcat默认连接超时时间
秒=1小时 2. 在web.xml中通过参数指定: xml 代码 <session-config> <session-timeout>30</sessio ...