当前位置: 首页 > 知识库问答 >
问题:

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

傅长恨
2023-03-14

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

除了那些已经在其上可用的命令外,我们是否可以在Android设备的shell中添加一些额外的命令?

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

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

adb shell ls /system/bin 

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

有什么办法可以做到吗?还是不可能?

共有1个答案

段干高歌
2023-03-14

答案提供了通过Eclipse(过时)和Android Studio(撰写本文时为4.1以上)为Android Shell构建可执行文件的一系列步骤。最后一个包括ndk-buildcmake

作为示例,请考虑mycommand.c:

#include <stdio.h>

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

假设NDK位置设置在Eclipse中,创建一个新的Android应用程序项目并执行以下步骤。

>

  • 添加本机支持。在项目资源管理器>Android Tools>添加本机支持>完成中右键单击项目

    添加源代码,即将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/ /mycommand 下找到它。

    *all支持的CPU体系结构的二进制文件在此生成。使用adb shell cat/proc/cpuinfo找出CPU体系结构,并根据支持的ABI设置app_abi

    步骤如下。

    >

  • mycommand.candroid.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"
            }
        }
    }
    

    >

  • 使用本机C++模板创建项目。

    mycommand.c添加到/app/src/main/cpp文件夹并编辑cmakelists.txt:

    cmake_minimum_required(VERSION x.x.x)
    
    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/ /mycommand 下找到可执行文件

    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
    

    现在,您可以shell到设备中(使用adb shell)并执行该命令。

    >

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

     $ /data/local/tmp/mycommand
     My Command!
    

    在根设备上,如果二进制文件已复制到/system/bin,您可以通过文件名调用它:

     $ mycommand
     My Command!
    

  •  类似资料:
    • 我想使用pyInstaller的单文件夹模式,但我不想每次都收集所有依赖项。 大多数情况下,我可以重用它以前打包的所有依赖项,我只需要可执行文件,我想如果我能在构建过程中尽快停止,我会在构建过程中节省10~20分钟。exe文件已生成。 我知道用-F标志将所有依赖项打包到一个可执行文件中,但这不是我想要的。我只希望pyInstaller在打包步骤之前停止。 我希望生成在可能输出时立即停止:

    • 我正在尝试建立基于Maven的应用程序的jar文件。所以我不需要将外部jar库包含到我的构建中。我需要我的应用程序在运行时从本地maven存储库或从本地文件夹提供这种外部依赖,这些将包含这些外部库。我为此依赖项配置pom文件,如下所示: 并尝试使用前缀运行这个jar。我正在用这个答案。

    • 问题内容: 因此,每个人都可能知道glibc 可以像普通可执行文件一样在shell中执行,在这种情况下,它会打印其版本信息并退出。这是通过在.so中定义一个入口点来完成的。在某些情况下,将其用于其他项目也可能很有趣。不幸的是,您可以通过ld的- e选项设置的低级入口点太低级:动态加载程序不可用,因此您无法调用任何适当的库函数。因此,glibc在此入口点通过裸系统调用实现write()系统调用。 我

    • 我试图在Spring Boot+Gradle项目中构建一个可执行的jar,但目前没有任何工作。下面是最简单的结构。可能,Gradle配置中缺少一些东西。 格雷德尔: 主配置文件: 当我运行java-jar1.jar这样的jar文件时,出现了以下异常: 可能出了什么问题?

    • 问题内容: 我已经成功构建了使用本机(JNI)库的Android应用(GUI)。 但是,现在我想创建一个从命令行运行的可执行文件(root特权),并且根本不使用GUI。我该如何构建类似的东西? 问题答案: 从NDK r8d开始,这可以通过更简单的方式解决。 创建具有以下目录层次结构的项目: 使用以下内容填写Android.mk。最重要的是最后一行。检查NDK文档中其他变量的含义。 转到目录,然后键

    • 我制作了一个包含5-6的小PyQt应用程序。py文件。现在我想把它们编译成一个主文件,这意味着它必须从一个主窗口运行。 我的py文件已成功相互连接。我已经使用pyinstaller生成了可执行文件,但问题是每个文件都是我自己构建的。将py文件转换为自己的文件。exe文件。但我想订一张单人票。exe文件,通过它所有的。可以使用py文件。 如何建立所有。将文件压缩为单个文件。exe文件?