我正在尝试从我的应用程序中删除一些本机库,因为我不再使用它们,但是在我的手机中安装apk后,我可以看到本机库仍然存在。 正如我所见,android只是通过替换我的libs /目录中的文件来正确复制/更新本机库,但显然当它们不在apk中时它不会删除它们。 我怎么知道库还在那里?首先,应用程序的大小保持不变,我正在删除一些非常大的库,其次,如果我离开System.load(...)语句,应用程序仍然可以加载库。
我发现的唯一解决方案是卸载应用程序并进行全新安装,但对于用户从Google Play更新应用程序而言,这不是一个明显的解决方案,是的,此问题会严重影响我的应用功能
我已经检查过,显然我可以自己删除这些文件,比如在服务创建期间,但是我不想以这种方式搞乱安装。
你知道是否有办法告诉Android它需要删除所有本地库并再次复制它们?
谢谢, 麦克
[编辑]
我刚刚发现GB正确地更新了库,它删除了现在丢失的文件,但ICS和JB都没有这样做,这两个文件留下了旧的.so文件,即使它们不在apk中也是如此
我尝试从/ data / data / mypackage / lib手动删除.so文件,但它不会让我。
有什么想法吗?
答案 0 :(得分:4)
好的,所以我放弃了android来做这个,我必须自己做。我从这里得到了一些提示:http://www.moodstocks.com/2012/03/20/ice-cream-sandwich-why-native-code-support-sucks/。
这就是我的所作所为:
制作三个zip文件,其中包含文件夹libs / armeabi,libs / armeabi-v7a和libs / x86的内容,并将它们分别命名为libs_armeabi.zip,libs_armeabi_v7a.zip和libs_x86.zip。
< / LI>将zip文件移动到res / raw文件夹。
删除三个libs文件夹下的文件并用touch重新创建(在-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中提取文件,或者不提取任何文件,覆盖具有相同名称的文件(I “我只是在这里游荡,因为我还没有尝试过这个”,幸运的是,我的三个文件上的库已经重命名并且在每个zip文件上是独占的,所以我只需要提取三个文件中的一个。
这种方法带来了额外的好处:
由于图书馆已压缩,因此apk尺寸将减少,从而使Google Play商店中的应用程序变小。
存储在原始资源android中的库不会自动复制它们,允许您在任何地方复制它们并使用完整路径加载它们。
如果需要,您可以决定将库复制到SD卡,我不建议这样做,但现在您可以这样做,例如当手机没有足够的空间时。< / p>
希望这有帮助!
答案 1 :(得分:0)
本机lib目录中的所有文件都是System。因此,在您的应用中,如果没有root权限,则无法删除这些文件。
将您的lib目录移动到res / raw,然后手动将它们复制到内部数据是一个不错的选择。