前言
項目最近適配了安卓10,而安卓10廢棄了某些api,導致調用後就報錯,比如:
val var5: TelephonyManager = getSystemService("phone") as TelephonyManager
var5.deviceId//導致崩潰
而項目中用的某個庫會在某些情況下調用該代碼(這個庫比較重要,更換的話問題比較多,且提問題的話肯定就趕不上上線了),於是就想辦法能不能修改jar包來規避該問題
然後試了下果然還是可以
前提
- 首先庫是.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