AS中匯入android系統包編譯,執行全部通過

吉祥發表於2019-03-26

由於業務求,要將定製化的framework包匯入到AS中,然後不斷查閱料,找到一系列比較全的資料。最終整理如下:

1.將jar包放在libs目錄下:

1

2.右鍵將包add as library

image.png

3.在app的build.gradle下 dependence下:

image.png

記住:implementation fileTree(include: ['*.jar'], dir: 'libs')必須註釋,否則會報錯。 將implementation 改為compileOnly(原來的provided已經廢棄)

4.然後我們需要將framework的編譯順序更改到系統自帶android.jar之前,以前是手動更改,後來發現一段指令碼,得救了。在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
        }
    }
}
複製程式碼

這段程式碼是用來將系統jar包自動放置於最後的位置。編譯之後,開啟app.iml可以檢視到效果:

image.png

然後為了使framwork包生效,需要在系統的build.gradle下新增一段程式碼

image.png

image.png
其中前者將framework包打入apk包中,確保不出現打包錯誤;後者是編譯包,在編譯器編譯時不會出現編譯錯誤的情況。 程式碼具體如下:

 //新增以下程式碼,使cframework-base.jar包編譯先於android.jar
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs.add('-Xbootclasspath/p:D:\\git\\MyApplication\\app\\libs\\framework-base.jar')
        }
    }
複製程式碼

這個地方一定要注意一點:後面的路徑已經要右鍵framework包---copy relative path, copy relative path,copy relative path(重要的事情要說三遍,樓主就是這裡栽了跟斗,csdn,stackoverflow上很多大牛都遇到了)

image.png

然後實驗activity的一句話:

image.png
image.png

編譯通過

image.png

執行完美

相關文章