背景:
在主機(jī)廠或者有Android系統(tǒng)源碼庐氮,通常會改framework下的代碼,比如隱藏接口要開放或者新增一些api等胰挑,但因為AS中使用的是標(biāo)準(zhǔn)的api jar警儒,在AS工程編譯時會出現(xiàn)找不到函數(shù)實現(xiàn)等問題。
解決方案:將編譯出來的framework jar包放在AS工程中袄简,配置編譯優(yōu)先級
操作步驟:
1.拷貝源碼編譯出來的framewokr的jar包到AS工程里
在AS工程app目錄下新建libs_provided文件夾腥放,將源碼編譯生成目錄out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar,拷貝到libs_provided目錄下绿语,同時不妨重命名為framework.jar
2.將自己編譯出來的framework.jar加入編譯
2.1選中framewokr.jar右鍵-->添加為lib
2.2修改工程依賴秃症,將framework.jar配置為僅參與編譯的方式
點擊工具欄“File”-->Project Structure
選擇Dependencies Tab將framework.jar配置為Compile only
3.修改build.gradle(Project)
3.1添加os判斷函數(shù)
def isWindows() {
return System.properties['os.name'].contains('windows')
}
3.2 allprojects節(jié)點下添加如下代碼
gradle.projectsEvaluated {
//兼容不同os路徑配置
if (isWindows()){
//方式1
tasks.withType(JavaCompile){
options.compilerArgs.add('-Xbootclasspath/p:app\lib_provided\framework.jar')
}
}else{
tasks.withType(JavaCompile){
options.compilerArgs.add('-Xbootclasspath/p:app/lib_provided/framework.jar')
}
}
//方式2
// tasks.withType(JavaCompile) {
// options.compilerArgs << '-Xbootclasspath/p:app/lib_provided/framework.jar'
// }
}
4.修改jar優(yōu)先級(先于jdk/sdk)
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
}
}
補(bǔ)充:
gradle中判斷os
1.導(dǎo)包
import org.apache.tools.ant.taskdefs.condition.Os
2.定義os函數(shù)
def osFamily() {
if (Os.isFamily(Os.FAMILY_MAC)) return 'mac'
if (Os.isFamily(Os.FAMILY_UNIX)) return 'linux'
if (Os.isFamily(Os.FAMILY_WINDOWS)) return 'windows'
return null
}
3.判斷
osFamily() == 'windows'
參考文章:
1.Android Studio 優(yōu)先源碼編譯的framework.jar(android.jar)
<u>https://blog.csdn.net/lei1217/article/details/71627916</u>
2.Android Studio中解決framwork.jar和SDK api沖突的方法
<u>https://blog.csdn.net/zhiwenwei/article/details/80592734</u>