如何让android删除旧的本机库?

时间:2013-05-08 20:55:29

标签: android android-install-apk

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

我发现的唯一解决方案是卸载应用程序并进行全新安装,但对于用户从Google Play更新应用程序而言,这不是一个明显的解决方案,是的,此问题会严重影响我的应用功能

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

你知道是否有办法告诉Android它需要删除所有本地库并再次复制它们?

谢谢, 麦克

[编辑]

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

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

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

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

这就是我的所作所为:

  1. 制作三个zip文件,其中包含文件夹libs / armeabi,libs / armeabi-v7a和libs / x86的内容,并将它们分别命名为libs_armeabi.zip,libs_armeabi_v7a.zip和libs_x86.zip。

    < / LI>
  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);返回该路径)。

  6. 这里可能会涉及更多的逻辑,比如提取libs_armeabi.zip文件,然后从libs_armeabi_v7a.zip或libs_x86.zip中提取文件,或者不提取任何文件,覆盖具有相同名称的文件(I “我只是在这里游荡,因为我还没有尝试过这个”,幸运的是,我的三个文件上的库已经重命名并且在每个zip文件上是独占的,所以我只需要提取三个文件中的一个。

    1. 将System.loadLibrary方法调用替换为System.load,该调用支持使用其完整路径加载库,并为每个库添加完整路径。
    2. 这种方法带来了额外的好处:

      • 由于图书馆已压缩,因此apk尺寸将减少,从而使Google Play商店中的应用程序变小。

      • 存储在原始资源android中的库不会自动复制它们,允许您在任何地方复制它们并使用完整路径加载它们。

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

      希望这有帮助!

答案 1 :(得分:0)

本机lib目录中的所有文件都是System。因此,在您的应用中,如果没有root权限,则无法删除这些文件。

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