一、配置系统签名,正常在build.gradle中配置即可(略)
二、将系统应用import进android studio变成gradle工程。
三 、分析系统应用mk文件,查看依赖。
四、在build.gradle中添加mk中的依赖,可以远程依赖,也可以去android系统编译目录查找,android系统编译目录为:out/soong/.intermediates.
五、将framework.jar拷贝进工程libs目录,framework.jar在android编译目录 out/soong/.intermediates/frameworks/base/framework/android_common/combined,这个jar可以不限制使用android的系统api.
六,配置framework.jar的gradle依赖,compileOnly只编译即可。
七、在最外层build.gradle根目录中配置脚本,这一步是为了编译的时候以framework中的api优先编译.
allprojects {
repositories {
maven { url 'https://maven.aliyun.com/repository/public' }
google()
}
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
Set<File> fileSet = options.bootstrapClasspath.getFiles()
List<File> newFileList = new ArrayList<>();
//"../framework.jar" 为相对位置,需要参照着修改,或者用绝对位置
newFileList.add(new File("./app/libs/framework.jar"))
newFileList.addAll(fileSet)
options.bootstrapClasspath = files(
newFileList.toArray()
)
}
}
}
八、在最外层配置脚本,这一步告诉android studio 将android.jar配置到依赖末尾,使得android studio去优先使用framework.jar中的api,这个和上一步的用途是不一样的,上一步是为了编译,而这一步是为了android studio这个开发工具来配置的。
gradle.buildFinished {
pushDownAndroidSDK('./.idea/modules/app/xxxxx.app.iml')
}
def pushDownAndroidSDK(iml){
def imlFile = file(iml)
try {
def parsedXml = (new XmlParser()).parse(imlFile)
def jdkIndexOf = parsedXml.component[1].orderEntry.findIndexOf { it.'@type' == 'jdk' }
if (jdkIndexOf <= 1) {
def jdkNode =parsedXml.component[1].orderEntry.find { it.'@type' == 'jdk' }
parsedXml.component[1].remove(jdkNode)
new Node(parsedXml.component[1], 'orderEntry',['type': 'jdk', 'jdkName': 'Android API 28 Platform', 'jdkType': 'Android SDK'])
def writer = new StringWriter()
new XmlNodePrinter(new PrintWriter(writer)).print(parsedXml)
imlFile.text = writer.toString()
println "Push File: $iml jdk priority ok"
groovy.xml.XmlUtil.serialize(parsedXml,new FileOutputStream(imlFile))
}
} catch (Exception e) {
// do nothing
}
}