móviles - Cómo instalar una aplicación en el sistema/aplicación mientras se desarrolla desde Android Studio
sdk manager download (4)
¿Hay alguna manera de hacer que una aplicación se instale directamente en la carpeta del sistema / aplicación mientras se desarrolla en Android Studio (el dispositivo está rooteado)?
Es decir, cuando presiono el botón ''Ejecutar aplicación'', quiero que la apk se coloque en el sistema / aplicación.
Si esto no es posible, ¿cuál es la forma más conveniente recomendada para trabajar en la creación y prueba de una aplicación del sistema?
Implementar automáticamente la aplicación del sistema de AS
Puede crear un script que hará el trabajo y ejecutarlo automáticamente cada vez que presione Ejecutar en AS.
1. Crea el guión
Puedes adaptar este script que he creado a partir de mis necesidades. Colóquelo en: 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. Enlazar con AS Run
- Ir a Ejecutar -> Editar Configuraciones
Realice los siguientes cambios en la pestaña General (de su módulo)
- Opciones de instalación-> Deplay: Nada
- Opciones de lanzamiento-> Lanzamiento: Nada
- Antes de iniciar: presione
+
, luegoRun External Tool
, para seleccionar su script.- En el nuevo diálogo:
- poner cualquier nombre
- En ''Configuración de herramientas'' -> Programa: navegue a la dirección del proyecto y seleccione su script
- En el nuevo diálogo:
Advertencias:
Primera instalacion
El dispositivo debe reiniciarse ( adb reboot
) solo una vez , en la primera instalación de su aplicación. Después, simplemente puede presionar Run
y todo sucederá automáticamente.
Esto se debe a que el compilador del host (dex2oat) no se invoca automáticamente. De alguna manera, el sistema operativo aún no está informado para esta nueva aplicación de sistema. Llamar a dex2oat manualmente debería resolver esto, pero no tuve suerte. Si alguien lo resuelve por favor comparte.
problemas de adb root
A veces (normalmente la ejecución inicial después del reinicio) la llamada a la adb root
no encuentra el dispositivo. Simplemente puede volver a reproducir desde AStudio
, o sleep
por un segundo después de una adb root
exitosa.
usando su
lugar de la adb root
adb push
no funcionará a pesar del sistema de montaje y los permisos. Para que funcione, reemplace la variable ADB_SH
y la sección de instalación del script con lo siguiente:
..
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
Creo que adb push *.apk /system/app/*.apk
debería hacerlo bien.
No sé sobre Android Studio, pero si está en Linux, puede intentar crear un alias para
adb install
que apunta a ese comando, debería funcionar!
Para omitir el problema de reinicio de la aplicación de reinstalación de respuestas @paschalis con la ayuda de un administrador de paquetes antes de volver a montar el sistema para que sea de solo lectura:
# Reinstall app
$ADB_SH "pm install -r $apk_target_sys"
# Unmount system
$ADB_SH "mount -o remount,ro /"
El administrador de paquetes invocará a dex2oat por sí mismo.
Script de Windows para aquellos interesados:
Almacene este archivo de la misma manera: en la raíz del directorio de su proyecto (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