Android-自定义插件---彻底解决method-not-found-问题,android音视频开发方向

基础库在迭代升级的时候 很可能要对某些方法进行修改,比如修改方法的返回值 ,修改方法的参数,甚至于要删除方法等等,但是如果你碰到上述的场景就要小心了,因为很多业务仓 依赖的还是老版本的基础库,他们运行是正常的,而你的新版本的基础库版本号提高以后删除了某个方法,假设他们又用到了这个方法,那么实际运行的时候 就会报method not found的 错误了。

有人问 那你每次升级基础库的时候强制要求业务仓也跟着升级不就行了?当然是不行的。。。因为很多都是跨部门的业务,没有合理的理由 他们是不愿意 每次都跟着你的升级而升级的。 除非你告诉他们: 兄弟 你某个类的某个方法 我们这版本修改过了,你必须要升级一下,否则crash(method not found)

如何解决这个问题?

其实解决问题的思路 无非就是在编译的时候 拿到这些class的方法的信息,想办法分析分析 有哪些方法里面 某一行调用的某个方法已经不存在了。 显而易见的 我们首先要做的就是 拿到全部的class。 插件中 想拿到全部的class 很简单,主要注册一个transform就可以了,transform 的input 可以给出我们想要的全部class, 注意只要使用了transform 那么有input 就必须要有output,否则你的app 运行起来就会报class not found的错误了。

拿到这些class以后 问题就简单了,我们可以利用javassit 这个工具 来分析我们的class,然后用一个空的ExprEditor来触发一个异常, 只要报了异常就说明在classpool 里面 没有这个类 或者说有这个类 但是没有这个方法。

这里还要注意的就是,构建javassit的classpool的时候 一定要记得把android.jar 也加进去,否则会报很多android的系统方法找不到。 这里不同的project 使用的android sdk 版本都不同。所以我们还需要实现一个小功能 就是动态的获取android.jar的路径。

好了,实现该插件的思路和要点就阐述完毕了 下面直接上代码把

代码实现

动态获取 project下的android.jar的 路径(这里要感谢didi-booster给出的简洁实现 给我省了很多事);

import java.io.File
import java.io.FileNotFoundException
import java.util.Properties

private val HOME = System.getProperty(“user.home”)

private val CWD = System.getProperty(“user.dir”)

/**

  • 这个类主要用来取 当前工程的 android.jar 的 绝对路径
  • 因为不一样的人 不一样的操作系统 不一样的 project 他们的 android.jar 路径并不一样
  • 我们需要拿到这个路径 添加到classPath中 才可以对字节码做相关的操作 否则asm和 javassist 都有可能出问题

*/
class AndroidSdk {

companion object {

/**

  • 输入apiLevel 你就可以得到 你使用的 android.jar 的path了
  • @param apiLevel
  • @return
    */
    fun getAndroidJar(apiLevel: Int = findPlatform()): File {
    val jar = File(getLocation(), “platforms F i l e . s e p a r a t o r
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值