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

标签 android c shell android-ndk executable

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

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

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

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

adb shell ls /system/bin 

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

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

最佳答案

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


我。准备源代码

例如考虑 mycommand.c :

#include <stdio.h>

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

二。构建可执行文件

Eclipse(可能已过时)

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

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

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

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

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

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

*all 的二进制文件支持的 CPU 架构在此处生成。使用 adb shell cat /proc/cpuinfo找出CPU架构并设置APP_ABI根据 Supported ABIs .


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"
            }
        }
    }
    
  3. 构建项目并在/app/.externalNativeBuild/ndkBuild/debug/obj/local/<abi>/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/<abi>/mycommand下找到可执行文件


三。将二进制文件推送到设备

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

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

     adb push mycommand /data/local/tmp
    
  • 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
    

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

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

adb shell chmod 555 /path/to/mycommand

V.运行命令

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

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

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

     $ mycommand
     My Command!
    

关于android - 如何为 Android shell 构建可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35231168/

相关文章:

linux - shell脚本错误

c - 相当于 shell bash 中的 "(cond)? val_true : val_false"

android - Zxing 相机在 Android 上的人像模式

java - 致命异常 NoClassDefFoundError

c - 中缀到后缀 C 程序

C printf 0标志和宽度属性与精度标志之间的区别

android - OnItemClick播放音频不起作用

android - obd适配器的初始化

android - Nexus 7 上的 droid-VNC 服务器显示嘈杂的白屏

shell - Clojure 中最常见的 shell 脚本编写方式是什么?