【问题标题】:How to build an executable for Android shell如何为 Android shell 构建可执行文件
【发布时间】:2016-05-15 20:16:05
【问题描述】:

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

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

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

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

adb shell ls /system/bin 

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

有什么办法吗?还是不可能?

【问题讨论】:

    标签: android c shell android-ndk executable


    【解决方案1】:

    答案提供了通过Eclipse(已过时)和Android Studio(在撰写本文时为4.1+)为Android shell 构建可执行文件的一系列步骤。最后一个包括ndk-buildCMake


    我。准备源代码

    mycommand.c为例:

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

    二。构建可执行文件

    Eclipse(可能已经过时)

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

    1. 添加原生支持。右击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文件夹下创建Application.mk *:

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

    *此处生成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/&lt;abi&gt;/mycommand下找到可执行文件


    Android Studio 和 CMake

    1. 使用 Native C++ 模板创建项目。

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

      cmake_minimum_required(VERSION x.x.x)
      
      add_executable(mycommand
                     mycommand.c )
      
    3. 编辑build.gradle

      android {
          ...
          defaultConfig {
              ...
              externalNativeBuild {
                  cmake {
                      targets "mycommand"
                      // use a specific ABI filter if needed
                      // abiFilters "armeabi-v7a"
                  }
              }
          }
          ...
          externalNativeBuild {
              cmake {
                  path "src/main/cpp/CMakeLists.txt"
              }
          }
      }
      
    4. 构建项目并在/app/build/intermediates/cmake/debug/obj/&lt;abi&gt;/mycommand下找到可执行文件


    三。将二进制文件推入设备

    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
      

    四。设置可执行权限(可选

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

    adb shell chmod 555 /path/to/mycommand
    

    V.运行命令

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

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

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

       $ mycommand
       My Command!
      

    【讨论】:

    • 在第 3 步中,您可以运行 adb root &amp;&amp; adb remount,这应该会简化一些事情,尤其是对于最近的 Android 版本
    • 好的。我创建并清空项目。,将mycommand.cAndroid.mk 添加到我在app/src/main/ 中创建的cpp 文件夹中,并通过简单地添加推荐的内容(对于其中的ndk 案例)编辑build.gradle,然后构建apk .构建失败并出现以下错误:
    • “在 org.gradle.api.Project 类型的根项目 'MyConsoleApplication4' 上找不到参数 [build_4wbyjnnxfo36n8uu8rkjatpia$_run_closure1@332ef9dd] 的方法 android()。”
    • 您好,抱歉耽搁了。目前在 Android Studio 中,您应该选择位于 Phone and Tablet 选项卡上的 Native C++ 模板(向下滚动到模板)。
    • 目前答案的 Android-Studio-with-CMake 部分是最新的。
    【解决方案2】:

    如果您遇到此错误:

    错误:当您使用 CMake 创建可执行文件时,仅支持与位置无关的可执行文件 (PIE),

    将这些行添加到 app gradle

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

    【讨论】:

      【解决方案3】:

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

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

      arm64-v8a 对应其他平台。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-03
        • 2014-04-21
        • 1970-01-01
        • 1970-01-01
        • 2019-03-02
        • 1970-01-01
        • 1970-01-01
        • 2021-04-27
        相关资源
        最近更新 更多