在android studio上开发时,是否有一种方法可以让应用程序直接安装在system/app文件夹中(该设备是根目录)?
也就是说,当我按下“运行应用程序”按钮时,我希望将APK放在系统/应用程序中。
如果这是不可能的,那么在构建和测试系统应用程序时,推荐的最方便的方法是什么?
最佳答案:
从AS自动部署系统应用程序
您可以创建一个脚本来完成该作业,并在每次单击“运行方式”时自动运行该脚本。
1。创建脚本
你可以修改我根据需要创建的这个脚本。放入:project_directory/installsystem.sh#!/bin/bash
# CHANGE THESE FOR YOUR APP
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。在运行时将其绑定
转到运行->编辑配置
在(模块的)常规选项卡上执行以下更改
安装选项->取消显示:无
启动选项->启动:无
启动前:按+,然后按Run External Tool,选择脚本。
在“新建”对话框中:
设置任何名称。
在“工具设置”->程序上:导航到项目的目录,然后选择脚本
注意事项:
第一次安装
第一次安装应用程序时,只需重新启动一次设备(adb reboot)。然后,只需按Run即可自动执行所有操作。
这是因为主机编译器(dex2oat)不会自动调用。不知怎么的,这个新系统应用程序还没有通知操作系统。手动打电话给dex2oat应该可以解决这个问题,但我运气不好。如果有人解决了,请分享。
adb root问题
有时(通常是重新启动后的初始执行),对adb root的调用找不到设备。成功后,您只需从AStudio或sleep重新播放一秒钟即可。
使用adb root而不是su
adb root将不会工作,尽管安装系统和授予权限。要使其正常工作,请将脚本的adb push变量和install部分替换为以下内容:
..
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