Как собрать исполняемый файл для оболочки Android
Иногда мне нужно запустить команду или скрипт на моем устройстве, но они недоступны или не существуют.
Можем ли мы добавить некоторые дополнительные команды Android
устройства; shell
кроме тех команд, которые уже доступны на нем?
Например, добавить screenrecord
Команда на мое устройство (мое устройство имеет Android
API ниже 19), что на нем этого недоступно.
Я знаю, как получить список доступных команд на устройстве с adb shell
adb shell ls /system/bin
но я хочу добавить больше пользовательских команд и скриптов, сделать что-то особенное и работать.
Есть ли способ сделать это? Или это невозможно?
2 ответа
Ответ содержит последовательность шагов для создания исполняемого файла для Android shell
через оба Eclipse
а также Android Studio
2.2+. Последнее включает в себя ndk-build
а также CMake
,
I. ПОДГОТОВЬТЕ КОД ИСТОЧНИКА
В качестве примера рассмотрим mycommand.c
:
#include <stdio.h>
int main()
{
printf("My Command!\n");
return 0;
}
II. СТРОИТЬ ИСПОЛНИТЕЛЬНЫЙ
Затмение
В предположении, что 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)
Создайте
Application.mk
* подproject_root
/jni
папка:APP_ABI := all
Создайте исполняемый файл и найдите его в
project_root/libs/<abi>/mycommand
,
* Двоичные файлы для all
поддерживаемые архитектуры ЦП генерируются здесь. использование adb shell cat /proc/cpuinfo
выяснить архитектуру процессора и установить APP_ABI
согласно поддерживаемым ABI.
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 и CMake
добавлять
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
III. НАЖАТЬ БИНАРЬ В УСТРОЙСТВО
От себя mycommand
бинарный, откуда он находится в вашем устройстве. Помните, что файлы на SD-карте не являются исполняемыми по умолчанию, поэтому двоичный файл следует поместить во внутреннюю память устройства. В зависимости от того, является ли устройство рутованным или нет, у вас есть следующие варианты:
На некорневом устройстве вы можете нажать
/data/local/tmp
:adb push mycommand /data/local/tmp
На рутированном устройстве вы можете вставить двоичный файл на 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. RUN COMMAND
Теперь вы можете подключиться к вашему устройству (с adb shell
) и выполните команду.
На некорневом устройстве используйте абсолютный путь к команде:
$ /data/local/tmp/mycommand My Command!
На рутированном устройстве, если двоичный файл был скопирован в
/system/bin
Вы можете назвать его по имени файла:$ mycommand My Command!
Если у вас нет бинарных файлов в этом месте для Android и ndk-build, они находятся по адресу
app\build\intermediates\ndkBuild\debug\obj\local\arm64-v8a\objs-debug\test1
для arm64-v8a и соответствующих для других платформ.
Если в случае, если вы получаете эту ошибку:
ошибка: только независимые от позиции исполняемые файлы (PIE) поддерживаются при создании исполняемого файла с использованием CMake,
добавить эти строки в приложение Gradle
default config
{
..........
..........
externalNativeBuild
{
cmake
{
targets "my_command"
abiFilters "armeabi-v7a"
arguments "-DANDROID_PIE=ON" //important
}
}
...........
}