Android N的限制

Fri 08 July 2016

Android N的限制

因为研究Android插件化的缘故,所以对新系统对插件化的影响很关注。

classloader-namespace问题

N早期的预览版存在这样一个问题:

04-13 14:32:46.073 25571-25571/? W/System.err: java.lang.UnsatisfiedLinkError: dlopen failed: library "/data/user/0/com.xxx.yyy/files/storage/com.aaa.bbb/version.1/lib/libxxx.so" is not accessible for the namespace "classloader-namespace"

很庆幸这个问题在最新的preview版里面已经修正了。这问题的原因大概如下:

Java的代码在执行System.load(...)时,系统会检查代码所属的ClassLoader是否有该so路径的加载权限。ClassLoader能加载so的路径,在ClassLoader构造的时候就已经指定了。

如果你直接newDexClassLoader去执行System.load(...),加载你指定路径里面的so不存在任何问题。

但是如果你自己实现一个ClassLoader,该ClassLoaderfindClass再转给其他ClassLoader就会出现这个classloader-namespace的问题。

这应该是一个bug,并且Google已经意识到了。

Elf Section Header完整性问题

Android N之前so的加载只需要ELF头的program header,对section header则完全无视。但新的linker现在开始改变规则了。

普通的开发者对于自己编译出的so完全不用担心兼容性问题。但对于使用第三方SDK就要小心了。

Android NDK编译出来的so,ELF section header和program header都是完整的。但一些聪明的家伙发现修改section header或者抹去section header不会影响so的加载,还能起到保护so的目的(其实很有限)。

修改section header的好处是增加so逆向的难度,一个具体的例子:把so拖进IDA的时候直接报错退出。

Category: Android Tagged: Android

Comments