插件化組件化
組件化與插件化的區(qū)別
組件化是Android自然提供的发钝,例如分成lib潦牛,test組件殴瘦。插件化是熱更新袭景。
如何攔截Activity的啟動(dòng)
hook住單例的IActivity對(duì)象唁桩,攔截他的startActivity方法。
參考:http://www.reibang.com/p/69bfbda302df
應(yīng)用總共有多少個(gè)context耸棒?
context總數(shù)是Activity+service+Application的數(shù)目荒澡。
Activity的Context是什么時(shí)候賦值的?
在performLaunchActivity的時(shí)候与殃,在創(chuàng)建了contextimpl单山,用classloader把Activity對(duì)象創(chuàng)建出來后碍现,調(diào)用Activity的attach方法實(shí)現(xiàn)賦值。
應(yīng)用的ClassLoader是從哪里來的米奸?
應(yīng)用ActivityThread啟動(dòng)后昼接,bind上AMS,AMS返回Application info悴晰,這個(gè)Application info包含apk的路徑信息慢睡,應(yīng)用根據(jù)這個(gè)應(yīng)用信息構(gòu)造classloader,這個(gè)classloader位于loadedapk對(duì)象中铡溪。
如何加載另一個(gè)apk的資源漂辐?
構(gòu)造一個(gè)ResourceManager,傳入apk路徑佃却。然后動(dòng)態(tài)加載資源APK者吁,從資源APK中解釋出資源id。利用構(gòu)造的ResourceManager饲帅,傳入資源id复凳,加載進(jìn)來。
java反射有哪些方法
反射獲取類
Class.forName
Class<?> activityThreadClass = Class.forName("android.app.ActivityThread");
反射獲取方法
Class.getdeclaredMetod(obj)
Method currentActivityThreadMethod = activityThreadClass.getDeclaredMethod("currentActivityThread");
反射新建對(duì)象
ActivityManagerNativeClss.newInstance()
反射獲取屬性
Class.getdeclaredField(obj)
反射可以反射final灶泵,private嗎育八?
可以的∩饬冢可以反射pathlist的element數(shù)組來修改classloader實(shí)現(xiàn)插件化髓棋。
xposed是什么原理?
修改system_process,加載jar惶洲,修改Method指向按声。
Android虛擬機(jī)中class和method的數(shù)據(jù)結(jié)構(gòu)是怎樣的?
dvmDecodeIndirectRef是libdvm中的方法恬吕,它可以從java對(duì)象的間接引用獲得ClassObject對(duì)象签则,再根據(jù)slot,用dvmSlotToMethod找到Method對(duì)象铐料。這里的ClassObject和Method都是虛擬機(jī)內(nèi)部用來表示class和Method的數(shù)據(jù)結(jié)構(gòu)渐裂。
java反射的Method和虛擬機(jī)中Method是同一個(gè)嗎?
不是的钠惩。
參考:https://blog.csdn.net/dingjikerbo/article/details/50448145
Art中method的結(jié)構(gòu)是怎樣的柒凉?
jni函數(shù)表保存在全局變量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的時(shí)候篓跛,就加載方法了膝捞。
ClassLinker.LoadClass
LoadMethod
LoadField
然后連接native代碼
LinkCode
https://blog.csdn.net/luoshengyang/article/details/39533503
DEX類和OAT類的有區(qū)別嗎?
virtual方法是什么
virtual方法就是public愧沟,protect方法绑警,有多態(tài)求泰。derect方法就是private方法。
dex文件格式是怎樣的
如何通過java method找打art method
ArtMethod::FromReflectedMethod
如何替換
Unsafe 和 Memory计盒,可以操作內(nèi)存
https://blog.csdn.net/omnispace/article/details/73320940
https://blog.csdn.net/weelyy/article/details/78906537