关闭

Android中jsoup的混淆规则

标签: androidjsoupjsoup混淆jsoup网络爬虫
2278人阅读 评论(5) 收藏 举报
分类:

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包图:
jsoup.jar

根据上面的异常信息和包中的资源文件entities-xxx.properties判断下,大概加载资源文件的代码应该在Entities.class中吧,于是我们打开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

1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Android代码混淆之混淆规则

因为Android是使用Java开发的,所以开发者可以使用ProGuard对代码进行混淆。SDK已经集成了ProGuard工具,开发者可以从SDK目录下的\tools\proguard目录中进行查看。...
  • sxl403
  • sxl403
  • 2015-11-16 11:33
  • 2112

Android代码混淆之混淆规则

因为Android是使用Java开发的,所以开发者可以使用ProGuard对代码进行混淆。SDK已经集成了ProGuard工具,开发者可以从SDK目录下的\tools\proguard目录中进行查看。...
  • fengyuzhengfan
  • fengyuzhengfan
  • 2015-02-18 14:51
  • 35691

一个cnbeta的Android客户端源代码 (包含jsoup的jar包)

  • 2012-03-24 23:17
  • 615KB
  • 下载

Android实战——jsoup实现网络爬虫,糗事百科项目的起步

  • 2017-02-12 23:17
  • 1KB
  • 下载

Android混淆规则

# If your project uses WebView with JS, uncomment the following # and specify the fully qualified cl...
  • Nature_Day
  • Nature_Day
  • 2016-05-31 15:03
  • 4134

Android_Jsoup网页爬虫案例

  • 2014-03-06 17:20
  • 835KB
  • 下载

android Jsoup Demo

  • 2016-04-29 15:45
  • 2.93MB
  • 下载

在android中使用jsoup解析页面链接

  • 2011-03-14 10:25
  • 135KB
  • 下载

【Android+OkHttp3+Jsoup】 模拟登录教务系统 抓取课表和成绩

  • 2016-10-12 22:36
  • 10.83MB
  • 下载

【Android+OkHttp3+Jsoup】 模拟登录教务系统 抓取课表和成绩(Eclipse版)

  • 2016-10-17 21:20
  • 2.06MB
  • 下载
    个人资料
    • 访问:1610715次
    • 积分:6528
    • 等级:
    • 排名:第4285名
    • 原创:52篇
    • 转载:0篇
    • 译文:1篇
    • 评论:1275条
    我的微信公众号
    欢迎关注我的公众号,不定期为您推送优选博文,生活趣事!
    关注我的微信公众号

    关注我的微博
    友情链接


    我的Github

    QQ交流群 547839514

    博客专栏