Как собрать исполняемый файл для оболочки 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 и выполните следующие шаги.

  1. Добавить нативную поддержку. Щелкните правой кнопкой мыши на проекте в Project Explorer > Android Tools > Add Native Support > Finish

  2. Добавить исходный код, т.е. поставить mycommand.c под project_root / jni папка.

  3. редактировать Android.mk под project_root / jni следующее:

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_MODULE     := mycommand
    LOCAL_SRC_FILES  := mycommand.c
    
    include $(BUILD_EXECUTABLE)
    
  4. Создайте Application.mk * под project_root / jni папка:

    APP_ABI := all
    
  5. Создайте исполняемый файл и найдите его в project_root/libs/<abi>/mycommand,

* Двоичные файлы для all поддерживаемые архитектуры ЦП генерируются здесь. использование adb shell cat /proc/cpuinfo выяснить архитектуру процессора и установить APP_ABI согласно поддерживаемым ABI.


Android Studio и ndk-build

Шаги следующие.

  1. добавлять mycommand.c , Android.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 и CMake

  1. добавлять mycommand.c к /app/src/main/cpp папка и редактировать CMakeLists.txt:

    cmake_minimum_required(VERSION x.x.x)
    
    add_executable(mycommand
                   src/main/cpp/mycommand.c )
    
  2. редактировать build.gradle:

    android {
        ...
        defaultConfig {
            ...
            externalNativeBuild {
                cmake {
                    targets "mycommand"
                    // use a specific ABI filter if needed
                    // abiFilters "armeabi-v7a"
                }
            }
        }
        externalNativeBuild {
            cmake {
                path "CMakeLists.txt"
            }
        }
    }
    
  3. Создайте проект и найдите исполняемый файл в разделе /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
  }
 }
...........
}
Другие вопросы по тегам