1. 程式人生 > >androidstudio更改優先載入系統包framework.jar的順序

androidstudio更改優先載入系統包framework.jar的順序

這篇文章主要針對本地開發系統級應用,使用系統原始碼中的隱藏方法時,優先載入需要的隱藏api而不是官方的SDK的解決策略。

一、androidstudio編譯時載入的順序。

在我們新建的每一個工程中,在專案名/app目錄下都有一個檔案,叫做 app.iml .(如圖)


這個檔案是編譯器在執行時候載入需要依賴的庫檔案的順序表,開啟檔案,我們可以觀察一下:


我們看到最上面的一條是官方SDK,也就是最先載入的庫檔案,而我們需要的framework.jar在中間,則不會優先載入。

為了優先載入framework.jar,我們可以選擇將需要的一條放置到最上面,這裡我在本地需要獲取ActivityManager中的一個叫做removeTask方法,這個方法對外是隱藏的,當前情況如圖:


這個是framework.jar中ActivityManager中需要使用的方法removeTask。

直接使用導致的問題:


我們會發現無法找到需要的方法。

接下來我們改變一下 app.iml 中的順序:


我們將framework.jar放置到SDK的前面,

然後觀察具體程式碼中的使用情況:


我們會發現已經可以獲得了。

但是,這個只是暫時解決了問題,無法從根本上解決此類問題,因為你會發現從新clear/rebuild一下,順序又會回到原來的位置。

從根本上解決的方法:

在gradle檔案中有個地方:

allprojects {
    repositories {
        jcenter()
    }

在這下面,我們加入一段程式碼:
gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs.add('-Xbootclasspath/p:F://TvHelper/app/libs/framework.jar')
        }
    }
為了清晰,再放一個截圖:

這裡:Xbootclasspath/p  是java編址的優先定址設定,這裡我們設定的是絕對路徑。

寫完這個之後,及時你的api呼叫的時候無法獲取相應的方法,只要使用正確,也是可以完成build的。當然如果你更改了app.iml檔案的順序,那麼使用起來會更加舒服一些。