![](/img/trans.png)
[英]How to run a command before BUILD_EXECUTABLE is called in Android?
[英]How to build an executable for Android shell
有時我需要在我的設備上運行命令或腳本,但它們不可用或不存在。
我們可以在Android
設備的shell
添加一些額外的命令,除了那些已經可用的命令嗎?
例如,將screenrecord
命令添加到我的設備(我的設備具有低於 19 的Android
API),這是不可用的。
我知道如何使用adb shell
獲取設備上的可用命令列表
adb shell ls /system/bin
但我想添加更多自定義命令和腳本,以做一些特殊的工作。
有什么辦法嗎? 或者這是不可能的?
答案提供了通過Eclipse
(過時)和Android Studio
(撰寫本文時為 4.1+)為Android shell
構建可執行文件的一系列步驟。 最后一個包括ndk-build
和CMake
。
以mycommand.c
:
#include <stdio.h>
int main()
{
printf("My Command!\n");
return 0;
}
假設在Eclipse
設置了NDK
位置,創建一個新的Android Application Project
並執行以下步驟。
添加原生支持。 在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
文件夾下創建Application.mk
*:
APP_ABI := all
構建可執行文件並在project_root/libs/<abi>/mycommand
下找到它。
*此處生成all
支持的 CPU 架構的二進制文件。 使用adb shell cat /proc/cpuinfo
找出 CPU 架構並根據Supported APP_ABI
設置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
下找到可執行文件
使用本機 C++模板創建一個項目。
將mycommand.c
添加到/app/src/main/cpp
文件夾並編輯CMakeLists.txt
:
cmake_minimum_required(VERSION xxx) 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
二進制文件從它所在的位置推mycommand
您的設備中。 請記住,默認情況下 SD 卡上的文件不可執行,因此應將二進制文件推送到設備的內部存儲中。 根據設備是否植根,您有以下選項:
在非 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
現在您可以進入您的設備(使用adb shell
)並執行命令。
在非 root設備上使用命令的絕對路徑:
$ /data/local/tmp/mycommand My Command!
在root設備上,如果二進制文件已復制到/system/bin
,您可以通過文件名調用它:
$ mycommand My Command!
如果您在此位置沒有Android 和 ndk-build 的二進制文件,它們位於
app\\build\\intermediates\\ndkBuild\\debug\\obj\\local\\arm64-v8a\\objs-debug\\test1
適用於 arm64-v8a,其他平台對應。
如果您收到此錯誤:
錯誤:當您使用CMake創建可執行文件時,僅支持位置無關可執行文件 (PIE) ,
將這些行添加到 app gradle
default config
{
..........
..........
externalNativeBuild
{
cmake
{
targets "my_command"
abiFilters "armeabi-v7a"
arguments "-DANDROID_PIE=ON" //important
}
}
...........
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.