背景
我有一个 Android 应用程序,它使用本机 ARM64 可执行文件(本质上是 GCC 工具链,/data/data/%package%/somePath
在第一次运行时提取到应用程序目录())来做一些工作。由于Android 10中的更改文件/data/data/..
不再具有可执行权限。
确认的解决方法
解决方法是使可执行文件看起来像共享库(libsomething.so),由 Android 提取到dir/data/app/%package%
并允许具有可执行权限。符号链接可能有助于模仿以前的文件结构。android:extractNativeLibs="true"
AndroidManifest.xml
问题
问题是所有可执行文件(又名新的“共享库”)都以 zip 压缩比打包到 android apk 中(因为 apk 本质上只是一个 zip 文件),如果它使用 7zip 存档并且总重量超过100Mb,这是 Android 上的应用程序限制(适用于 apk 文件)。
问题和建议
我如何将可执行文件分成一小部分(进入/data/app/%package%
和大部分(或只是现有的可执行文件/data/data/%package%
)?这个想法是小可执行文件只是“加载并运行”一个常规的。压缩常规可执行文件的好处使用 7zip,由于 7zip 具有更好的压缩比,它使 apk 的大小更小。
我一直在研究UPX的使用方向,但没有经验(注意我必须在 Mac 机器(或带有 VM 或 Docker 的 Linux)上准备可执行文件才能在 Android ARM64 上运行)。我也一直在考虑创建 7z sfx,但这似乎很棘手(再次,它必须在 x86_64 上创建并在 ARM64 上运行)。我还发现了一些类似的 QA(推荐memexec()
或fexecve()
),但我不确定最佳方法是什么。
理想情况下,我希望有一些只接受 cmd 和常规可执行路径的小型“通用”ARM64 可执行文件(或者能够使用 Android NDK 从源代码编译它)。
PS。由于不同的原因,不希望将应用程序包和动态交付模块作为高级替代方案。
聚苯乙烯。UPX不适用于 Android 10(似乎是安全问题)。