有时我需要在我的设备上运行命令或脚本,但它们不可用或不存在。
我们可以向 Android
设备的 shell
添加一些额外的命令吗?
除了那些已经可用的命令?
例如,在我的设备上添加screenrecord
命令(我的设备的Android
API低于19),这是不可用的。
我知道如何使用 adb shell
获取设备上的可用命令列表
adb shell ls /system/bin
但我想添加更多自定义命令和脚本,以做一些特殊的工作。
有什么办法吗?或者这是不可能的?
最佳答案
答案提供了为 Android shell
构建可执行文件的一系列步骤通过两者Eclipse
(过时的)和 Android Studio
(撰写本文时为 4.1+)。最后包括 ndk-build
和 CMake
.
我。准备源代码
例如考虑 mycommand.c
:
#include <stdio.h>
int main()
{
printf("My Command!\n");
return 0;
}
二。构建可执行文件
Eclipse(可能已过时)
假设NDK
位置设置在 Eclipse
, 创建一个新的 Android Application Project
并执行以下步骤。
添加 native 支持。右键单击
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)
创建
Application.mk
*在project_root
下/jni
文件夹:APP_ABI := all
构建可执行文件 并在
project_root/libs/<abi>/mycommand
下找到它.
*all
的二进制文件支持的 CPU 架构在此处生成。使用 adb shell cat /proc/cpuinfo
找出CPU架构并设置APP_ABI
根据 Supported ABIs .
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" } } }
构建项目并在
/app/.externalNativeBuild/ndkBuild/debug/obj/local/<abi>/mycommand
下找到可执行文件
Android Studio 和 CMake
使用 native C++ 模板创建项目。
添加
mycommand.c
到/app/src/main/cpp
文件夹并编辑CMakeLists.txt
:cmake_minimum_required(VERSION x.x.x) add_executable(mycommand mycommand.c )
编辑
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" } } }
构建项目并在
/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/