为了账号安全,请及时绑定邮箱和手机立即绑定

如何为Android shell构建可执行文件

/ 猿问

如何为Android shell构建可执行文件

翻过高山走不出你 2019-08-19 16:59:24

如何为Android shell构建可执行文件

有时我需要在我的设备上运行命令或脚本,但它们不可用或不存在。

我们可以向Android设备添加一些额外的命令shell,除了那些已经可用的命令吗?

例如,将screenrecord命令添加到我的设备(我的设备的AndroidAPI低于19),这是不可用的。

我知道如何获取设备上的可用命令列表 adb shell

adb shell ls /system/bin

但我想添加更多的自定义命令和脚本,做一些特殊的工作。

有什么办法吗?或者这不可能?


查看完整描述

3 回答

?
慕哥9229398

答案提供了一系列步骤,用于Android shell通过both EclipseAndroid Studio2.2+ 构建可执行文件。最后包括ndk-buildCMake


I.准备源代码

作为一个例子考虑mycommand.c

#include <stdio.h>int main(){
    printf("My Command!\n");
    return 0;}

II。建立可执行的

日食

假设NDK已设置位置Eclipse,请创建新的Android Application Project并执行以下步骤。

  1. 添加原生支持。右键单击项目Project ExplorerAndroid ToolsAdd Native Support>Finish

  2. 添加源代码,即把mycommand.cproject_rootjni文件夹中。

  3. Android.mkproject_root/ 下编辑jni如下:

    LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE     := mycommand
    LOCAL_SRC_FILES  := mycommand.c
    
    include $(BUILD_EXECUTABLE)
  4. Application.mkproject_rootjni文件夹下创建 * :

    APP_ABI := all
  5. 构建可执行文件,并在找到它project_root/libs/<abi>/mycommand

此处生成支持的CPU体系结构的二进制文件all。使用adb shell cat /proc/cpuinfo找出CPU架构和设置APP_ABI支持的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. 添加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卡上的文件默认不可执行,因此应将二进制文件推送到设备的内部存储器中。根据设备是否已植根,您有以下选择:

  • 非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

IV。SET EXECUTABLE PERMISSION(可选

将二进制文件的权限设置为可执行(如果是,则无需执行此操作/data/local/tmp)。使用下面的chmod 555(r-xr-xr-x):

adb shell chmod 555 /path/to/mycommand

五,运行命令

现在您可以使用shell进入设备adb shell并执行命令。

  • 非root设备上使用命令的绝对路径:

    $ /data/local/tmp/mycommandMy Command!
  • rooted设备上,如果已将二进制文件复制到/system/bin,则可以通过文件名调用它:

    $ mycommand
    My Command!


查看完整回答
反对 回复 2019-08-19
?
精慕HU

如果您在Android和ndk-build的此位置没有二进制文件,则它们位于

app\build\intermediates\ndkBuild\debug\obj\local\arm64-v8a\objs-debug\test1

适用于arm64-v8a,适用于其他平台。


查看完整回答
反对 回复 2019-08-19
?
幕布斯5086720

如果您收到此错误:


错误:使用CMake创建可执行文件时,仅支持位置无关的可执行文件(PIE),


将这些行添加到app gradle


default config

{

..........

..........

externalNativeBuild

{

 cmake 

  { 

   targets "my_command"

   abiFilters "armeabi-v7a"

   arguments "-DANDROID_PIE=ON" //important

  }

 }

...........

}


查看完整回答
反对 回复 2019-08-19

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信