gpt4 book ai didi

android - 如何让 android 删除旧的 native 库?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:10:44 28 4
gpt4 key购买 nike

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

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

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

你知道是否有办法告诉 Android 它需要删除所有原生库并重新复制它们吗?

谢谢,迈克

[编辑]

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

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

有什么想法吗?

最佳答案

好吧,所以我放弃了 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 卡,我不建议这样做,但现在您可以这样做,例如当手机没有足够的空间时。

希望这对您有所帮助!

关于android - 如何让 android 删除旧的 native 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16450035/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com