Ответ 1
Автоматическое развертывание системного приложения из AS
Вы можете создать script, который будет выполнять задание, и запускать его автоматически при каждом запуске в AS.
1. Создайте script
Вы можете адаптировать этот script, который я создал из своих потребностей. Поместите его в: 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: Ничего
- Параметры запуска- > Запуск: Ничего
- Перед запуском: нажмите
+
, затемRun External Tool
, чтобы выбрать script.- В новом диалоговом окне:
- установить любое имя.
- В разделе "Настройки инструмента" → "Программа": перейдите в каталог проекта и выберите script
- В новом диалоговом окне:
Предостережения:
Первая установка
Устройство необходимо перезапустить (adb reboot
) только один раз, при первой установке вашего приложения. Впоследствии вы можете просто нажать Run
, и все произойдет автоматически.
Это связано с тем, что компилятор хоста (dex2oat) не запускается автоматически. Как-то OS еще не проинформирована об этом новом системном приложении. Вызов dex2oat вручную должен решить это, но мне не повезло. Если кто-то решает его, пожалуйста, поделитесь.
adb root
проблемы
Иногда (обычно это начальное выполнение после перезапуска) вызов adb root
не находит устройство. Вы можете просто переиграть с AStudio
или sleep
в течение секунды после успешного adb root
.
используя su
вместо adb root
adb push
не будет работать, несмотря на установку системы и предоставление разрешений. Чтобы заставить его работать, замените переменную ADB_SH
и раздел установки script следующим образом:
..
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