所以,我有为不同 CPU 构建的本机代码。我不想作为库加载,我想通过runtime.exec(...)执行二进制文件。
有没有办法将它们放在 Android 处理 CPU 限定符的某个地方?或者我必须制作不同的 APK 吗?
制作不同的 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
文件夹中。
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
。
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
目录
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();
}
希望能帮助解决您的问题