自动部署系统应用程序
您可以创建一个将执行该作业的脚本,并在每次在AS中运行时自动运行该脚本.
1.创建脚本
您可以根据需要调整我创建的脚本.将其放在:project_directory / installSystem.sh中
#!/bin/bash
# CHANGE THESE
app_package="com.example"
dir_app_name="MySysApp"
MAIN_ACTIVITY="SysAppMainActivity"
ADB="adb" # how you execute adb
$ADB_SH="$ADB shell" # this script assumes using `adb root`. for `adb su` see `Caveats`
path_sysapp="/system/priv-app" # assuming the app is priviledged
apk_host="./app/build/outputs/apk/app-debug.apk"
apk_name=$dir_app_name".apk"
apk_target_dir="$path_sysapp/$dir_app_name"
apk_target_sys="$apk_target_dir/$apk_name"
# Delete previous APK
rm -f $apk_host
# Compile the APK: you can adapt this for production build, flavors, etc.
./gradlew assembleDebug || exit -1 # exit on failure
# Install APK: using adb root
$ADB root 2> /dev/null
$ADB remount # mount system
$ADB push $apk_host $apk_target_sys
# Give permissions
$ADB_SH "chmod 755 $apk_target_dir"
$ADB_SH "chmod 644 $apk_target_sys"
#Unmount system
$ADB_SH "mount -o remount,ro /"
# Stop the app
$ADB shell "am force-stop $app_package"
# Re execute the app
$ADB shell "am start -n \"$app_package/$app_package.$MAIN_ACTIVITY\" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER"
2.用AS Run绑定
>转到运行 – >编辑配置
>在常规选项卡(您的模块)上进行以下更改
>安装选项 – > Deplay:没有
>启动选项 – >启动:没有
>启动前:按,然后运行外部工具,选择您的脚本.
>在新对话框中:
>设置任何名称.
>“工具设置” – >程序:导航到项目的目录,然后选择您的脚本
警告:
首次安装
在您的应用程序的第一次安装中,设备需要重新启动(adb重新启动)一次.之后,你可以简单地按下Run,一切都会自动发生.
这是因为主机编译器(dex2oat)没有被自动调用.不知怎的,这个新系统应用程序尚未通知操作系统.手动拨打电话可以解决这个问题,但是我没有运气.如果有人解决了,请分享.
adb根问题
有时(通常是重新启动后的初始执行)调用adb root找不到设备.您可以简单地从AStudio重新播放,或在成功的adb根后睡一秒钟.
使用su而不是adb root
在安装系统和授予权限的情况下,adb push将无法正常工作.要使其工作,请使用以下命令替换ADB_SH变量和脚本的安装部分:
..
ADB_SH="$ADB shell su -c"
..
# Install APK: using adb su
$ADB_SH "mount -o rw,remount /system"
$ADB_SH "chmod 777 /system/lib/"
$ADB_SH "mkdir -p /sdcard/tmp" 2> /dev/null
$ADB_SH "mkdir -p $apk_target_dir" 2> /dev/null
$ADB push $apk_host /sdcard/tmp/$apk_name 2> /dev/null
$ADB_SH "mv /sdcard/tmp/$apk_name $apk_target_sys"
$ADB_SH "rmdir /sdcard/tmp" 2> /dev/null