在为arm64 Android手机构建应用程序包时,在ApplicationInfo.nativeLibraryDir中找不到本机库

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

我正在尝试将我的应用程序从单片APK迁移到应用程序包格式。我需要为LD_LIBRARY_PATH调用设置exec()环境变量,因此我需要我的本机库的位置。使用原始的APK,我会打电话给getApplicationInfo().nativeLibDir,图书馆就在那里。

使用应用程序包,他们不是。我可以看到安装了正确的abi split APK,但由于某种原因,未提取库。

我尝试使用bundletool和Google Play安装,

试图运行'ls -alR',我可以清楚地看到目录存在以及拆分apk,但是库根本就没有提取。我想我可以手动提取它们作为解决方法,但这似乎是不必要的..?

这是ls父文件夹中nativeLibPath的输出

genLibraryPath: Dir Contents: /data/app/com.unseenonline-raAFLhJMQpjqWkVdG1Vocg==:
        total 16704
        drwxr-xr-x   4 system system      4096 2019-06-11 12:41 .
        drwxrwx--x 114 system system     12288 2019-06-11 12:41 ..
        -rw-r--r--   1 system system   5688352 2019-06-11 12:41 base.apk
        drwxr-xr-x   3 system system      4096 2019-06-11 12:41 lib
        drwxrwx--x   3 system install     4096 2019-06-11 12:41 oat
        -rw-r--r--   1 system system  11226112 2019-06-11 12:41 split_config.arm64_v8a.apk
        -rw-r--r--   1 system system     35636 2019-06-11 12:41 split_config.en.apk
        -rw-r--r--   1 system system     90443 2019-06-11 12:41 split_config.xxhdpi.apk

        /data/app/com.unseenonline-raAFLhJMQpjqWkVdG1Vocg==/lib:
        total 24
        drwxr-xr-x 3 system system 4096 2019-06-11 12:41 .
        drwxr-xr-x 4 system system 4096 2019-06-11 12:41 ..
        drwxr-xr-x 2 system system 4096 2019-06-11 12:41 arm64

        /data/app/com.unseenonline-raAFLhJMQpjqWkVdG1Vocg==/lib/arm64:
        total 16
        drwxr-xr-x 2 system system 4096 2019-06-11 12:41 .
        drwxr-xr-x 3 system system 4096 2019-06-11 12:41 ..

正如您所看到的那样,拆分apks存在,但未提取库。

应该将库提取到与原始apk相同的位置

android kotlin native
1个回答
3
投票

默认情况下,从Android App Bundle生成的APK会在Android M +上的设备上解压缩本机库。这不仅会降低下载大小,而且还会大大减少设备上应用的大小,因为Android平台可以直接从APK读取本机库,而不必将它们提取到单独的位置。最后I / O上有一篇关于如何减小应用程序大小以及它如何影响安装数量的讨论,如果你有兴趣更好地理解这一点,他们会详细介绍它的工作原理。

因此,既然您知道Google Play为何会这样做,那么您有以下选择:

  • 您可以选择恢复原始的APK行为,这可以通过在gradle.properties文件中添加标志android.bundle.enableUncompressedNativeLibs=false来完成。这将有效地禁用此优化,从而为M +上的所有用户带来更大的应用尺寸。
  • 您可以确保Android平台加载本机库(例如使用System.loadLibrary),或者如果您出于某种原因直接自己阅读库,也可以直接从APK中读取它。

如果本机库由您依赖的第三方库加载,请考虑为它们提交错误以解决此问题,以便它们遵循与平台相同的逻辑。

希望有所帮助,

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