Cómo construir un ejecutable para el shell de Android

A veces necesito ejecutar un comando o script en mi dispositivo, pero no están disponibles o no existen.

¿Podemos agregar algunos comandos adicionales al shell del dispositivo Android , excepto aquellos comandos que ya están disponibles en él?

Por ejemplo, agregue el comando screenrecord a mi dispositivo (mi dispositivo tiene una API de Android menor que 19), que no está disponible en él.

Sé cómo obtener la lista de comandos disponibles en el dispositivo con adb shell

 adb shell ls /system/bin 

pero quiero agregar más comandos y scripts personalizados, para hacer algo especial y trabajar.

¿Hay alguna forma de hacerlo? O es imposible?

La respuesta proporciona una secuencia de pasos para construir un ejecutable para el Android shell través de Eclipse y Android Studio 2.2+. El último incluye ndk-build y CMake .


I. PREPARE EL CÓDIGO FUENTE

Como ejemplo, considere mycommand.c :

 #include  int main() { printf("My Command!\n"); return 0; } 

II. CONSTRUIR EJECUTABLE

Eclipse

En el supuesto de que la ubicación NDK esté configurada en Eclipse , cree un nuevo Android Application Project y siga los siguientes pasos.

  1. Agregue soporte nativo . Haga clic con el botón derecho en el proyecto en Project Explorer > Android Tools > Add Native Support > Finish

  2. Agregue el código fuente , es decir, ponga mycommand.c en la carpeta project_root / jni .

  3. Edite Android.mk en project_root / jni siguiente manera:

     LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := mycommand LOCAL_SRC_FILES := mycommand.c include $(BUILD_EXECUTABLE) 
  4. Crea Application.mk * debajo de la carpeta project_root / jni :

     APP_ABI := all 
  5. Crea ejecutable y encuéntralo en project_root/libs//mycommand .

* Aquí se generan binarios para all architectures de CPU soportadas. Use adb shell cat /proc/cpuinfo para averiguar la architecture de la CPU y configure APP_ABI según APP_ABI admitidos .


Android Studio y ndk-build

Los pasos son los siguientes.

  1. Agregue mycommand.c , Android.mk (igual que en la sección Eclipse anterior) a la carpeta /app/src/main/cpp .
  2. Edite build.gradle :

     android { ... defaultConfig { ... externalNativeBuild { ndkBuild { targets "mycommand" // use a specific ABI filter if needed // abiFilters "armeabi-v7a" } } } externalNativeBuild { ndkBuild { path "src/main/cpp/Android.mk" } } } 
  3. /app/.externalNativeBuild/ndkBuild/debug/obj/local//mycommand el proyecto y encuentra el ejecutable en /app/.externalNativeBuild/ndkBuild/debug/obj/local//mycommand


Android Studio y CMake

  1. Agregue mycommand.c a la mycommand.c /app/src/main/cpp y edite CMakeLists.txt :

     cmake_minimum_required(VERSION xxx) add_executable(mycommand src/main/cpp/mycommand.c ) 
  2. Edite build.gradle :

     android { ... defaultConfig { ... externalNativeBuild { cmake { targets "mycommand" // use a specific ABI filter if needed // abiFilters "armeabi-v7a" } } } externalNativeBuild { cmake { path "CMakeLists.txt" } } } 
  3. Crear proyecto y encontrar el ejecutable en /app/.externalNativeBuild/cmake/debug//mycommand


III. EMPUJA BINARIO EN DISPOSITIVO

Empuje mycommand binario de mycommand desde donde está ubicado en su dispositivo. Tenga en cuenta que los archivos en la tarjeta SD no son ejecutables de forma predeterminada, por lo que el binario debe insertarse en el almacenamiento interno del dispositivo. Dependiendo de si el dispositivo está rooteado o no, tiene las siguientes opciones:

  • En un dispositivo no rooteado , puede enviar el binario a /data/local/tmp :

     adb push mycommand /data/local/tmp 
  • En el dispositivo rooteado , puede insertar el binario en la tarjeta SD y luego copiarlo en /system/bin (luego de volver a montar la partición en modo lectura-escritura) junto con los otros archivos ejecutables:

     adb push mycommand /path/to/sdcard adb shell su mount -o rw,remount /system cp /path/to/sdcard/mycommand /system/bin 

IV. ESTABLECER PERMISO EJECUTADO ( opcional )

Establezca el permiso del binario para que sea ejecutable ( no es necesario hacer esto en el caso de /data/local/tmp ). Debajo se usa chmod 555 (r-xr-xr-x):

 adb shell chmod 555 /path/to/mycommand 

V. EJECUTAR COMANDO

Ahora puede shell en su dispositivo (con adb shell ) y ejecutar el comando.

  • En dispositivos no rooteados , use la ruta absoluta al comando:

     $ /data/local/tmp/mycommand My Command! 
  • En el dispositivo rooteado , en caso de que el binario se haya copiado a /system/bin , puede llamarlo por el nombre del archivo:

     $ mycommand My Command! 

Si en caso de recibir este error:

error: solo los ejecutables independientes de posición (PIE) son compatibles cuando creó el ejecutable usando CMake ,

agregue estas líneas al gradle de aplicaciones

 default config { .......... .......... externalNativeBuild { cmake { targets "my_command" abiFilters "armeabi-v7a" arguments "-DANDROID_PIE=ON" //important } } ........... }