tutorial studio móviles minsdkversion manager desarrollo curso code cambiar aplicaciones android android-studio

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

  1. Ir a Ejecutar -> Editar Configuraciones
  2. 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 + , luego Run 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

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