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’)dependencies { implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' compileOnly files('libs/framework.jar') }
2.3打开Module:app 的build.gradle,在最后添加如下代码: 将framework.jar的编译顺序更改到系统自带android.jar之前
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" println 'what' + sdkString 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 println "no iml found" } } }
2.4打开Project 的build.gradle,在allproject下添加如下代码:将framework.jar打入apk包中
allprojects { gradle.projectsEvaluated { tasks.withType(JavaCompile) { options.compilerArgs.add('-Xbootclasspath/p:app\\libs\\framework.jar') } } }
2.5为了防止报65536错误,可以增加多odex支持,在Module:app 的build.gradle中的
defaultConfig中添加如下代码:defaultConfig { applicationId "com.android.test" minSdkVersion 26 targetSdkVersion 28 multiDexEnabled = true }
并且引用:
compile 'com.android.support:multidex:1.0.0'
到此就可以顺利的使用自己编译出来的framework.jar在AS中编译APK了。