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

时间:2016-02-05 18:35:40

标签: android c shell android-ndk executable

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

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

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

我知道如何使用adb shell

获取设备上的可用命令列表
adb shell ls /system/bin 

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

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

3 个答案:

答案 0 :(得分:23)

答案提供了一系列步骤,用于通过Android shellEclipse 2.2+为Android Studio构建可执行文件。最后一项包括ndk-buildCMake

予。准备源代码

作为示例,请考虑mycommand.c

#include <stdio.h>

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

II。建立可执行的

的Eclipse

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

  1. 添加原生支持。右键单击Project Explorer&gt;中的项目Android Tools&gt; Add Native Support&gt; 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文件夹下创建Application.mk *:

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

  6. * 此处生成all支持的CPU架构的二进制文件。使用adb shell cat /proc/cpuinfo查找CPU架构,并根据Supported ABIs设置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. 构建项目并在/app/.externalNativeBuild/ndkBuild/debug/obj/local/<abi>/mycommand

    4. 下找到可执行文件

      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 )
        
      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. 构建项目并在/app/.externalNativeBuild/cmake/debug/<abi>/mycommand

      4. 下找到可执行文件

        III。推入二进制设备

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

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

          adb push mycommand /data/local/tmp
          
        • rooted 设备上,您可以将二进制文件推送到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。设置可执行的权限(可选

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

        adb shell chmod 555 /path/to/mycommand
        

        诉运行命令

        现在您可以使用adb shell封装到您的设备中并执行命令。

        • 非root 设备上使用命令的绝对路径:

          $ /data/local/tmp/mycommand
          My Command!
          
        • rooted 设备上,如果已将二进制文件复制到/system/bin,您可以通过文件名调用它:

          $ mycommand
          My Command!
          

答案 1 :(得分:2)

如果您在 Android和ndk-build 的此位置没有二进制文件,则它们位于

app\build\intermediates\ndkBuild\debug\obj\local\arm64-v8a\objs-debug\test1

适用于arm64-v8a,适用于其他平台。

答案 2 :(得分:0)

如果您收到此错误:

错误:使用 CMake 创建可执行文件时,仅支持位置独立可执行文件(PIE)

将这些行添加到app gradle

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