【发布时间】:2013-05-08 20:55:29
【问题描述】:
我正在尝试从我的应用程序中删除一些本机库,因为我不再使用它们,但是在我的手机中安装了 apk 后,我可以看到本机库仍然存在。 正如我所看到的,android 确实通过替换我的 libs/ 目录中的文件来正确复制/更新本机库,但显然当它们不在 apk 中时它不会删除它们。 我怎么知道图书馆还在那里?首先,应用程序的大小保持不变,我正在删除一些非常大的库,其次,如果我离开 System.load(...) 语句,应用程序仍然能够加载库。
我找到的唯一解决方案是卸载应用程序并重新安装,但这对于从 google play 更新应用程序的用户来说不是一个明显的解决方案,是的,这个问题严重影响了我的应用程序功能.
我已经检查过了,显然我可以自己删除文件,比如在服务创建期间,但我不想这样弄乱安装。
你知道有没有办法告诉 Android 它需要删除所有原生库并重新复制它们?
谢谢, 迈克
[编辑]
我刚刚发现 GB 正确更新了库,它删除了现在缺失的,但 ICS 和 JB 都没有这样做,即使它们不再在 apk 中,这两个也会留下旧的 .so 文件.
我尝试从 /data/data/mypackage/lib 手动删除 .so 文件,但它不会让我这样做。
有什么想法吗?
【问题讨论】:
-
您也可以在应用程序上清除数据,但这会清除应用程序私有目录中存储的所有数据。但是这些旧库的存在是如何导致问题的——如果它们不被调用,它们就坐在那里。
-
听起来您在此设备上安装的 Android 版本可能已损坏。你在模拟器上得到同样的行为吗?一方面,应用程序代码不应该有权修改其 lib/ 文件夹的内容,所以如果可以的话,这本身就表明一些非常不标准的东西。我很好奇,如果您创建一个升级 apk 的长度为零的 .so 文件,该文件与您要清除的文件同名,会发生什么。此外,您可能希望在
adb shell中使用run-as your.package.name命令,然后在ls -l lib中查看实际安装的内容。 -
问题是加载这些库的类不是我的,所以我不能阻止它们从java加载。
-
如果您的应用程序中的代码试图加载它们,删除它们可能会导致运行时异常。您需要删除依赖于它们的代码,或者使用每个本机方法的假版本制作存根库,这些本机方法什么都不做,每个都以适当的方式。或者全局捕获这些异常并以某种方式恢复。
-
实际上@ChrisStratton,我没有尝试通过代码删除库,我只是读到它是可能的,但我不想使用该选项。我还尝试用同名的空文件替换 .so 文件,应用程序崩溃并出现“致命信号 7”错误,这在 java 中无法捕获,因为它不是异常。
标签: android android-install-apk