插件化组件化
组件化与插件化的区别
组件化是Android自然提供的,例如分成lib,test组件。插件化是热更新。
组件化
如何拦截Activity的启动
hook住单例的IActivity对象,拦截他的startActivity方法。
参考:https://www.jianshu.com/p/69bfbda302df
应用总共有多少个context?
context总数是Activity+service+Application的数目。
Activity的Context是什么时候赋值的?
在performLaunchActivity的时候,在创建了contextimpl,用classloader把Activity对象创建出来后,调用Activity的attach方法实现赋值。
context
应用的ClassLoader是从哪里来的?
应用ActivityThread启动后,bind上AMS,AMS返回Application info,这个Application info包含apk的路径信息,应用根据这个应用信息构造classloader,这个classloader位于loadedapk对象中。
如何加载另一个apk的资源?
构造一个ResourceManager,传入apk路径。然后动态加载资源APK,从资源APK中解释出资源id。利用构造的ResourceManager,传入资源id,加载进来。
java反射有哪些方法
反射获取类
Class.forName
Class<?> activityThreadClass = Class.forName("android.app.ActivityThread");
反射获取方法
Class.getdeclaredMetod(obj)
Method currentActivityThreadMethod = activityThreadClass.getDeclaredMethod("currentActivityThread");
反射新建对象
ActivityManagerNativeClss.newInstance()
反射获取属性
Class.getdeclaredField(obj)
反射可以反射final,private吗?
可以的。可以反射pathlist的element数组来修改classloader实现插件化。
xposed是什么原理?
修改system_process,加载jar,修改Method指向。
Android虚拟机中class和method的数据结构是怎样的?
dvmDecodeIndirectRef是libdvm中的方法,它可以从java对象的间接引用获得ClassObject对象,再根据slot,用dvmSlotToMethod找到Method对象。这里的ClassObject和Method都是虚拟机内部用来表示class和Method的数据结构。
java反射的Method和虚拟机中Method是同一个吗?
不是的。
参考:https://blog.csdn.net/dingjikerbo/article/details/50448145
Art中method的结构是怎样的?
jni函数表保存在全局变量gJniNativeInterface中
const JNINativeInterface gJniNativeInterface = {
NULL, // reserved0.
NULL, // reserved1.
NULL, // reserved2.
NULL, // reserved3.
JNI::GetVersion,
......
JNI::FindClass,
......
JNI::GetStaticMethodID,
......
JNI::CallStaticVoidMethod,
......
};
首先需要先查找类
class_linker->FindClass(descriptor.c_str(), cl)
然后加载class,在加载class的时候,就加载方法了。
ClassLinker.LoadClass
LoadMethod
LoadField
然后连接native代码
LinkCode
https://blog.csdn.net/luoshengyang/article/details/39533503
DEX类和OAT类的有区别吗?
virtual方法是什么
virtual方法就是public,protect方法,有多态。derect方法就是private方法。
网友评论