本文主要来叙述主题:当引入外部的aar包,但是由于类似接口/主机IP/常量类等等发生变动,突发情况下,想要修改aar包中需要改动的逻辑或类,当然前提是要经过人家版权方的同意与授权,并且只做授权范围内的使用。开源项目的aar包当然依据实际情况下进行合理运用。
废话这么多,正文开篇。
一、创建要修改的java类
这里我们主要针对的是要修改的java文件(类)
想要修改的java类(arr包中),在当前主项目中建立一个同名java类,将aar包中的这个类的内容CTRL+C,CTRL+V到新建的java类中,当然依赖的aar包暂时不要进行解除依赖,不然后续我们需要编译,新建的类中的各种依赖包都会报错。
涉及的类我们姑且创建叫Test.java
- 最重要的一步:建立同名java类
那么这个类建在主项目的哪个文件夹下呢?
我们追求完全一致的原则,当然包名,包名结构,文件夹一定要与aar中类的全路径一致。
为什么要保持一致:因为我们的新建类是要作为替换类替换掉原来的aar中Test.class文件的,这么说您应该就明白了, 所以保持一致很重要,不然我们所有做的操作都是在做无用功。
举个栗子:
aar包的Test.class是在com.demo.user下,那么新创建的Test.java类也要放在主项目的com.demo.user,
如果主项目没有com.demo.user文件夹,那就新建一个包,在com.demo.user下建立Test.java类。
- 同步新java类与aar中java类同名同内容,一切都一致
CTRL+C aar包这个类中的内容,不能直接复制这个类,因为这是个编译后的.class文件,受保护,不可被修改的。
CTRL+V 到新建的Test.java中,检查一下新类中的引用包等路径是否与aar中的Test.class一致
i1:::
i2:::
i3:::
然后修改想要修改的逻辑和方法等。
修改之后我们就需要进行编译这个类了,得到Test.class。
二、编译新创建的Test.java类
(1)因为在aar包中我们能够看到的都是.class文件,也就是经过JVM编译过的。
那么如何将我们新建的Test.java 类编译成Test.class呢?
这里我们用的依然是我们的IDE工具AndroidStudio。
我的环境是:
- Android Studio 3.2
- Build #AI-181.5540.7.32.5014246, built on September 18, 2018
- JRE: 1.8.0_152-release-1136-b06 amd64
- JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
- Windows 10 10.0
(2)在确认上述操作后项目没有错误,顶部菜单栏Build->Make Project进行项目编译
(3)找到编译后的.class文件
这个Test.class文件我们是可以直接打开查看,检查引用包和类是否与aar包中的Test.class是否完全一致。
这时候我们确认一致以后就可以将这个Test.class文件拷贝出来,放在一个临时文件夹中,以备后用。
三、替换.class文件
- 将项目中要修改的aar包拷贝一份出来放在桌面上。
接下来我们需要操作它。
- 将aar文件后缀改为压缩文件后缀,我这里改为.zip。
---->
- 解压工具(这里我使用的是2345好压解压缩软件)直接操作替换。
(1)直接打开(注意:不要解压再打开,一定要直接双击打开这个压缩文件)
(2)进入,我们看见根目录有一个classes.jar压缩文件,继续双击进入
(3)这样我们就真正进入了aar包的核心区域,接着进入到要替换.class文件(Test.class)的所在文件夹下。
在这里我们可以利用JD-GUI 工具打开这个文件查看细节。
(4)替换。
将我们新编译的Test.class文件替换掉这个文件夹下的Test.class文件。
保存与更新这个压缩文件的变动。
三、重新打包成aar并引入
- 将这个修改的压缩文件,后缀再改成.aar
- 将之前引入的aar包解除引用,将新aar包引入到项目中。
- 引入之后,查看一下是不是自己想要的效果。
至此,这一篇章接近尾声,后续如有未提及的地方,想起来了就会继续更新,希望能帮助到您,如有不当之处,请指教。