Как установить приложение в систему/приложение при разработке из студии Android

Есть ли способ сделать установку приложения непосредственно в папке system/app при разработке на Android Studio (устройство укоренено)?

Значение, когда я нажимаю кнопку "Запустить приложение", я хочу, чтобы apk был помещен в систему/приложение.

Если это невозможно, то какой рекомендуемый наиболее удобный способ работы над созданием и тестированием системного приложения?

Ответы

Ответ 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

Ответ 2

Windows script для заинтересованных:

Сохраните этот файл так же: в корне каталога вашего проекта (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

Ответ 3

Чтобы обойти проблему перезагрузки из приложения @paschalis, переустановите приложение с помощью диспетчера пакетов, прежде чем перезагружать систему только для чтения:

# Reinstall app
$ADB_SH "pm install -r $apk_target_sys"

# Unmount system
$ADB_SH "mount -o remount,ro /"

Менеджер пакетов будет вызывать dex2oat самостоятельно.

Ответ 4

Я думаю, что adb push *.apk /system/app/*.apk должен делать только хорошо.

Я не знаю об Android Studio, но если вы работаете в Linux, вы можете попытаться создать псевдоним для

adb install

который указывает на эту команду, он должен работать!