由于業(yè)務(wù)求桑寨,要將定制化的framework包導(dǎo)入到AS中,然后不斷查閱料忿檩,找到一系列比較全的資料尉尾。最終整理如下:
1.將jar包放在libs目錄下:
2.右鍵將包add as library
3.在app的build.gradle下 dependence下:
記住:implementation fileTree(include: ['*.jar'], dir: 'libs')必須注釋燥透,否則會(huì)報(bào)錯(cuò)沙咏。
將implementation 改為compileOnly(原來(lái)的provided已經(jīng)廢棄)
4.然后我們需要將framework的編譯順序更改到系統(tǒng)自帶android.jar之前辨图,以前是手動(dòng)更改,后來(lái)發(fā)現(xiàn)一段腳本肢藐,得救了故河。在app的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 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
}
}
}
這段代碼是用來(lái)將系統(tǒng)jar包自動(dòng)放置于最后的位置吆豹。編譯之后忧勿,打開(kāi)app.iml可以查看到效果:
然后為了使framwork包生效,需要在系統(tǒng)的build.gradle下添加一段代碼
其中前者將framework包打入apk包中瞻讽,確保不出現(xiàn)打包錯(cuò)誤;后者是編譯包熏挎,在編譯器編譯時(shí)不會(huì)出現(xiàn)編譯錯(cuò)誤的情況速勇。
代碼具體如下:
//添加以下代碼,使cframework-base.jar包編譯先于android.jar
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs.add('-Xbootclasspath/p:D:\\git\\MyApplication\\app\\libs\\framework-base.jar')
}
}
這個(gè)地方一定要注意一點(diǎn):后面的路徑已經(jīng)要右鍵framework包---copy relative path,
copy relative path,copy relative path(重要的事情要說(shuō)三遍坎拐,樓主就是這里栽了跟頭烦磁,csdn,stackoverflow上很多大牛都遇到了)
然后實(shí)驗(yàn)activity的一句話:
編譯通過(guò)
運(yùn)行完美