使用模拟器开发 Android 系统应用

1,957 阅读3分钟

版权声明

凡未经作者授权,任何媒体、网站及个人不得转载、复制、重制、改动、展示或使用局部或全部的内容或服务。如果已转载,请自行删除。同时,我们保留进一步追究相关行为主体的法律责任的权利。

© 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 文件对应用进行签名。