android studio 導(dǎo)入自己編譯的Framework.jar

最近做一個指紋注冊驗證的APP,需要訪問framework層隱藏的接口(接口前的注釋里加了@hide),為了能在android studio里可以使用這些接口,需要自己編譯下framework的源碼,如果編譯debug版本,直接把out/target/product/projectXX/system/framewor framework.jar下面拷出來,如果是user版本,out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar
由于我編譯的是user版本,所以直接將classes.jar拷貝出來并修改為framework.jar
下面將framework.jar導(dǎo)入android studio工程
1、將framework.jar放在Module的libs下面


image.png

2、右鍵framework.jar,選擇“Add As Library”
3、右鍵Module選擇“Open Module Settings,進(jìn)入Project Structure界面,把framework.jar移到最頂上,把implementation改為compileOnly(默認(rèn)Compile),點擊確定:


image.png

compileOnly表示只在編譯時引用該jar包,打包的時候并不會將該jar打包進(jìn)去。
這里有一點一定要特別注意:一定要將Modules下的build.gradle里的
implementation fileTree(include: ['*.jar'], dir: 'libs')
注釋掉,否則還是會將framework.jar打包進(jìn)apk
4、在工程的根目錄下打開build.gradle,并找到allprojects,加入如下代碼
allprojects {
    repositories {
        google()
        jcenter()
    }
    tasks.withType(JavaCompile) {
        options.compilerArgs.add('-Xbootclasspath/p:app\\libs\\framework.jar')
    }
}

5、在Module下打開build.gradle,在最后加入如下代碼:

 preBuild {
    doLast {
        def imlFile = file(project.name + ".iml")
        println('Change ' + project.name + '.iml order')
        try {
            def parsedXml = (new XmlParser()).parse(imlFile)
            def jdkNode = parsedXml.component[1].orderEntry.find { it.'@type' == 'jdk' }
            parsedXml.component[1].remove(jdkNode)
            def sdkString = "Android API " + android.compileSdkVersion.substring("android-".length()) + " Platform"
            new groovy.util.Node(parsedXml.component[1], 'orderEntry', ['type': 'jdk', 'jdkName': sdkString, 'jdkType': 'Android SDK'])
            groovy.xml.XmlUtil.serialize(parsedXml, new FileOutputStream(imlFile))
        } catch (FileNotFoundException e) {
            // nop, iml not found
        }
    }
}

自動更改module.iml,將下面代碼會移動最后

<orderEntry type="jdk" jdkName="Android API 26 Platform" jdkType="Android SDK" />

通過以上步驟后,就可以引用源碼的Api了,但可能在運行時會出錯,提示odex超出了65536,所以再加上如下設(shè)置就不會出錯了
6、在Module下面的build.gradle里找到defaultConfi加入multiDexEnabled = true:


image.png

并在dependencies里添加

implementation 'com.android.support:multidex:1.0.0'

由于使用了framework層隱藏的Api,編譯出來的apk是不能作為一個普通的app運行的,必須將該app變成系統(tǒng)級的app才能正常運行,怎樣變成系統(tǒng)級的app,下篇文章會詳細(xì)介紹。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容