在此總結(jié)一下為什么Android系統(tǒng)資源包Android.jar中的資源可以被訪問:
1.app引入了系統(tǒng)資源谬以,這些系統(tǒng)資源及其id和名字的索引包含在Android.jar包中腹尖。
2.app編譯時會執(zhí)行aapt資源編譯打包命令垂蜗,aapt資源編譯打包命令的-I 參數(shù)庆械,引入了Android.jar,所以app在編譯的時候,系統(tǒng)資源id能被識別。
3.apk包中只包含了對系統(tǒng)資源id的索引铅鲤,并不包含真正的資源,否則apk包不會那么小枫弟。
4.apk在運(yùn)行時加載的系統(tǒng)資源其實(shí)包含在/system/framework/framework-res.apk包中邢享,這個包的資源索引表跟Android.jar包相同,在apk運(yùn)行時由framework層中的 AssertManager自動加載淡诗,app需要引用系統(tǒng)資源時骇塘,通過使用編譯時固定的id到framework-res.apk包中查找。
所以Android.jar中的資源可以被訪問其實(shí)是個假象韩容, app只是應(yīng)用了位于其中的資源id及索引款违,這一步是在編譯時就完成了。真正的資源訪問是在運(yùn)行時去framework-res.apk包中查找的宙攻。