有点标题党了,本文档主要针对已经解耦的系统应用。
何为解耦,这里的解耦为可以脱离系统独立编译的app。
一般的系统APP都需要依赖系统编译,使用make命令,这样编译比较慢,而且也没有像Android Studio这么好用的开发工具
原理
我们需要编译生成framework.jar,这个jar是系统编译的中间产物,这个里边会包含隐藏的api。
我们平时调用不到隐藏的api,是因为我们使用的Android sdk中的环境变量中已经剔除了隐藏的api。
所以我们需要把自己编译的jar放到Android studio的环境变量里边。
下面介绍具体实现,我们首先有一个基于gradle的项目。
build framework.jar:
运行命令进行编译
make framework
生成到./out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes-full-debug.jar
对于不同版本的源码,编译方式不太一样,具体的可以Google
module 的 build.gradle 修改
dependencies {
........
compileOnly files('../sharelibs/framework-27.jar')
}
添加下下面的脚本,把module.iml里的
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"
}
}
}
project 的build.gradle 添加
allprojects {
..............
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs.add('-Xbootclasspath/p:sharelibs/framework-27.jar')
}
}
}
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!