有时候我们需要做热更新,所以如果更新包里面有so库的话。可能需要重新加载。但是更新前的classLoader已经加载过该动态库了,Java VM 为了确保ClassLoader的命名空间独立性。不允许两个ClassLoader加载同一个动态库。那么只要把更新下来的so文件命名成一个新的名字,并且使用两个不同的没有继承关系的CLassLoader加载就行了。
你以为这样就可以了吗?不是的。这种方法在多数机型里面测试可以使用,但是在华为手机里面就直接卡住了。具体原因不清楚。所以最好的办法是,把so包放在dex文件里面。没更新之前先不加载so包到内存。而是随着dex包一下更新下载下来。然后删除掉旧的so包,使用新的so包。然后再把so包加载到内存里面。这样,整个过程就加载一次so包。
为解决热更新中SO库加载冲突,本文探讨了一种有效策略:将SO包置于DEX文件内,避免重复加载。在更新前不加载SO包至内存,随DEX包更新下载,删除旧SO包,加载新SO包,实现单次加载。
1万+

被折叠的 条评论
为什么被折叠?



