1、期望项目如何运行?
普通 App 在 run 之后,会编译出 APK,然后 AS 会自动调用 install 命令进行安装,完成安装后会启动 App 的 Launcher Activity。这些 AS 已经帮你自动完成了。如果你的 App 不像 SystemUI 或 Settings 这样贴近 Framework 层,且有入口 Activity,那么完全可以直接运行。
如果你开发的系统应用,并不局限于指定设备,比如相册应用,那么完全可以将 /system/app 下的 APK 删除,重启,然后即可直接运行,或者如果你用的是系统签名,无需删除 APK 即可覆盖安装运行。
但是像 SystemUI 这样的应用,首先是没有默认的 Activity 的,其次它必须 push 到指定目录后,杀死进程才能生效,因此接下来需要解决 APK push 到设备指定目录的问题。
当然,经过前面文章的操作,已经可以生成 APK 了,那么手动使用 adb 命令 push 也没问题的,但是我们这里要做到的是全自动,在需要运行的时候只需要点击 run 按钮即可。这样才能达到节省开发时间的目的。
不管测试设备使用的是手机或模拟器,都需要执行:
adb root
adb remount
使得 system 目录处于可重写的状态。在 remount 之前,也许还需要执行:
adb disable-verity
再重启设备,具体得看 remount 是否成功。
在我写这篇文章时,我发现 Android 10 的模拟器是无法 remount 的,具体原因未知。
如果是使用的模拟器,在启动时需要以可读写的方式启动,在使用 AVD Manager 创建好模拟器后,执行以下命令。
# 查看当前有哪些模拟器
emulator -list-avds
# XXX 是模拟器的名称
emulator -avd XXX -writable-system
emulator 命令在 SDK 的 emulator 目录中,配置系统变量中即可执行。
这样模拟器就可以 remount 了。
2、让生成的 APK 文件 push 到设备的指定目录下
我们需要写一个 bat 命令行脚本文件。让 AS 在生成 APK 之后,自动执行这个脚本文件。
需要注意的是,开启 instan run 或者 Apply Changes 功能时,debug 运行的项目生成的 APK 不在 app\build\outputs\apk\debug 目录下,而且,如果应用是需要 push 进行验证的,开启了这个功能也没用,因为需要杀死进程。
因此,不要开启这个功能。
Instant run
如果这个功能无法关闭,那么运行时构建方式需要选择 release 模式:Build - Select Build Variant...,将 Active Build Variant 改成 release。
Select Build Variant...
同时不要开启混淆:build.gradle 的 buildTypes 区块下的 release 区块,其 minifyEnabled 属性设置为 false。
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
然后根据生成的 APK 位置,去修改上方的脚本文件对应的信息。可以手动在 cmd 中验证脚本命令。
我们先来看如何让 AS 去自动执行脚本。
installSysPrivApp.bat 内容如下:
```bat
:: 熟悉 Windows 命令行的同学就知道,set 操作是创建变量,%xxx% 是引用变量
:: 应用包名
set app_package=com.android.systemui
:: 目标目录名称
set dir_app_name=SystemUI
:: 系统目录
set path_sysapp=/system/priv-app
:: apk的位置,在AS3.2后,debug的apk不知道跑哪里去了,但是可以直接Release,不要开启混淆,以便调试
set apk_host=.\app\build\outputs\apk\debug\app-debug.apk
:: apk名称
set apk_name=%dir_app_name%.apk
:: 目标目录