为 arm64 Android phone 构建应用程序包时 ApplicationInfo.nativeLibraryDir 中未找到本机库
Native libraries not found in ApplicationInfo.nativeLibraryDir when building app bundle for arm64 Android phone
我正在尝试将我的应用程序从单片 APK 迁移到应用程序包格式。我需要为 exec()
调用设置 LD_LIBRARY_PATH
环境变量,因此我需要本地库的位置。对于原始 APK,我会调用 getApplicationInfo().nativeLibDir
并且库在那里。
对于应用程序包,它们不是。 我可以看到安装了正确的 abi split APK,但由于某些原因没有提取库。
我已经尝试使用 bundletool
安装并通过 Google 播放,
尝试 运行 '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 ..
如您所见,拆分的 apk 在那里,但库未提取。
库应该被提取到与原始 apk 相同的位置
默认情况下,从 Android App Bundle 生成的 APK 在具有 Android M / API 23 级或更高级别 (source) 的设备上具有未压缩的本机库.这不仅通常会减少下载大小,而且还会大大减少设备上应用程序的大小,因为 Android 平台可以直接从 APK 中读取本机库,而不必将它们提取到单独的位置。最后 I/O 讨论了如何减小应用程序的大小以及这如何影响安装数量,如果您有兴趣更好地理解它,他们会详细介绍它是如何工作的。
所以,既然您知道 Google Play 这样做的原因,您有以下选择:
您可以选择恢复到原始 APK 行为,这可以通过在 gradle.properties 文件中添加标志 android.bundle.enableUncompressedNativeLibs=false
来完成。这将有效地禁用此优化,从而为 M+ 上的所有用户带来更大的应用程序大小。
您可以确保本机库由 Android 平台加载(例如使用 System.loadLibrary
)或者如果您出于某种原因直接自己读取库, 也可以直接从 APK 读取。
如果本机库由您所依赖的第三方库加载,请考虑为他们提交错误以解决此问题,以便他们遵循与平台相同的逻辑。
希望对您有所帮助,
我正在尝试将我的应用程序从单片 APK 迁移到应用程序包格式。我需要为 exec()
调用设置 LD_LIBRARY_PATH
环境变量,因此我需要本地库的位置。对于原始 APK,我会调用 getApplicationInfo().nativeLibDir
并且库在那里。
对于应用程序包,它们不是。 我可以看到安装了正确的 abi split APK,但由于某些原因没有提取库。
我已经尝试使用 bundletool
安装并通过 Google 播放,
尝试 运行 '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 ..
如您所见,拆分的 apk 在那里,但库未提取。
库应该被提取到与原始 apk 相同的位置
默认情况下,从 Android App Bundle 生成的 APK 在具有 Android M / API 23 级或更高级别 (source) 的设备上具有未压缩的本机库.这不仅通常会减少下载大小,而且还会大大减少设备上应用程序的大小,因为 Android 平台可以直接从 APK 中读取本机库,而不必将它们提取到单独的位置。最后 I/O 讨论了如何减小应用程序的大小以及这如何影响安装数量,如果您有兴趣更好地理解它,他们会详细介绍它是如何工作的。
所以,既然您知道 Google Play 这样做的原因,您有以下选择:
您可以选择恢复到原始 APK 行为,这可以通过在 gradle.properties 文件中添加标志
android.bundle.enableUncompressedNativeLibs=false
来完成。这将有效地禁用此优化,从而为 M+ 上的所有用户带来更大的应用程序大小。您可以确保本机库由 Android 平台加载(例如使用
System.loadLibrary
)或者如果您出于某种原因直接自己读取库, 也可以直接从 APK 读取。
如果本机库由您所依赖的第三方库加载,请考虑为他们提交错误以解决此问题,以便他们遵循与平台相同的逻辑。
希望对您有所帮助,