有时我需要在我的设备上运行命令或脚本,但它们不可用或不存在。
我们可以向Android
设备shell
添加一些额外的命令,
除了那些已经可用的命令?
例如,将screenrecord
命令添加到我的设备(我的设备的Android
API低于19),这是不可用的。
我知道如何使用adb shell
adb shell ls /system/bin
但我想添加更多自定义命令和脚本,以做一些特殊的工作。
有什么办法吗?或者它不可能?
答案 0 :(得分:23)
答案提供了一系列步骤,用于通过Android shell
和Eclipse
2.2+为Android Studio
构建可执行文件。最后一项包括ndk-build
和CMake
。
作为示例,请考虑mycommand.c
:
#include <stdio.h>
int main()
{
printf("My Command!\n");
return 0;
}
假设在NDK
中设置了Eclipse
位置,请创建新的Android Application Project
并执行以下步骤。
添加原生支持。右键单击Project Explorer
&gt;中的项目Android Tools
&gt; Add Native Support
&gt; 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
文件夹下创建Application.mk
*:
APP_ABI := all
构建可执行文件并在 project_root/libs/<abi>/mycommand
下找到它。
* 此处生成all
支持的CPU架构的二进制文件。使用adb shell cat /proc/cpuinfo
查找CPU架构,并根据Supported ABIs设置APP_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"
}
}
}
构建项目并在/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 )
修改build.gradle
:
android {
...
defaultConfig {
...
externalNativeBuild {
cmake {
targets "mycommand"
// use a specific ABI filter if needed
// abiFilters "armeabi-v7a"
}
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
}
构建项目并在/app/.externalNativeBuild/cmake/debug/<abi>/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
现在您可以使用adb shell
封装到您的设备中并执行命令。
在非root 设备上使用命令的绝对路径:
$ /data/local/tmp/mycommand
My Command!
在 rooted 设备上,如果已将二进制文件复制到/system/bin
,您可以通过文件名调用它:
$ mycommand
My Command!
答案 1 :(得分:2)
如果您在 Android和ndk-build 的此位置没有二进制文件,则它们位于
app\build\intermediates\ndkBuild\debug\obj\local\arm64-v8a\objs-debug\test1
适用于arm64-v8a,适用于其他平台。
答案 2 :(得分:0)
如果您收到此错误:
错误:使用 CMake 创建可执行文件时,仅支持位置独立可执行文件(PIE),
将这些行添加到app gradle
default config
{
..........
..........
externalNativeBuild
{
cmake
{
targets "my_command"
abiFilters "armeabi-v7a"
arguments "-DANDROID_PIE=ON" //important
}
}
...........
}