在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