版权声明
凡未经作者授权,任何媒体、网站及个人不得转载、复制、重制、改动、展示或使用局部或全部的内容或服务。如果已转载,请自行删除。同时,我们保留进一步追究相关行为主体的法律责任的权利。
© 2023 小酥肉不加辣,All rights reserved.
如何将应用打包成系统应用,并安装到模拟器上
在车机应用的开发过程中,会调用系统权限的API,这就需要把应用打包成系统应用安装到模拟器。本文主要讲解打包系统应用和安装的方法。
第一步 设置模拟器
创建虚拟器的时候,需要选择不包含 Google APIs 的镜像。这是因为,如果使用带有 Google API 的镜像,我们将无法使用与 Google API 相同的密钥对我们的系统应用程序进行签名,因为我们无法得到它。而没有Google API 的纯 AOSP 镜像,我们可以获得 AOSP 的平台密钥,可以使用它对我们的系统应用程序进行签名。
第二步 修改 Manifest 文件
如果打算将你的应用程序作为系统进程运行,那么在 AndroidManifest.xml 中需要添加 android:sharedUserId 属性。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:sharedUserId="android.uid.system"
package="<YourPackageNameHere>">
添加此属性后,此应用程序只能作为系统应用程序安装。如果您尝试将其安装为普通应用程序,将会失败。
第三步 使用 AOSP 系统签名
为了使应用程序成为系统应用程序,需要使用 AOSP 平台签名文件对其进行签名。
使用 Android SDK 中的 apksigner 工具对你的应用进行签名,使用下面这个命令:
apksigner sign --key platform.pk8 --cert platform.x509.pem <path of YourAPK>
其中 platform.pk8 和 platform.x509.pem 文件可以从 AOSP 的 target/product/security 目录中找到。
注意需要将 apksigner 加入到环境变量,它在 build-tools 这个文件夹下,以 33.0.0 版本的 build tools 为例,将其加入到环境变量中。
export PATH=$PATH:$ANDROID_HOME/build-tools/33.0.0
第四步 写入系统分区
为了使应用程序成为系统应用程序,需要将其安装在 /system/app/ 文件夹中。模拟器的系统分区是只读的,所以无法直接进行 adb push 。为了使系统分区可写,我们需要使用 -writable-system 标志重新启动模拟器。
emulator -avd <YourAVDNameHere> -writable-system
注意需要将 Android SDK 中的 emulator 添加到环境变量
export PATH=$PATH:$ANDROID_HOME/emulator/emulator
以可写系统模式重启模拟器后,使用以下代码段将你的应用部署到系统中
adb root
adb remount
adb shell mkdir /system/app/<YourAppFolder>
adb push <YourAPK> /system/app/<YourAppFolder>/
adb reboot
如果想卸载应用,将应用文件夹删除即可
adb root
adb remount
adb shell rm -rf /system/app/ <YourAppFolder>
adb reboot
改进
每次需要安装系统应用时需要执行以上很多条指令,操作起来有些麻烦,即使你将它们写成bash脚本,每次也需要执行这个脚本。
那么有没有可能像开发普通的应用程序一样,只需要点击 Android Studio 中的 run 按钮就可以搞定呢?
答案是有的。可以使用 keytool-importkeypair 。这个工具可以将密钥/证书对导入到java keystore文件中,也就可以生成普通应用使用的签名文件。
用法:
keytool-importkeypair [-k keystore] [-p storepass] -pk8 pk8 -cert cert -alias key_alias
示例:
keytool-importkeypair -k ~/.android/platform.keystore -p android -pk8 platform.pk8 -cert platform.x509.pem -alias platform
在你的项目的 gradle.build 文件中就可以直接设置使用生成的 platform.keystore 文件对应用进行签名。