AndroidStudio系统打包System级别Apk


主要解决2个问题:

1.如何生成系统对应的签名文件

2.解决 internal API 和 hidden API使用编译报错

首先生成签名文件:

1.在github上下载工具 keytool-importkeypair,具体git地址如下:

https://github.com/getfatday/keytool-importkeypair

2.准备证书文件

platform.pk8  、platform.x509.pem

文件路径:Android/build/target/product/security

3.将下载后的keytool-importkeypair文件及证书文件platform.pk8和platform.x509.pem文件放在同一个目录下

 

4.使用Notepad打开keytool-importkeypair文件,鼠标右键点击右下角,设置文件换行格式为Unix,具体如下

5.执行命令sh keytool-importkeypair -k ./platform.keystore -p android -pk8 platform.pk8 -cert platform.x509.pem -alias platform

6.AndroidManifest.xml中添加共享系统进程属性,一般为android:sharedUserId="android.uid.system"

7.AndroidStudio添加生成的platform.keystore文件,可拷贝platform.keystore文件到工程根目录下,如下图所示。

 8.修改Build Types,选择release,因为我们之前打包就是选择的release,需要保持一致。

 9.因为系统app开发可能涉及到internal API和 hidden API的使用,不做处理会出现编译错误,比如android.os.SystemProperties、ServiceManager.AddService,还需进行一些编译配置,具体过程如下:找到Android源码环境生成的android.jar文件,具体位置为out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar,可修改一下jar包名字为framework.jar,根据实际需要不修改也行,修改可读性更好,拷贝该framework.jar包到工程app/libs/目录下

10.设置framework.jar的编译优先级,在工程根目录添加build.gradle添加以下代码:

project('app') { // app是你工程的名字,配置只对当前工程有效
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
// 注意修改 jar 包的路径
// Xbootclasspath/p: Java 编译的寻址优先设置,先找缺省路径还是全路径
options.compilerArgs.add('-Xbootclasspath/p:app/libs/framework.jar')
}
}
gradle.buildFinished {
pushDownSDK(".idea/modules/app/app.iml");
}
}

def pushDownSDK(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
}
}


11.run


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM