AS导入framework.jar
由于在framework层添加了一些接口,然后又不想每次更改APP都在源码环境下编译验证,特把APP源码拷贝到AS中进行编译修改,这就需要在AS中导入系统编译出来的framework.jar包,才能正常编译。
-
编译framework.jar包
make -j24编译出framework.jar;并在 out\target\common\obj\JAVA_LIBRARIES\framework_intermediates\目录拷贝出编译好的jar包classes-full-debug.jar。 -
AS中导入framework.jar包
2.1将拷贝出的classes-full-debug.jar重命名为framework.jar并拷贝到Android工程的libs目录下面。
右键点击jar包,选择add as libary。
2.2打开Module:app 的build.gradle,在dependencies下添加compileOnly files(‘libs/framework.jar’)1dependencies { 2implementation 'com.android.support:appcompat-v7:28.0.0' 3implementation 'com.android.support.constraint:constraint-layout:1.1.3' 4compileOnly files('libs/framework.jar') 5}2.3打开Module:app 的build.gradle,在最后添加如下代码: 将framework.jar的编译顺序更改到系统自带android.jar之前
1preBuild { 2 3 doLast { 4 def imlFile = file(project.name + ".iml") 5 println 'Change ' + project.name + '.iml order' 6 try { 7 def parsedXml = (new XmlParser()).parse(imlFile) 8 def jdkNode = parsedXml.component[1].orderEntry.find { it.'@type' == 'jdk' } 9 parsedXml.component[1].remove(jdkNode) 10 def sdkString = "Android API " + android.compileSdkVersion.substring("android-".length()) + " Platform" 11 println 'what' + sdkString 12 new Node(parsedXml.component[1], 'orderEntry', ['type': 'jdk', 'jdkName': sdkString, 'jdkType': 'Android SDK']) 13 groovy.xml.XmlUtil.serialize(parsedXml, new FileOutputStream(imlFile)) 14 } catch (FileNotFoundException e) { 15 // nop, iml not found 16 println "no iml found" 17 } 18 } 19}2.4打开Project 的build.gradle,在allproject下添加如下代码:将framework.jar打入apk包中
1allprojects { 2 gradle.projectsEvaluated { 3 tasks.withType(JavaCompile) { 4 options.compilerArgs.add('-Xbootclasspath/p:app\\libs\\framework.jar') 5 } 6 } 7}2.5为了防止报65536错误,可以增加多odex支持,在Module:app 的build.gradle中的
defaultConfig中添加如下代码:1 defaultConfig { 2 applicationId "com.android.test" 3 minSdkVersion 26 4 targetSdkVersion 28 5 multiDexEnabled = true 6 }并且引用:
compile 'com.android.support:multidex:1.0.0'
到此就可以顺利的使用自己编译出来的framework.jar在AS中编译APK了。