一,JNI原理
1.两种注册方式:动态注册和静态注册
2.java层调用native层,native层调用java层
https://www.jianshu.com/p/5847a2cb68c0
二,so加载过程
1.先找so具体路径
so路径主要来源有两大类:1. vender/lib system/lib系统路径 2. data/app/XXX/lib app路径
不同版本会有差异。
2.在调用native方法load
参考大神文章:
三,类加载过程
1.apk安装的时候PMS
apk安装的时候,PMS会扫描压缩文件中apk中的dex ,so等文件,并且创建对应目录,将其拷贝到对应目录
2.app进程启动的时候
虚拟机加载类的过程:1.先find 2.再load
PathClassLoader创建完成后,就已经拥有了目标程序的文件路径,native lib路径,以及parent类加载器对象。接下来开始执行loadClass()来加载相应的类.
3.类的双亲委派机制
类的加载顺序:1.先判断是否加载过,加载过直接返回 2,调用父类加载器加载,加载过直接返回 3.最后调用当前类加载器加载
4.热修复
一个Classloader可以包含多个dex文件,每个dex文件被封装到一个Element对象,这些Element对象排列成有序的数组 dexElements。当查找某个类时,会遍历所有的dex文件,如果找到则直接返回,不再继续遍历dexElements。也就是说当两个类不同的dex中出现,会优先处理排在前面的dex文件,这便是热修复的核心精髓,将需要修复的类所打包的dex文件插入到dexElements前面
参考:
NDK编译
https://developer.android.com/ndk/guides/application_mk?hl=zh_cn
Android Build 系统
https://www.ibm.com/developerworks/cn/opensource/os-cn-android-build/index.html