我应该在 Android 项目中的哪里添加二进制可执行文件?

问题描述 投票:0回答:3

所以,我有为不同 CPU 构建的本机代码。我不想作为库加载,我想通过runtime.exec(...)执行二进制文件。

有没有办法将它们放在 Android 处理 CPU 限定符的某个地方?或者我必须制作不同的 APK 吗?

android android-ndk java-native-interface
3个回答
5
投票

制作不同的 APK 有时是一个不错的选择,可以减少下载大小。 想一想,每次更新都会有数十万人从 Play 商店下载这些额外的兆字节! 有一些创建和维护此类拆分 APK 的策略:保持版本号正确的顺序非常重要。请参阅 https://stackoverflow.com/a/20029256/192373 以及下面 Ashwin S Ashok 的改进。

无论您选择拆分 APK,还是保留一个整体 APK,请随意使用我的“专利”:将您的可执行文件放入

libs/armeabi-v7a
(或其他子文件夹,根据目标 ABI),并给它们命名以 lib 开头,以 .so 结束(例如
lib_vim_.so
)。这将打开安装魔力,并且相应的文件将被解压(并更新)到具有可执行权限的
/data/package/lib
文件夹中。


4
投票

Android Q+
(亲自用
Android 11
测试过)。自从发布了针对 Android 系统安全的新政策更改以来,您无法仅从
/data/data/package/files/...
文件夹正常执行二进制可执行文件。

W^X 违规详情: https://developer.android.com/about/versions/10/behavior-changes-10#execute-permission

Solution:

1。将可执行文件添加到 Android studio 中的本机库文件夹,例如。

app/libs/armeabi/executable

File structure here

2。还要将此行添加到您的清单(应用程序层)中:

<Application
...
     android:extractNativeLibs="true">
...
</application>

如果您使用较新版本的 Gradle 插件,您可能会遇到问题 您的可执行文件未打包到 apk 中或提取到。

/data/app/package/lib/.../...


然后你需要稍微欺骗一下 Android Gradle 插件。

Solution:

1。在文件资源管理器中创建文件夹结构

lib/armeabi/executable
(我使用armeabi只是作为示例,它可以是你的架构)

2。现在压缩这个

lib
文件夹并将其重命名为
yournaming.jar

3.复制并粘贴到您的 Android Studio

libs
目录

should look like this

4。转到您的

build.grade(app)
,在
dependencies
部分添加以下行 用于编译
.jar
.

dependencies {
    implementation fileTree(dir: 'libs', include: '*.jar')
    ...
}

5 构建您的

.apk
并使用
analyze tool
检查,现在应该在
.apk
本身中创建文件夹

如果完成所有这些步骤,现在可以尝试执行 exec 命令从 Android 应用程序运行二进制可执行文件:

try {
    // creating exec process
    Process process = 
    Runtime.getRuntime().exec(getApplicationInfo().nativeLibraryDir + 
"/executable");
    // reading and printing executable outcome
    byte[] buffer = new byte[2048];
            process.waitFor();
            process.getInputStream().read(buffer, 0 , buffer.length);
            System.out.println(new String(buffer));

} catch (IOException | InterruptedException e) 
{
        e.printStackTrace();
}

希望能帮助解决您的问题


0
投票

我正在为同样的问题而苦苦挣扎。我遵循@Hex24提到的所有步骤。但是,我发现依赖关系存在问题。 Dependency issue: Showing unresolved reference。有人可以帮忙吗?

© www.soinside.com 2019 - 2024. All rights reserved.