在 Android Studio 上开发时,有没有办法让应用直接安装在 system/app 文件夹中(设备已root)?
意思是,当我按下“运行应用程序”按钮时,我希望将 apk 放置在系统/应用程序中。
如果无法做到这一点,推荐最便捷的方式来构建和测试系统应用程序?
最佳答案
从 AS 自动部署系统应用
您可以创建一个脚本来完成这项工作,并在您每次在 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。用 AS Run 绑定(bind)它
- 转到运行 -> 编辑配置
在(您的模块的)常规标签上进行以下更改
- 安装选项->延迟:没有
- 启动选项->启动:没有
- 启动前:按
+
,然后按Run External Tool
,选择您的脚本。- 在新对话框中:
- 设置任何名称。
- 在“工具设置”->程序:导航到项目的目录,然后选择您的脚本
- 在新对话框中:
注意事项:
首次安装
在第一次安装您的应用时,需要重新启动设备(adb reboot
)一次。之后,您只需按Run
,一切都会自动发生。
这是因为主机编译器 (dex2oat) 不会自动调用。不知何故,操作系统还没有收到这个新系统应用程序的通知。手动调用 dex2oat 应该可以解决这个问题,但我没有运气。如果有人解决了,请分享。
adb root
问题
有时(通常是重新启动后的初始执行)对 adb root
的调用找不到设备。您可以简单地从 AStudio
重新播放,或在成功 adb root
后重新播放一秒钟的 sleep
。
使用 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
关于android - 从android studio开发时如何在系统/应用程序中安装应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28302833/