Android中jsoup的混淆规则
Android中jsoup的混淆规则
版权声明:转载必须注明本文转自严振杰的博客:http://blog.yanzhenjie.com
说实话这篇文章的标题和内容我觉得很水,所以读者们要是也觉得这篇文章很水的话,你顺着网线来打我啊。哈哈,不开个玩笑这文章都没法继续往下写了。
这段时间每天工作到22点下班回家,到家后基本就23点了,周六周日也是一样的,所以Github上的项目有严重bug会在中午休息的时候抽时间修复,博客基本处于断更状态。不过庆幸的是昨晚已经把项目写完了,安排周一上线,今儿个是周日,终于可以休息了,也顺便把昨晚发现的一个关于jsoup的问题记录一下。
发现问题
项目中使用了jsoup来分析html文档,一切都很顺利,但是在代码混淆后在某些手机上却发生了异常导致App崩溃。于是赶紧搜索了jsoup的混淆规则,发现千篇一律的规则是:
-dontwarn org.jsoup.**
-keep class org.jsoup.**{*;}
这样的混淆规则不用试就知道肯定是可以解决问题的,但是把相当于把部分代码暴露了出去,于是我抓了下崩溃日志,最主要的地方如下:
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)
通过下面这句话可以判断是jsoup抛出的异常没跑了:
Caused by: java.lang.ExceptionInInitializerError
at org.a.c.f$a.<init>(SourceFile:372)
然后目光迅速被吸引到这句话:
Could not read resource entities-xhtml.properties
哦这下明白了,原来是某个类中读取了entities-xhtml.properties
资源文件,混淆之后读不出来了。凭经验来分析一下,假如有一个类叫A,那么java中读取资源文件我们一般是:
A.class.getResourceAsStream("fileName");
而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.**{*;}
但是这相当于没有混淆jsoup了,这里我们可以维持包名不混淆即可解决问题,我们只需要为jsoup添加如下混淆规则即可:
-keeppackagenames org.jsoup.nodes
我这样写可以解决我遇到的这个问题,如果其它人还遇到其它问题,可以在博客下方留言,我会给出解决方案。本文结束,一边带孩子一边写博客,写完了专心哄孩子去了,白白。
版权声明:转载必须注明本文转自严振杰的博客:http://blog.yanzhenjie.com
Android中jsoup的混淆规则相关推荐
- android intent-filter作用,Android中Intent-Filter的匹配规则是什么
Android中Intent-Filter的匹配规则是什么 发布时间:2020-12-14 15:19:32 来源:亿速云 阅读:67 作者:Leah 今天就跟大家聊聊有关Android中Intent ...
- ant混淆编译java web,Android中使用ant混淆编译
搞了好几天,查看了上百个网站,最后摸索出一套很简单的ant混淆编译的方法.下面开始: 1.拿一个普通项目来说,首先为它加上ant编译功能. android update project --name ...
- 读懂Android中的代码混淆
本文为本人的一些实践总结,介绍一些混淆的知识和注意事项.希望可以帮助大家更好的学习和使用代码混淆. 什么是混淆 关于混淆维基百科上该词条的解释为 代码混淆(Obfuscated code)亦称花指令, ...
- 读懂 Android 中的代码混淆
在Android开发工作中,我们都或多或少接触过代码混淆.比如我们想要集成某个SDK,往往需要做一些排除混淆的操作. 本文为本人的一些实践总结,介绍一些混淆的知识和注意事项.希望可以帮助大家更好的学习 ...
- Android 中的代码混淆
在Android开发工作中,我们都或多或少接触过代码混淆.比如我们想要集成某个SDK,往往需要做一些排除混淆的操作. 本文为本人的一些实践总结,介绍一些混淆的知识和注意事项.希望可以帮助大家更好的学习 ...
- android混淆成不可见字符,读懂 Android 中的代码混淆
在Android开发工作中,我们都或多或少接触过代码混淆.比如我们想要集成某个SDK,往往需要做一些排除混淆的操作. 本文为本人的一些实践总结,介绍一些混淆的知识和注意事项.希望可以帮助大家更好的学习 ...
- Android 中MeasureSpec的创建规则
概述 在Android中,View的onMeasure()方法用来对控件进行测量,确定控件的宽高.该方法的两个参数widthMeasureSpec和heightMeasureSpec由父View计算后 ...
- Android混淆规则介绍
Android混淆规则介绍 写在前面的话 APP上线推广,免不得是需要混淆加固的,况且劳动成果不易又会有谁希望自己的APP被破解抄袭呢.鉴于此方显本片文章的通用型和重要意义. 混淆简介 Android ...
- Android--混淆配置(比较详细的混淆规则)
android studio自带java语言的ProGuard工具,主要用来压缩.优化.混淆,然后配合Gradle构建工具实现混淆. 在app module中统一配置混淆规则 我们可以直接在app m ...
最新文章
- 设置commit 提交模板
- Android中对Log日志文件的分析[转]
- python多项式运算_python – 用于计算“多项式系数”的numpy / scipy函数
- webpack相关配置
- 存储时间:从Symmetrix V-Max看高端存储的未来
- linux配置本地yum源 centos7.9为例
- figma下载_不用担心Figma中的间距
- P7854-「EZEC-9」GCD Tree【构造】
- [转载]LM算法的实现
- LabelImg 影像標註工具使用教學,製作深度學習用的資料集
- Java基础学习总结(185)—— Java 在云原生时代的进化
- CSS3背景图片百分比及应用
- 中绘制折线_统计图之折线图的结构和制作过程
- 关于跨域以及跨域的实现方式
- linux安装mysql phpmyadmin_如何在Linux下安装和配置PHPmyadmin?
- 视频压缩神器--小丸工具箱--小丸工具箱入门操作教程
- 计算机二级(C语言)备考
- 万物互联-stm32单片机简介、烧录、编程及其项目环境搭建
- windows bat批量创建文件夹与文件
- 解决Chrome 的右键谷歌网页翻译失效 20221107更新
热门文章
- Failed to transform file 'xxx' to match attributes 的解决办法
- 体验国际编程大赛(完成报名可抽奖)
- Alpha阶段敏捷冲刺⑤
- Matlab——彩色图像的拼接与裁剪
- 7个可以改变一生的自学网站,每天3小时,效果直线上升!
- 闲谈IPv6-IPv6地址聚类分配原则于源地址选择的关系
- 阿里云云服务器ECS选购指南及省钱法宝
- 【Nginx 源码学习】Nginx 的缓冲区
- php微信短网址生成,如何把微信文章网址长连接(长网址)转换为短连接(短网址)...
- java8新特性回顾(四)---并发增强之Striped64和longAdder