4

我正在尝试从我的应用程序中删除一些本机库,因为我不再使用它们,但是在我的手机中安装 apk 后,我可以看到本机库仍然存在。正如我所看到的,android 确实通过替换我的 libs/ 目录中的文件来正确复制/更新本机库,但显然当它们不在 apk 中时它不会删除它们。我怎么知道图书馆还在那里?首先,应用程序的大小保持不变,我正在删除一些非常大的库,其次,如果我离开 System.load(...) 语句,应用程序仍然能够加载库。

我为此找到的唯一解决方案是卸载应用程序并重新安装,但这对于从 google play 更新应用程序的用户来说并不是一个明显的解决方案,是的,这个问题严重影响了我的应用程序功能。

我已经检查过了,显然我可以自己删除文件,比如在创建服务期间,但我不想以这种方式搞乱安装。

你知道有没有办法告诉 Android 它需要删除所有的原生库并再次复制它们?

谢谢,迈克

[编辑]

我刚刚发现 GB 正确更新了库,它删除了现在丢失的文件,但是 ICS 和 JB 都没有这样做,即使它们不再在 apk 中,这两个文件也会留下旧的 .so 文件。

我尝试从 /data/data/mypackage/lib 手动删除 .so 文件,但它不会让我这样做。

有任何想法吗?

4

2 回答 2

4

好的,所以我放弃了 android 来做这件事,我不得不自己做。我从这里得到了一些提示:http ://www.moodstocks.com/2012/03/20/ice-cream-sandwich-why-native-code-support-sucks/ 。

这是我所做的:

  1. 使用文件夹 libs/armeabi、libs/armeabi-v7a 和 libs/x86 的内容制作三个 zip 文件,分别命名为 libs_armeabi.zip、libs_armeabi_v7a.zip 和 libs_x86.zip。

  2. 将 zip 文件移动到 res/raw 文件夹。

  3. 删除三个libs文件夹下的文件并用touch重新创建(在-nix系统中),记住ICS和JB不会删除lib文件夹下的旧文件,所以只删除文件会导致应用程序保留那些相当大的文件。

  4. 使用以下两种方法以编程方式验证处理器架构:

    public static boolean isArmv7() {
        try {
            return Build.VERSION.SDK_INT >= 4 && Build.class.getField("CPU_ABI").get(null).toString().startsWith("armeabi-v7");
        } catch (Throwable e) {}
    
        return false;
    }
    
    public static boolean isX86() {
        try {
            return Build.VERSION.SDK_INT >= 4 && Build.class.getField("CPU_ABI").get(null).toString().startsWith("x86");
        } catch (Throwable e) {}
    
        return false;
    }
    
  5. 根据处理器架构,以编程方式将三个文件之一解压缩到您想要的任何文件夹,我正在使用 /data/data/myPackage/app_libs (使用context.getDir("libs",Context.MODE_PRIVATE);返回该路径)。

可能这里会涉及更多逻辑,例如提取 libs_armeabi.zip 文件,然后从 libs_armeabi_v7a.zip 或 libs_x86.zip 中提取文件或都不提取文件,覆盖具有相同名称的文件(我只是在这里徘徊是因为我实际上没有尝试过),幸运的是我的三个文件上的库已经被重命名并且在每个 zip 文件中都是专有的,所以我只需要提取三个文件中的一个。

  1. 将 System.loadLibrary 方法调用替换为支持使用其完整路径加载库的 System.load,并为每个库添加完整路径。

这种方法带来了额外的好处:

  • 随着库被压缩,apk 大小将减小,从而使 google play 商店中的应用程序更小。

  • 作为存储在原始资源中的库,android 不会自动复制它们,允许您将它们复制到任何您想要的位置并使用完整路径加载它们。

  • 如果需要,您可以决定将库复制到 SD 卡,我不建议这样做,但现在您可以这样做,例如当手机没有足够空间时。

希望这可以帮助!

于 2013-05-22T05:05:18.170 回答
0

本机 lib 目录中的所有文件的所有者都是系统。所以在你的应用程序中,你不能在没有 root 权限的情况下删除这些文件。

将你的 lib 目录移动到 res/raw,然后手动将它们复制到内部数据是一个不错的选择。

于 2016-05-24T12:39:55.580 回答