如何构建Android外壳可执行如何构建Android外壳可执行(How to build an e

2019-05-11 15:15发布

有时候,我需要我的设备上运行一个命令或脚本,但他们不具备或不存在。

我们可以添加一些附加命令Android设备的shell ,但已经可以在它的命令?

例如,添加screenrecord命令到我的设备(我的设备具有Android API比19以下),这这是在其上不可用。

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

adb shell ls /system/bin 

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

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

Answer 1:

答案提供的一系列步骤建立一个可执行Android shell经过双方EclipseAndroid Studio 2.2+。 最后包括ndk-buildCMake


一,准备源代码

例如,考虑mycommand.c

#include <stdio.h>

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

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) 
  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按支持的ABI 。


Android的Studio和NDK建造

步骤如下。

  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


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. 建立项目下找到可执行/app/.externalNativeBuild/cmake/debug/<abi>/mycommand


III。 PUSH BINARY到设备

mycommand由所在插入设备的二进制文件。 请记住,SD卡上的文件默认情况下不被执行,这样二进制要推入设备的内部存储。 根据的设备是否是植根与否,你有以下几种选择:

  • 无根设备,你可以把二进制到/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可执行权限( 可选

设置的二进制文件的权限是可执行文件( 没有必要的情况下做到这一点/data/local/tmp )。 下面chmod 555 (R-XR-XR-x)被使用:

adb shell chmod 555 /path/to/mycommand

五,运行命令

现在,您可以壳到您的设备(与adb shell )并执行命令。

  • 非植根设备使用该命令的绝对路径:

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

     $ mycommand My Command! 


Answer 2:

如果你不在此位置为Android NDK和建造有二进制文件,他们是在

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

对arm64-V8A和相应的其他平台。



Answer 3:

如果万一您收到此错误:

错误:当您创建使用C进行可执行的唯一位置独立的可执行文件(PIE)的支持

添加这些行的gradle应用

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


文章来源: How to build an executable for Android shell