如何为Android shell构建可执行文件

Rah*_*isi 7 c shell executable android android-ndk

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

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

例如,将screenrecord命令添加到我的设备(我的设备的AndroidAPI低于19),这是不可用的.

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

adb shell ls /system/bin 
Run Code Online (Sandbox Code Playgroud)

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

有什么办法吗?或者这不可能?

Oni*_*nik 27

答案提供了一系列步骤,用于Android shell通过both EclipseAndroid Studio2.2+ 构建可执行文件.最后包括ndk-buildCMake.


I.准备源代码

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

#include <stdio.h>

int main()
{
    printf("My Command!\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

II.建立可执行的

日食

假设NDK已设置位置Eclipse,请创建新的Android Application Project并执行以下步骤.

  1. 添加原生支持.右键单击项目Project Explorer> Android Tools> Add Native Support>Finish

  2. 添加源代码,即把mycommand.cproject_root/ jni文件夹中.

  3. Android.mkproject_root/ 下编辑jni如下:

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_MODULE     := mycommand
    LOCAL_SRC_FILES  := mycommand.c
    
    include $(BUILD_EXECUTABLE)
    
    Run Code Online (Sandbox Code Playgroud)
  4. Application.mkproject_root/ jni文件夹下创建*:

    APP_ABI := all
    
    Run Code Online (Sandbox Code Playgroud)
  5. 构建可执行文件,并在找到它project_root/libs/<abi>/mycommand.

*此处生成支持的CPU体系结构的二进制文件all.使用adb shell cat /proc/cpuinfo找出CPU架构和设置APP_ABI支持的ABI.


Android Studio和ndk-build

步骤如下.

  1. 添加mycommand.c,Android.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"
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 构建项目并在其下找到可执行文件/app/.externalNativeBuild/ndkBuild/debug/obj/local/<abi>/mycommand


Android Studio和CMake

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

    cmake_minimum_required(VERSION x.x.x)
    
    add_executable(mycommand
                   src/main/cpp/mycommand.c )
    
    Run Code Online (Sandbox Code Playgroud)
  2. 编辑build.gradle:

    android {
        ...
        defaultConfig {
            ...
            externalNativeBuild {
                cmake {
                    targets "mycommand"
                    // use a specific ABI filter if needed
                    // abiFilters "armeabi-v7a"
                }
            }
        }
        externalNativeBuild {
            cmake {
                path "CMakeLists.txt"
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 构建项目并在其下找到可执行文件/app/.externalNativeBuild/cmake/debug/<abi>/mycommand


III.推入二进制设备

mycommand二进制文件从它所在的位置推送到您的设备中.请记住,SD卡上的文件默认不可执行,因此应将二进制文件推送到设备的内部存储器中.根据设备是否已植根,您有以下选择:

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

    adb push mycommand /data/local/tmp
    
    Run Code Online (Sandbox Code Playgroud)
  • root设备上,您可以将二进制文件推送到SD卡,然后将其复制到/system/bin(在以读写模式重新安装分区之后)以及其他可执行文件:

    adb push mycommand /path/to/sdcard
    adb shell
    su
    mount -o rw,remount /system
    cp /path/to/sdcard/mycommand /system/bin
    
    Run Code Online (Sandbox Code Playgroud)

IV.SET EXECUTABLE PERMISSION(可选)

将二进制文件的权限设置为可执行(如果是,则无需执行此操作/data/local/tmp).使用下面的chmod 555(r-xr-xr-x):

adb shell chmod 555 /path/to/mycommand
Run Code Online (Sandbox Code Playgroud)

五,运行命令

现在您可以使用shell进入设备adb shell并执行命令.