作者:我叫博小微 | 来源:互联网 | 2023-05-23 17:16
有没有办法在Android Studio上开发时直接在system/app文件夹中安装应用程序(设备已植根)?
这意味着,当我按下"运行应用程序"按钮时,我希望将apk放在系统/应用程序中.
如果无法做到这一点,建议最方便的方法是构建和测试系统应用程序?
1> Paschalis..:
从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绑定它
转到"运行" - >"编辑配置"
在" 常规"选项卡(模块的)上执行以下更改
安装选项 - > Deplay: Nothing
启动选项 - >启动:没有
发布之前:按+
,然后Run External Tool
选择您的脚本.
在新对话框中:
设置任何名称.
在"工具设置" - >程序:导航到项目的目录,然后选择您的脚本
警告:
首次安装
在第一次安装应用程序时,设备只需重启(adb reboot
)一次.之后,您只需按下即可Run
自动完成所有操作.
这是因为主机编译器(dex2oat)不会自动调用.不知何故操作系统尚未获知这个新的系统应用程序.手动调用dex2oat应该可以解决这个问题,但我没有运气.如果有人解决它,请分享.
adb root
问题
有时(通常是重启后的初始执行)调用adb root
找不到设备.您可以简单地重新播放AStudio
,或者sleep
在成功后重播一秒钟adb root
.
使用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 4.3+开始,路径不是`/ system/app`它应该是`/ system/priv-app`,谢谢你,它帮助我实现了自动化构建过程.
@Paschalis我试过这个,但它给出了错误= 13(权限被拒绝).你知道怎么回事吗?谢谢
2> Birdnado..:
Windows脚本供那些感兴趣的人使用:
以相同方式存储此文件:在项目目录的根目录(installSysPrivApp.bat)
::WIN BATCH SCRIPT
:: CHANGE THESE
set app_package=com.example.package
set dir_app_name=app
set MAIN_ACTIVITY=MainActivity
set ADB="adb"
::ADB_SH="%ADB% shell" # this script assumes using `adb root`. for `adb su`
see `Caveats`
set path_sysapp=/system/priv-app
set apk_host=.\Application\build\outputs\apk\Application-debug.apk
set apk_name=%dir_app_name%.apk
set apk_target_dir=%path_sysapp%/%dir_app_name%
set apk_target_sys=%apk_target_dir%/%apk_name%
:: Delete previous APK
del %apk_host%
:: Compile the APK: you can adapt this for production build, flavors, etc.
call gradlew assembleDebug
set 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
%ADB_SH% mkdir -p %apk_target_dir%
%ADB% push %apk_host% /sdcard/tmp/%apk_name%
%ADB_SH% mv /sdcard/tmp/%apk_name% %apk_target_sys%
%ADB_SH% rmdir /sdcard/tmp
:: 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