前言
项目最近适配了安卓10,而安卓10废弃了某些api,导致调用后就报错,比如:
val var5: TelephonyManager = getSystemService("phone") as TelephonyManager
var5.deviceId//导致崩溃
而项目中用的某个库会在某些情况下调用该代码(这个库比较重要,更换的话问题比较多,且提问题的话肯定就赶不上上线了),于是就想办法能不能修改jar包来规避该问题
然后试了下果然还是可以
前提
- 首先库是.jar或.aar的,不开源(开源的直接搞源码就行了,远程依赖一般开源,否则可以在缓存目录中找到对应的.jar或.aar)
- 三方项目管理者可能没工夫管或者项目上线比较急
- 一般情况下还是不推荐这样搞的
正文
- 在ide内找到出现问题的源码文件(通过报错堆栈或者debug)
- 在项目\app\src\main\java下新建一个和源码文件一样的包名目录
- 粘贴源码文件到该包名目录下
- 修改代码至不报错且不影响逻辑(可以打印日志看是否走到了你修改的文件中),并运行检查,直到没毛病
- 删除build文件夹,并重新运行
- 然后打开资源管理器,在build文件夹中找到生成的class, 目录:项目或module根目录\build\app\intermediates\javac\xxxDebug\classes\刚才你修改的包名\类名 ,然后找到所有 类名.class 或 类名$xxx.class 的文件复制出来
- 然后把需要修改的.jar文件也复制出来
- 把.jar改成.zip然后解压
- 复制你的几个.class文件覆盖在相应的包名文件夹下
- 然后在起始文件夹处进行压缩成zip,比如你修改的包名为com.xxx ,就在com这个文件夹上右键然后压缩
- 然后修改.zip为.jar,并在项目里覆盖之前的jar包,并删除第2,3步所创建的文件和目录
- 然后就替换完成了
扩展
如果是aar包的话也是一样,可以把aar包解压,然后拿到里面的class.jar再次解压就可以进行替换了
如果只是替换aar包内的res资源的话,可以直接在项目内创建同目录同名的文件就可以在打包的时候自动合并了
end