安装 64 位 Android 应用程序后缺少 lib/ 目录

lib/ directory missing after installing 64 bit Android application

我的 32 位 ARM Android 应用程序带有我在本机代码中 dlopen() 的 .so 文件。这很好用,我可以在 /data/data/com.domain.app/lib/libX.so 位置打开它们。

如果我将 64 位二进制文​​件添加到我的包 (arm64-v8a) 并将其安装在 64 位 Android 设备上,那么 /data/data/com.domain.app/lib 目录将不存在。

经过一些调查,我发现 64 位 Android 设备上的 .so 文件最终位于不同的目录中:

/data/app/com.domain.app-1/lib/arm64

更糟糕的是,“-1”后缀各不相同,可能是“-2”或其他。

这是一种检查在应用程序的主目录中安装了什么的方法:

$ adb shell run-as com.steenriver.biplane '/system/bin/sh -c "pwd"' /data/data/com.steenriver.biplane

$ adb shell run-as com.steenriver.biplane '/system/bin/sh -c "ls -al"' drwxrwx--x u0_a108 u0_a108 2017-01-17 15:04 app_.gpg.classloader drwxrwx--x u0_a108 u0_a108 2017-01-17 15:04 cache drwxrwx--x u0_a108 u0_a108 2017-01-17 15:04 code_cache drwxrwx--x u0_a108 u0_a108 2017-01-17 15:04 files

32 位设备将在此处列出一个 lib/ 条目。

是否有我可以执行的 Android 调用(在 Java 或本机代码中)会告诉我 .so 文件的最终位置,以便我可以 dlopen() 它们?

对于 64 位 ARM,不再对库目录创建符号 link。要查找 .so 文件,您可以在 onCreate()

中使用以下 Java 代码
import android.content.pm.PackageInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
...
ApplicationInfo ainfo = this.getApplicationContext().getPackageManager().getApplicationInfo
( 
    "com.domain.app",
    PackageManager.GET_SHARED_LIBRARY_FILES
);
Log.v( TAG, "native library dir " + ainfo.nativeLibraryDir );

将其与 32 位 ARM 进行比较,其中提供了符号link:

$ adb shell run-as com.steenriver.littlecrane '/system/bin/sh -c "pwd"'
/data/data/com.steenriver.littlecrane
$ adb shell run-as com.steenriver.littlecrane '/system/bin/sh -c "ls -al"'
drwxrwx--x u0_a109  u0_a109           2017-01-18 11:48 app_.gpg.classloader
drwxrwx--x u0_a109  u0_a109           2017-01-18 11:26 cache
drwxrwx--x u0_a109  u0_a109           2017-01-18 11:48 code_cache
drwxrwx--x u0_a109  u0_a109           2017-01-18 11:47 files
lrwxrwxrwx root     root              2017-01-18 11:48 lib -> /data/app/com.steenriver.littlecrane-2/lib/arm