将包含二进制文件的文件夹结构复制到本机库文件夹

Posted

技术标签:

【中文标题】将包含二进制文件的文件夹结构复制到本机库文件夹【英文标题】:Copy folder structure containing binaries to native libraries folder 【发布时间】:2021-04-26 20:17:47 【问题描述】:

我想在设备上复制并执行一些预编译的二进制文件,问题是相对文件夹结构需要与原始包中的相同(我无法将所有二进制文件移动到根文件夹)。

到目前为止,我发现如何将没有.so 扩展名的二进制文件复制到lib 文件夹here。它按预期工作,安装后我可以使用context.getApplicationInfo().nativeLibraryDir 找到二进制文件,但是当我放置包含二进制文件的目录时,它无法使用命令找到它。

进一步调查显示该文件夹确实被复制到 apk。我可以通过解压缩 apk 并找到复制到 /lib/arm64-v8a/ 的二进制文件来确认这一点。

现在由于 apk 没问题,我要做的下一步是检查实际复制到设备的内容。这可以在/data/app/app.name.com+random_hash/lib/ 中找到,我确认文件夹不会被复制,只有根文件夹中的二进制文件可以。

我想知道的是负责复制本机库的代码是否位于设备上并且无法更改,或者应用程序可以以某种方式配置为复制文件夹结构?

示例回购:https://github.com/D4no0/copy_native_binaries

【问题讨论】:

您能否在 Github 上提供一个简单的演示项目,其中包含您在实际项目中的结构以及您已经在此问题上的当前进展?谢谢 用示例 repo 的链接更新了问题,为 arm64 编译了二进制文件,创建了 x86 文件夹以便它可以在 x86 模拟器上运行。 github.com/D4no0/copy_native_binaries/blob/main/app/src/main/… 看起来不太好。 那是为x86编译的hello world,不确定它是否运行,关键是看它是否被复制过来。 这不是一个 shell 脚本,添加了扩展名是因为没有扩展名的文件不会在 x86 模拟器上被复制(可能在 android 10 设备上添加了一些新约束) 【参考方案1】:

代码在设备上,是操作系统的一部分:

“Android 操作系统不支持子目录。

安装 APK 时,.so 库会以 /data/app/your.app/lib/ 的形式解压到一个目录中。该目录被添加到 System.loadLibrary 搜索的库路径中,以便可以找到它。 System.loadLibrary 不支持目录结构,因此不会提取 lib/ 下子目录中的 .so 文件。"

以上答案来自一位在 Android 上工作的 Google 员工,来自以下问题: https://issuetracker.google.com/issues/63707864#comment4

干杯, 杰罗姆

【讨论】:

非常可悲,在我看来,这个限制是人为施加的,以限制未使用其 sdk 的应用程序的功能,事实上您无法在 Android 10 上复制没有扩展名的文件(在 android 9 上有效没有问题)点他们希望保持这个功能非常有限。

以上是关于将包含二进制文件的文件夹结构复制到本机库文件夹的主要内容,如果未能解决你的问题,请参考以下文章

将二进制文件复制到 jar 之外

将预编译的二进制文件捆绑到电子应用程序中

macOS 中的特权文件复制(将辅助二进制文件安装到 /usr/local/bin)

将二进制文件读入结构(翻译指令)

如何将二进制文件从 nuget 包复制到我的输出文件夹?

将整个ELF二进制文件转储为可读的标题和部分