本文主要來敘述主題:當引入外部的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:::
二、編譯新創建的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包引入到項目中。
- 引入之後,查看一下是不是自己想要的效果。
至此,這一篇章接近尾聲,後續如有未提及的地方,想起來了就會繼續更新,希望能幫助到您,如有不當之處,請指教。