Rah*_*isi 7 c shell executable android android-ndk
有时我需要在我的设备上运行命令或脚本,但它们不可用或不存在.
我们可以向Android
设备添加一些额外的命令shell
,除了那些已经可用的命令吗?
例如,将screenrecord
命令添加到我的设备(我的设备的Android
API低于19),这是不可用的.
我知道如何获取设备上的可用命令列表 adb shell
adb shell ls /system/bin
Run Code Online (Sandbox Code Playgroud)
但我想添加更多的自定义命令和脚本,做一些特殊的工作.
有什么办法吗?或者这不可能?
Oni*_*nik 27
答案提供了一系列步骤,用于Android shell
通过both Eclipse
和Android Studio
2.2+ 构建可执行文件.最后包括ndk-build
和CMake
.
作为一个例子考虑mycommand.c
:
#include <stdio.h>
int main()
{
printf("My Command!\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
假设NDK
已设置位置Eclipse
,请创建新的Android Application Project
并执行以下步骤.
添加原生支持.右键单击项目Project Explorer
> Android Tools
> Add Native Support
>Finish
添加源代码,即把mycommand.c
下project_root
/ jni
文件夹中.
Android.mk
在project_root
/ 下编辑jni
如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mycommand
LOCAL_SRC_FILES := mycommand.c
include $(BUILD_EXECUTABLE)
Run Code Online (Sandbox Code Playgroud)Application.mk
在project_root
/ jni
文件夹下创建*:
APP_ABI := all
Run Code Online (Sandbox Code Playgroud)构建可执行文件,并在找到它project_root/libs/<abi>/mycommand
.
*此处生成支持的CPU体系结构的二进制文件all
.使用adb shell cat /proc/cpuinfo
找出CPU架构和设置APP_ABI
按支持的ABI.
步骤如下.
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"
}
}
}
Run Code Online (Sandbox Code Playgroud)构建项目并在其下找到可执行文件/app/.externalNativeBuild/ndkBuild/debug/obj/local/<abi>/mycommand
添加mycommand.c
到/app/src/main/cpp
文件夹并编辑CMakeLists.txt
:
cmake_minimum_required(VERSION x.x.x)
add_executable(mycommand
src/main/cpp/mycommand.c )
Run Code Online (Sandbox Code Playgroud)编辑build.gradle
:
android {
...
defaultConfig {
...
externalNativeBuild {
cmake {
targets "mycommand"
// use a specific ABI filter if needed
// abiFilters "armeabi-v7a"
}
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
}
Run Code Online (Sandbox Code Playgroud)构建项目并在其下找到可执行文件/app/.externalNativeBuild/cmake/debug/<abi>/mycommand
将mycommand
二进制文件从它所在的位置推送到您的设备中.请记住,SD卡上的文件默认不可执行,因此应将二进制文件推送到设备的内部存储器中.根据设备是否已植根,您有以下选择:
在非root设备上,您可以将二进制文件推送到/data/local/tmp
:
adb push mycommand /data/local/tmp
Run Code Online (Sandbox Code Playgroud)在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
Run Code Online (Sandbox Code Playgroud)将二进制文件的权限设置为可执行(如果是,则无需执行此操作/data/local/tmp
).使用下面的chmod 555
(r-xr-xr-x):
adb shell chmod 555 /path/to/mycommand
Run Code Online (Sandbox Code Playgroud)
现在您可以使用shell进入设备adb shell
并执行命令.
在非root设备上使用命令的绝对路径:
$ /data/local/tmp/mycommand
My Command!
Run Code Online (Sandbox Code Playgroud)在rooted设备上,如果已将二进制文件复制到/system/bin
,则可以通过文件名调用它:
$ mycommand
My Command!
Run Code Online (Sandbox Code Playgroud)