带你开发一款给Apk中自动注入代码工具icodetools 完善篇

本文介绍了如何优化Apk自动注入代码工具icodetools,解决方法数超限、一键化功能完善及日志过滤规则等问题。通过抽取打印日志的工具类,解决方法数超限,实现一键自动化处理,包括解压apk、添加日志、重新签名等步骤。此外,添加了日志过滤规则,控制日志输出。案例中展示了对大型应用如直播软件和微信的实践,证明工具的有效性和实用性。
摘要由CSDN通过智能技术生成

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

一、前言

在前面已经介绍完了 自动给apk中注入日志代码工具icodetools原理了,在那里我们曾经说过其实离真正的可使用价值有点距离,本篇就对这个工具进行一些优化,让其真正意义上开始能工作量产。当时在前面一篇文章中说到遗留的三个主要问题:

第一个问题:对每个类中都添加一个静态打印方法堆栈信息的方法,这样会导致有些应用的dex过大,方法数超了问题

第二个问题:在从输入一个apk到给每个类中的每个方法添加日志代码然后在签名输出最终的apk,这个过程其实很多步,但是我们之前都是手动的去进行操作,非常麻烦,所以这里还得解决一键化问题

第三个问题:在实际演练中会发现一些大型的app调用的方法特别多,导致咋们打印的日志信息过多霸屏,很难定位到我们真正想要的那个方法,而且打印日志调用次数过多会导致应用出现无响应状态。所以这里得做一个开关和过滤规则

只有解决了这三个问题咋们才算是真正意义上的自动化工具,可以经历各种app的考验。


二、方法数超了问题修复

我们可以使用在前一篇讲解原理的文章中的步骤来进行,用一个比较庞大的企业应用做案例,结果在使用dx将添加日志代码之后的jar文件转化成dex文件的时候出现报错了:


看到这个我们就猜到了,我们添加日志代码之后的jar中方法数超过了,原因其实很简单,因为我们之前的添加日志操作是在每个类中添加一个静态打印日志的方法,那么如果对于一个dex文件中有很多类,那么就添加了很多相同的打印方法,方法数超了是有可能的。那么如何解决这个问题呢?其实方案有两个:

第一个方案:因为方法数超了,每个类都被添加了一个打印堆栈日志的方法,咋们可以不用这个方法,把这个方法的代码直接拷贝到原来类中的每个方法前。但是这样会带来一个问题,如果一个类中的方法很多,那么就会增加非常多的同样代码。最后使用dx转化的时候会发现也是报错的。所以该方案不可行。

第二个方案:因为方法数超了,所以那个打印堆栈的方法肯定不能要了,但是又不能把代码都塞到每个方法的前面,那么正常的编码习惯是可以把这个打印方法抽取出来放到一个工具类中。从这里可以看到这个方案是靠谱的。一个应用中只有这么一个工具类,而且这个工具类包含了打印堆栈信息的方法,那么总体来看方法数是没多大变化的,只是多了一个工具类。


有了方案,咋们就得实现了,但是这个实现还是有点曲折的,因为从方案2来看,我们需要给dex中添加一个工具类了,但是我们在前一篇文章中了解到,可以通过ClassVisitor类操作dex中的每个类信息,通过MethodVisitor类操作dex中每个类的每个方法,但是没有途径可以添加一个类的。所以咋们得另想办法了。

我们现在能够往dex中塞入一个类有两个方案:

第一个方案:非常清楚dex文件格式之后,可以去手动的添加类信息到dex中。但是这个方案我只是敢想一想,实践的话我就算了,很简单因为我怕麻烦!

第二个方案:可以利用jar工具,在我们把利用dex2jar把dex添加代码变成jar文件之后,我们可以把jar文件解压,然后再把我们需要插入的类放到这个解压目录下,最后再用jar命令生成jar文件。最终在使用dx命令生成dex文件。这个方案有点复杂,但是靠谱好操作呀。现在看着有点复杂,但是下面会详细介绍一个一键化工具,到时候都不用你来操作,何谈复杂了。但是可惜的是,这个方案有一个缺点,就是解压过程中,Windows平台是不区分文件名的大小写的,但是如果原来jar中的包名中有两个类名是大小写的,那么解压到本地的时候会出错的。比如一个包里面有A.class和a.class文件,解压到本地前者会被后者覆盖,而且这个方案有点繁琐了。

第三个方案:可以直接把编译之后的classes文件塞到jar文件中。有了这个方案,实现比较简单了。


注意:

1、这里我们自己定义的类文件一定要注意,首先这个类的包名一定要具有自己的唯一性,千万不可与原来jar中的类重名了,要想做到完全唯一是不可能了。但是我们可以弄一个奇葩的包名和类名就可以了。这里我用的名称是:

cn.wjdiankong.jw.utils.JWUtils这个名称了。现阶段应该不会有重复。


代码比较简单,咋们直接来看看即可:


这里直接借助ZipEntry类进行添加一个文件到jar文件中即可,但是在添加的时候一定要注意ZipEntry的名称必须是类的全路径名称,我们是从工具命令外部传入获取到的类名:



下面咋们我们在每个类的每个方法之前调用这么一行代码即可:JWUtils.printStackTrace("jw");,而这段代码对应的asm代码为:



上面操作完成之后,就可以运行一下程序了,前提是你得先准备一个需要插入的类JWUtils


首先默认情况下我们必须得准备一个cn.wjdiankong.jw.utils.JWUtils类,而且类中有一个打印堆栈的方法:

public static void printStackTrace(String tag){....},然后编译获取到JWUtils.class文件放到指定工具根目录下即可。当成功的把JWUtils.class文件塞入到jar文件中之后就可以直接使用dx命令进行转化成dex了,这里有可能会遇到这个错误:


这个错误原因是因为我用JDK1.8编译了JWUtils.java文件,而dx工具不兼容这个JDK版本,所以可以使用1

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值