如何让android删除旧的本机库?
我正试图从我的应用程序中删除一些本机库,因为我不再使用它们,但在我的手机中安装了apk后,我可以看到本机库仍然存在。 正如我所看到的,android只需替换libs/目录中的文件,就可以正确地复制/更新本机库,但显然,当它们不在apk中时,它不会删除它们。 我怎么知道图书馆还在那里?首先,应用程序的大小保持不变,我正在删除一些非常大的库,其次,如果我离开System.load(…)语句,应用程序仍然能够加载库 我找到的唯一解决方案是卸载应用程序并重新安装,但对于从google play更新应用程序的用户来说,这不是一个明显的解决方案,是的,这个问题严重影响了我的应用程序功能 我已经检查过了,显然我可以自己删除这些文件,比如说在创建服务时,但我不想以这种方式干扰安装 你知道有没有办法告诉Android它需要删除所有本机库并再次复制它们 谢谢, 迈克 [编辑] 我刚刚发现GB正确地更新了库,它删除了现在丢失的,但ICS和JB都没有,它们都保留了旧的.so文件,即使它们不再在apk中 我尝试从/data/data/mypackage/lib手动删除.so文件,但它不允许我这样做如何让android删除旧的本机库?,android,android-install-apk,Android,Android Install Apk,我正试图从我的应用程序中删除一些本机库,因为我不再使用它们,但在我的手机中安装了apk后,我可以看到本机库仍然存在。 正如我所看到的,android只需替换libs/目录中的文件,就可以正确地复制/更新本机库,但显然,当它们不在apk中时,它不会删除它们。 我怎么知道图书馆还在那里?首先,应用程序的大小保持不变,我正在删除一些非常大的库,其次,如果我离开System.load(…)语句,应用程序仍然能够加载库 我找到的唯一解决方案是卸载应用程序并重新安装,但对于从google play更新应用程
有什么想法吗?好的,所以我放弃了安卓系统来做这个,我不得不自己做。我从这里得到了一些提示: 以下是我所做的:
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;
}
context.getDir(“libs”,context.MODE_PRIVATE);
返回该路径),以编程方式将三个文件中的一个解压到所需的任何文件夹中- 随着库的压缩,apk的大小将减小,使google play商店中的应用程序更小
- 作为存储在原始资源中的库,android不会自动复制它们,允许您在任何地方复制它们,并使用完整路径加载它们
- 如果您愿意,您可以决定将库复制到sd卡上,我不建议这样做,但现在您可以这样做,例如当手机没有足够的空间时
希望这有帮助 本机库目录中的所有文件的所有者都是系统。因此,在你的应用程序中,没有root权限,你不能删除这些文件
将lib目录移动到res/raw,然后手动将其复制到内部数据是一个不错的选择。您也可以在应用程序上清除数据,但这将清除存储在应用程序私有目录中的所有数据。但是,这些旧库的存在是如何造成问题的呢?如果它们没有被调用,它们只是坐在那里。听起来你可能在这个设备上安装了一个坏版本的Android。你在模拟器上也有同样的行为吗?首先,应用程序代码不应该具有修改其lib/文件夹内容的权限,因此,如果可以的话,它本身就表示一些非常不标准的内容。我很好奇,如果您创建一个长度为零的升级apk。所以文件名与您要删除的文件名相同,会发生什么。此外,您可能希望在
adb shell
中使用作为.package.name运行命令,然后使用ls-l lib
查看实际安装的库。问题是加载这些库的类不是我的,因此我无法阻止从java加载它们。如果应用程序中的代码试图加载它们,删除它们可能会导致运行时异常。您将需要删除依赖于它们的代码,或者使用每个本机方法的假版本创建存根库,每个本机方法都不起任何作用,并且以适当的方式创建存根库。或者全局捕获这些异常并以某种方式恢复。实际上@ChrisStratton,我没有试图通过代码删除库,我只是读到这是可能的,但我不想使用该选项。我还尝试用一个同名的空文件替换.so文件,应用程序崩溃时出现“致命信号7”错误,java无法捕捉到这一错误,因为这不是一个例外。如果我有一个应用程序,我必须确定其本机库和支持的本机架构,该方法是否有帮助?应用程序已安装,我正在使用另一个应用程序检查生成。我说得通吗?链接不再有效