为Androidshell构build可执行文件

有时我需要在设备上运行一个命令或脚本,但它们不可用或不存在。

我们可以添加一些额外的命令到Android设备的shell ,除了那些已经可用的命令?

例如,将screenrecord命令添加到我的设备(我的设备具有低于19的Android API),这是不可用的。

我知道如何使用adb shell获取设备上的可用命令列表

 adb shell ls /system/bin 

但我想添加更多的自定义命令和脚本,做一些特殊的工作。

有没有办法做到这一点? 或者这是不可能的?

答案提供了通过EclipseAndroid Studio 2.2+ ndk-build Android Studio可执行文件的一系列步骤,包括ndk-buildCMake


I.准备源代码

作为一个例子,考虑mycommand.c

 #include <stdio.h> int main() { printf("My Command!\n"); return 0; } 

II。 build立可执行

假设在Eclipse设置了NDK位置,请创build一个新的Android Application Project并执行以下步骤。

  1. 添加本地支持 。 右键单击Project Explorer中的Project Explorer > Android Tools > Add Native Support > Finish

  2. 添加源代码mycommand.c放在project_root / jni文件夹下。

  3. project_root / jni编辑Android.mk ,如下所示:

     LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := mycommand LOCAL_SRC_FILES := mycommand.c include $(BUILD_EXECUTABLE) 
  4. project_root / jni文件夹下创buildApplication.mk *:

     APP_ABI := all 
  5. 构build可执行文件并在project_root/libs/<abi>/mycommand下find它。

* all支持的CPU架构的二进制文件在这里生成。 使用adb shell cat /proc/cpuinfo查找CPU体系结构,并根据受支持的ABI设置APP_ABI


Android Studio和ndk-build

步骤如下。

  1. 添加mycommand.cAndroid.mk (与上面的Eclipse部分相同)到/app/src/main/cpp文件夹。
  2. 编辑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. 构build项目并在/app/.externalNativeBuild/ndkBuild/debug/obj/local/<abi>/mycommand下find可执行文件


Android Studio和CMake

  1. mycommand.c添加/app/src/main/cpp文件夹并编辑CMakeLists.txt

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

     android { ... defaultConfig { ... externalNativeBuild { cmake { targets "mycommand" // use a specific ABI filter if needed // abiFilters "armeabi-v7a" } } } externalNativeBuild { cmake { path "CMakeLists.txt" } } } 
  3. 构build项目并在/app/.externalNativeBuild/cmake/debug/<abi>/mycommand下find可执行文件


III。 将二进制压入设备

mycommand二进制文件从它所在的位置推入设备。 请记住,SD卡上的文件默认是不可执行的,所以二进制文件应该被压入设备的内部存储器。 取决于设备是否被植根,你有以下select:

  • 无根设备上,您可以将二进制文件推送到/data/local/tmp

     adb push mycommand /data/local/tmp 
  • 根源设备上,您可以将二进制文件推送到SD卡,然后将其与其他可执行文件一起复制到/system/bin (以读写模式重新挂载分区之后):

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

IV。 SET EXECUTABLE PERMISSION( 可选

将二进制文件的权限设置为可执行文件( /data/local/tmp情况下不需要执行此操作 )。 在chmod 555 (r-xr-xr-x)下方使用:

 adb shell chmod 555 /path/to/mycommand 

V.运行命令

现在你可以将shell装入你的设备(使用adb shell )并执行命令。

  • 没有根目录的设备上使用命令的绝对path:

     $ /data/local/tmp/mycommand My Command! 
  • 根目录的设备上,如果二进制文件已被复制到/system/bin ,则可以通过文件名来调用它:

     $ mycommand My Command!