安装64位Android应用程序后{lib}目录丢失

时间:2017-01-17 23:52:16

标签: android android-ndk shared-libraries arm64

我的32位ARM Android应用程序带有我在我的本机代码中执行的.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()它们?

1 个答案:

答案 0 :(得分:1)

对于64位ARM,不再对库目录建立符号链接。要查找.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进行比较,其中提供了符号链接:

$ 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