如何让android删除旧的本机库?
作者:互联网
我正在尝试从我的应用程序中删除一些本机库,因为我不再使用它们,但在我的手机中安装apk后,我可以看到本机库仍然存在.
正如我所见,android只是通过替换我的libs /目录中的文件来正确复制/更新本机库,但显然当它们不在apk中时它不会删除它们.
我怎么知道库还在那里?首先,应用程序的大小保持不变,我正在删除一些非常大的库,其次,如果我离开System.load(…)语句,应用程序仍然可以加载库.
我发现的唯一解决方案是卸载应用程序并进行全新安装,但对于用户从Google Play更新应用程序而言,这不是一个明显的解决方案,是的,这个问题严重影响了我的应用程序功能.
我已经检查过,显然我可以自己删除文件,比如在服务创建期间,但是我不想以这种方式搞乱安装.
你知道是否有办法告诉Android它需要删除所有本地库并再次复制它们?
谢谢,
麦克风
[编辑]
我刚刚发现GB正确地更新了库,它删除了现在应该丢失的库,但ICS和JB都没有,这两个留下旧的.so文件,即使它们不在apk中了.
我尝试从/ data / data / mypackage / lib手动删除.so文件,但它不会让我.
有任何想法吗?
解决方法:
好的,所以我放弃了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.
>将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中提取文件,或者不提取任何文件,覆盖具有相同名称的文件(我只是在这里游荡,因为我还没有尝试过),幸运的是,我的三个文件上的库已经重命名并且在每个zip文件上是独占的,所以我只需要提取三个文件中的一个.
>将System.loadLibrary方法调用替换为支持使用其完整路径加载库的System.load,并为每个库添加完整路径.
这种方法带来了额外的好处:
>由于库被压缩,apk大小将减少,使得谷歌游戏商店中的应用程序更小.
>作为存储在原始资源android中的库不会自动复制它们,允许您将它们复制到任何您想要的位置并使用完整路径加载它们.
>如果需要,您可以决定将库复制到SD卡,我不建议这样做,但现在您可以这样做,例如当手机没有足够的空间时.
希望这可以帮助!
标签:android,android-install-apk 来源: https://codeday.me/bug/20190625/1284450.html