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

如何让android删除旧的本机库?,android,android-install-apk,Android,Android Install Apk,我正试图从我的应用程序中删除一些本机库,因为我不再使用它们,但在我的手机中安装了apk后,我可以看到本机库仍然存在。 正如我所看到的,android只需替换libs/目录中的文件,就可以正确地复制/更新本机库,但显然,当它们不在apk中时,它不会删除它们。 我怎么知道图书馆还在那里?首先,应用程序的大小保持不变,我正在删除一些非常大的库,其次,如果我离开System.load(…)语句,应用程序仍然能够加载库 我找到的唯一解决方案是卸载应用程序并重新安装,但对于从google play更新应用程

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

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

我已经检查过了,显然我可以自己删除这些文件,比如说在创建服务时,但我不想以这种方式干扰安装

你知道有没有办法告诉Android它需要删除所有本机库并再次复制它们

谢谢, 迈克

[编辑]

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

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


有什么想法吗?

好的,所以我放弃了安卓系统来做这个,我不得不自己做。我从这里得到了一些提示:

以下是我所做的:

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

  • 将zip文件移动到res/raw文件夹

  • 删除三个libs文件夹下的文件,并用touch重新创建它们(在a-nix系统中),记住ICS和JB不会删除lib文件夹中的旧文件,因此删除这些文件会导致应用程序保留那些相当大的文件

  • 使用以下两种方法以编程方式验证处理器体系结构:

    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;
    }
    
  • 根据处理器体系结构,我使用/data/data/myPackage/app_libs(使用
    context.getDir(“libs”,context.MODE_PRIVATE);
    返回该路径),以编程方式将三个文件中的一个解压到所需的任何文件夹中

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

  • 替换对System.load的System.loadLibrary方法调用,该方法支持使用其完整路径加载库,并为每个库添加完整路径
  • 此方法还具有其他好处:

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

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

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


    希望这有帮助

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


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

    您也可以在应用程序上清除数据,但这将清除存储在应用程序私有目录中的所有数据。但是,这些旧库的存在是如何造成问题的呢?如果它们没有被调用,它们只是坐在那里。听起来你可能在这个设备上安装了一个坏版本的Android。你在模拟器上也有同样的行为吗?首先,应用程序代码不应该具有修改其lib/文件夹内容的权限,因此,如果可以的话,它本身就表示一些非常不标准的内容。我很好奇,如果您创建一个长度为零的升级apk。所以文件名与您要删除的文件名相同,会发生什么。此外,您可能希望在
    adb shell
    中使用
    作为.package.name运行
    命令,然后使用
    ls-l lib
    查看实际安装的库。问题是加载这些库的类不是我的,因此我无法阻止从java加载它们。如果应用程序中的代码试图加载它们,删除它们可能会导致运行时异常。您将需要删除依赖于它们的代码,或者使用每个本机方法的假版本创建存根库,每个本机方法都不起任何作用,并且以适当的方式创建存根库。或者全局捕获这些异常并以某种方式恢复。实际上@ChrisStratton,我没有试图通过代码删除库,我只是读到这是可能的,但我不想使用该选项。我还尝试用一个同名的空文件替换.so文件,应用程序崩溃时出现“致命信号7”错误,java无法捕捉到这一错误,因为这不是一个例外。如果我有一个应用程序,我必须确定其本机库和支持的本机架构,该方法是否有帮助?应用程序已安装,我正在使用另一个应用程序检查生成。我说得通吗?链接不再有效