簡體   English   中英

如何為 Android shell 構建可執行文件

[英]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-buildCMake


一、准備源代碼

mycommand.c

#include <stdio.h>

int main()
{
    printf("My Command!\n");
    return 0;
}

二、 構建可執行文件

Eclipse(可能已經過時)

假設在Eclipse設置了NDK位置,創建一個新的Android Application Project並執行以下步驟。

  1. 添加原生支持 Project Explorer > Android Tools > Add Native Support > Finish右鍵單擊該項目

  2. 添加源代碼,即把mycommand.c放在project_root / jni文件夾下。

  3. 編輯project_root / jni下的Android.mk如下:

     LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := mycommand LOCAL_SRC_FILES := mycommand.c include $(BUILD_EXECUTABLE)
  4. project_root / jni文件夾下創建Application.mk *:

     APP_ABI := all
  5. 構建可執行文件並在project_root/libs/<abi>/mycommand下找到它。

*此處生成all支持的 CPU 架構的二進制文件。 使用adb shell cat /proc/cpuinfo找出 CPU 架構並根據Supported APP_ABI設置APP_ABI


Android Studio 和 ndk-build

步驟如下。

  1. mycommand.cAndroid.mk (與上面的Eclipse部分相同)添加到/app/src/main/cpp文件夾。

  2. 編輯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" } } }
  3. 構建項目並在/app/.externalNativeBuild/ndkBuild/debug/obj/local/<abi>/mycommand下找到可執行文件


Android Studio 和 CMake

  1. 使用本機 C++模板創建一個項目。

  2. mycommand.c添加/app/src/main/cpp文件夾並編輯CMakeLists.txt

     cmake_minimum_required(VERSION xxx) add_executable(mycommand mycommand.c )
  3. 編輯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" } } }
  4. 構建項目並在/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM