为Androidshell构build可执行文件
有时我需要在设备上运行一个命令或脚本,但它们不可用或不存在。
我们可以添加一些额外的命令到Android
设备的shell
,除了那些已经可用的命令?
例如,将screenrecord
命令添加到我的设备(我的设备具有低于19的Android
API),这是不可用的。
我知道如何使用adb shell
获取设备上的可用命令列表
adb shell ls /system/bin
但我想添加更多的自定义命令和脚本,做一些特殊的工作。
有没有办法做到这一点? 或者这是不可能的?
答案提供了通过Eclipse
和Android Studio
2.2+ ndk-build
Android Studio
可执行文件的一系列步骤,包括ndk-build
和CMake
。
I.准备源代码
作为一个例子,考虑mycommand.c
:
#include <stdio.h> int main() { printf("My Command!\n"); return 0; }
II。 build立可执行
蚀
假设在Eclipse
设置了NDK
位置,请创build一个新的Android Application Project
并执行以下步骤。
-
添加本地支持 。 右键单击
Project Explorer
中的Project Explorer
>Android Tools
>Add Native Support
>Finish
-
添加源代码 ,
mycommand.c
放在project_root
/jni
文件夹下。 -
在
project_root
/jni
下编辑Android.mk
,如下所示:LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := mycommand LOCAL_SRC_FILES := mycommand.c include $(BUILD_EXECUTABLE)
-
在
project_root
/jni
文件夹下创buildApplication.mk
*:APP_ABI := all
-
构build可执行文件并在
project_root/libs/<abi>/mycommand
下find它。
* all
支持的CPU架构的二进制文件在这里生成。 使用adb shell cat /proc/cpuinfo
查找CPU体系结构,并根据受支持的ABI设置APP_ABI
。
Android Studio和ndk-build
步骤如下。
- 添加
mycommand.c
,Android.mk
(与上面的Eclipse
部分相同)到/app/src/main/cpp
文件夹。 -
编辑
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" } } }
-
构build项目并在
/app/.externalNativeBuild/ndkBuild/debug/obj/local/<abi>/mycommand
下find可执行文件
Android Studio和CMake
-
将
mycommand.c
添加到/app/src/main/cpp
文件夹并编辑CMakeLists.txt
:cmake_minimum_required(VERSION xxx) add_executable(mycommand src/main/cpp/mycommand.c )
-
编辑
build.gradle
:android { ... defaultConfig { ... externalNativeBuild { cmake { targets "mycommand" // use a specific ABI filter if needed // abiFilters "armeabi-v7a" } } } externalNativeBuild { cmake { path "CMakeLists.txt" } } }
-
构build项目并在
/app/.externalNativeBuild/cmake/debug/<abi>/mycommand
下find可执行文件
III。 将二进制压入设备
将mycommand
二进制文件从它所在的位置推入设备。 请记住,SD卡上的文件默认是不可执行的,所以二进制文件应该被压入设备的内部存储器。 取决于设备是否被植根,你有以下select:
-
在无根设备上,您可以将二进制文件推送到
/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 EXECUTABLE PERMISSION( 可选 )
将二进制文件的权限设置为可执行文件( 在/data/local/tmp
情况下不需要执行此操作 )。 在chmod 555
(r-xr-xr-x)下方使用:
adb shell chmod 555 /path/to/mycommand
V.运行命令
现在你可以将shell装入你的设备(使用adb shell
)并执行命令。
-
在没有根目录的设备上使用命令的绝对path:
$ /data/local/tmp/mycommand My Command!
-
在根目录的设备上,如果二进制文件已被复制到
/system/bin
,则可以通过文件名来调用它:$ mycommand My Command!