日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Android 插件化處理方案詳解

瀏覽:144日期:2022-09-19 18:15:08
插件化啟動(dòng)Activity的過(guò)程

Android 插件化處理方案詳解

在宿主里面的AndroidManifest.xml里面注冊(cè)一個(gè)空的activity

從開始執(zhí)行execStartActivity到最終將Activity對(duì)象new出來(lái)這個(gè)過(guò)程,系統(tǒng)層會(huì)去校驗(yàn)需要啟動(dòng)的activity的合法性[就是是否有在某個(gè)應(yīng)用的AndroidManifest.xml里面注冊(cè)]以及按啟動(dòng)要求創(chuàng)建activity對(duì)象。清晰了這點(diǎn)我們就可以很好的繞過(guò)系統(tǒng)的約束,達(dá)到我們的目的:【插件中的組件擁有真正生命周期,完全交由系統(tǒng)管理、非反射代理】。 簡(jiǎn)單來(lái)說(shuō)方案就兩步: Step1、在開始startActivity的時(shí)候?qū)⑿枰獑?dòng)的插件組件替換成宿主預(yù)先聲明號(hào)的。

public ActivityResult execStartActivity(Context who, IBinder contextThread, IBinder token, Activity target, Intent intent, int requestCode, Bundle options) { //如果啟動(dòng)的是插件的activity組件,這里面將會(huì)被替換成宿主預(yù)先聲明的 PluginIntentResolver.resolveActivity(intent); return hackInstrumentation.execStartActivity(who, contextThread, token, target, intent, requestCode, ptions);}

Step2、在最終創(chuàng)建activity對(duì)象的時(shí)候改回成插件組件的。

@Overridepublic Activity newActivity(ClassLoader cl, String className, Intent intent) throws InstantiationException, IllegalAccessException, ClassNotFoundException { ClassLoader orignalCl = cl; String orginalClassName = className; String orignalIntent = intent.toString(); if (ProcessUtil.isPluginProcess()) { // 將PluginStubActivity替換成插件中的activity if (PluginManagerHelper.isStub(className)) { String action = intent.getAction(); if (action != null && action.contains(PluginIntentResolver.CLASS_SEPARATOR)) {String[] targetClassName = action.split(PluginIntentResolver.CLASS_SEPARATOR);String pluginClassName = targetClassName[0];final String pid = intent.getStringExtra(PluginIntentResolver.INTENT_EXTRA_PID).trim();PluginDescriptor pluginDescriptor = TextUtils.isEmpty(pid) ? PluginManagerHelper.getPluginDescriptorByClassName(pluginClassName) : PluginManagerHelper.getPluginDescriptorByPluginId(pid);Class<?> clazz = PluginLoader.loadPluginClassByName(pluginDescriptor, pluginClassName);if (clazz != null) { className = pluginClassName; cl = clazz.getClassLoader(); intent.setExtrasClassLoader(cl); if (targetClassName.length > 1) { // 之前為了傳遞classNae,intent的action被修改過(guò) // 這里再把Action還原到原始的Action intent.setAction(targetClassName[1]); } else { intent.setAction(null); } // 添加一個(gè)標(biāo)記符 intent.addCategory(RELAUNCH_FLAG + className);} else { throw new ClassNotFoundException('pluginClassName : ' + pluginClassName, new Throwable());} } else if (PluginManagerHelper.isExact(className, PluginDescriptor.ACTIVITY)) {// 這個(gè)邏輯是為了支持外部app喚起配置了stub_exact的插件ActivityPluginDescriptor pluginDescriptor = PluginManagerHelper.getPluginDescriptorByClassName(className);if (pluginDescriptor != null) { boolean isRunning = PluginLauncher.instance().isRunning(pluginDescriptor.getPackageName()); if (!isRunning) { return waitForLoading(pluginDescriptor); }}Class<?> clazz = PluginLoader.loadPluginClassByName(pluginDescriptor, className);if (clazz != null) { cl = clazz.getClassLoader();} else { throw new ClassNotFoundException('className : ' + className, new Throwable());} } else {// 進(jìn)入這個(gè)分支可能是因?yàn)閍ctivity重啟了,比如橫豎屏切換,由于上面的分支已經(jīng)把Action還原到原始到Action了// 這里只能通過(guò)之前添加的標(biāo)記符來(lái)查找classNameboolean found = false;Set<String> category = intent.getCategories();if (category != null) { Iterator<String> itr = category.iterator(); while (itr.hasNext()) { String cate = itr.next(); if (cate.startsWith(RELAUNCH_FLAG)) { className = cate.replace(RELAUNCH_FLAG, ''); PluginDescriptor pluginDescriptor = PluginManagerHelper.getPluginDescriptorByClassName(className); if (pluginDescriptor != null) {boolean isRunning = PluginLauncher.instance().isRunning( pluginDescriptor.getPackageName());if (!isRunning) { return waitForLoading(pluginDescriptor);} } Class<?> clazz = PluginLoader.loadPluginClassByName(pluginDescriptor, className); cl = clazz.getClassLoader(); found = true; break; } }}if (!found) { throw new ClassNotFoundException( 'className : ' + className + ', intent : ' + intent.toString(), new Throwable());} } } else { if (cl instanceof PluginClassLoader) {PluginIntentResolver.resolveActivity(intent); } else {// Do Nothing } } } try { Activity activity = super.newActivity(cl, className, intent); if (activity instanceof PluginContainer) { ((PluginContainer) activity).setPluginId(intent.getStringExtra(PluginContainer.FRAGMENT_PLUGIN_ID)); } return activity; } catch (ClassNotFoundException e) { // 收集狀態(tài),便于異常分析 throw new ClassNotFoundException(' orignalCl : ' + orignalCl.toString() + ', orginalClassName : '+ orginalClassName + ', orignalIntent : ' + orignalIntent + ', currentCl : ' + cl.toString()+ ', currentClassName : ' + className + ', currentIntent : ' + intent.toString() + ', process : '+ ProcessUtil.isPluginProcess() + ', isStubActivity : '+ PluginManagerHelper.isStub(orginalClassName) + ', isExact : '+ PluginManagerHelper.isExact(orginalClassName, PluginDescriptor.ACTIVITY), e); }}

方案確實(shí)很簡(jiǎn)單,不過(guò)還有一些收尾工作,就是將創(chuàng)建好的[插件]組件進(jìn)行一些必要的init操作,比如:在聲明周期onCreate之前進(jìn)行上下文替換等操作,這些都在插件框架提供的PluginInstrumentionWrapper里面進(jìn)行完成的,看一下代碼片段:

@Overridepublic void callActivityOnCreate(Activity activity, Bundle icicle) { PluginInjector.injectActivityContext(activity); Intent intent = activity.getIntent(); if (intent != null) { intent.setExtrasClassLoader(activity.getClassLoader()); } if (icicle != null) { icicle.setClassLoader(activity.getClassLoader()); } if (ProcessUtil.isPluginProcess()) { installPluginViewFactory(activity); if (activity instanceof WaitForLoadingPluginActivity) { // NOTHING } else { } if (activity.isChild()) { // 修正TabActivity中的Activity的ContextImpl的packageName Context base = activity.getBaseContext(); while (base instanceof ContextWrapper) {base = ((ContextWrapper) base).getBaseContext(); } if (HackContextImpl.instanceOf(base)) {HackContextImpl impl = new HackContextImpl(base);String packageName = PluginLoader.getApplication().getPackageName();// String packageName1 = activity.getPackageName();impl.setBasePackageName(packageName);impl.setOpPackageName(packageName); } } } super.callActivityOnCreate(activity, icicle); monitor.onActivityCreate(activity);}

到這插件activity組件就被順序的啟動(dòng)起來(lái)了,并且是系統(tǒng)在維護(hù)具備完整的生命周期。 組件service、Receiver也是一樣的,只是這兩個(gè)組件的攔截點(diǎn)在ActivityThread的Handler成員的回調(diào)Callback里面進(jìn)行的。Application和provider在插件啟動(dòng)的時(shí)候進(jìn)行加載。

資源沖突的解決方案resources.arsc資源描述符詳解

Android 插件化處理方案詳解

packageId: 包名id 資源類型id:string,drawable,layout,color 偏移:某一種類型的偏移值 解決沖突的方案

由于每個(gè)插件的包名是不一致的,可以事先規(guī)定某個(gè)插件的packageId的值固定,然后修改aapt對(duì)其進(jìn)行編譯固定,就可以保證每個(gè)插件分配的值不一樣了。

以上就是Android 插件化處理方案詳解的詳細(xì)內(nèi)容,更多關(guān)于Android 插件化處理方案的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产一区精品福利| 亚洲午夜黄色| 午夜国产精品视频| 久久精品亚洲人成影院| 国产66精品| 国产精品久久久久久久久妇女| 亚洲三级网址| 日韩va亚洲va欧美va久久| 日韩激情精品| 国产欧美一区二区三区国产幕精品| 亚洲人www| 日韩精品1区2区3区| 欧美亚洲福利| 女主播福利一区| 狠狠色综合网| 亚洲激情另类| 久久香蕉精品| 日韩av网站在线免费观看| 91嫩草精品| 国产精品一在线观看| 国产精品videossex久久发布| 久久99免费视频| 黄色在线网站噜噜噜| 亚洲国产专区校园欧美| 亚洲欧美日韩精品一区二区 | 亚洲成人精品| 国产91精品对白在线播放| 国产精品美女| 欧美欧美黄在线二区| 精品理论电影在线| 91精品一区国产高清在线gif| 在线亚洲激情| 国产欧美日韩在线一区二区 | 亚洲精品观看| 国产精品久久免费视频| 成人美女视频| 视频在线观看一区二区三区| 国产亚洲一区| 天堂中文av在线资源库| 麻豆91精品| 美女高潮久久久| 好吊日精品视频| 欧美黑人巨大videos精品| 久久国产中文字幕| 91av一区| 久久精品亚洲人成影院| 亚欧成人精品| 日韩啪啪电影网| 中文在线不卡| 国产精久久久| 视频一区二区三区入口| 久久精品国产免费| 免费人成网站在线观看欧美高清| 久久伊人亚洲| 亚洲精品福利| 日韩欧美一区二区三区在线观看| 日本h片久久| 91精品啪在线观看国产18| 欧美一区二区三区久久精品| 天堂资源在线亚洲| 欧美激情一区| 国产一区白浆| 国产中文在线播放| 午夜一区在线| 97精品国产一区二区三区| 美日韩精品视频| 日韩精品麻豆| 精品网站aaa| 91综合久久爱com| 好看的av在线不卡观看| 都市激情国产精品| 国产亚洲精品美女久久| 噜噜噜躁狠狠躁狠狠精品视频| 老司机精品视频网| 日韩中文一区二区| 国产亚洲永久域名| 日韩欧美网址| 国产极品一区| 亚洲精品成人一区| 亚洲精品电影| 成人久久一区| 激情不卡一区二区三区视频在线| 日韩一区二区三免费高清在线观看| 欧美日韩第一| 激情视频网站在线播放色| 国产精品亚洲欧美| 欧美日韩午夜电影网| 石原莉奈一区二区三区在线观看| 国产专区一区| 日韩精品不卡一区二区| 国产伊人久久| 久久精品资源| 国产另类在线| 鲁大师成人一区二区三区| 精品一区在线| japanese国产精品| 91成人精品| 波多野结衣一区| 亚洲精品电影| 亚洲一区欧美激情| 亚洲一区黄色| 在线精品观看| 日韩综合一区二区| 日韩和欧美一区二区三区| 亚洲精品伊人| 日韩精品亚洲专区| 日韩av午夜在线观看| 日韩二区在线观看| 三级欧美韩日大片在线看| 国产免费成人| 日韩精品一级中文字幕精品视频免费观看| 妖精视频成人观看www| 男人的天堂久久精品| 日本大胆欧美人术艺术动态| 男人操女人的视频在线观看欧美| 亚洲三级在线| 国产探花一区| 免费一级欧美片在线观看网站| 国产精品第一国产精品| 精品99在线| 久久久国产精品一区二区中文| 人在线成免费视频| 日本蜜桃在线观看视频| 成人午夜精品| 欧美日韩第一| 伊人www22综合色| 日韩三区四区| 日韩国产欧美一区二区三区| 91综合久久爱com| 精品国产乱码久久久久久樱花| 成人在线丰满少妇av| 欧美午夜精彩| 亚洲精品免费观看| 精品三级av在线导航| 久久久久一区| 亚洲综合五月| 久久中文字幕导航| 久久中文字幕av| 野花国产精品入口| 国产乱子精品一区二区在线观看| yellow在线观看网址| 婷婷综合五月| 日本h片久久| 视频在线不卡免费观看| 亚洲精品一区二区妖精| 综合在线一区| 国产一区二区三区不卡视频网站| 91精品国产自产在线观看永久∴ | 亚洲另类黄色| 精品美女在线视频| 国产色播av在线| 欧美在线资源| 久久国产生活片100| 精品国产亚洲日本| 亚洲一区黄色| 麻豆精品在线视频| 99在线|亚洲一区二区| 日韩不卡一区二区| 日韩国产网站| 7777精品| 激情久久五月| 国产亚洲精品美女久久| 91精品一区国产高清在线gif | 黄在线观看免费网站ktv| 日韩一级欧洲| 久久精品一本| 久久亚洲视频| 欧美激情国产在线| 亚洲香蕉视频| 99视频精品全国免费| 欧美日韩亚洲国产精品| 欧美亚洲国产激情| 国产精品天天看天天狠| 精品一区在线| 精品女同一区二区三区在线观看| 免播放器亚洲| 久久精品国产福利| 天堂成人免费av电影一区| 精品国产欧美日韩| 免费看黄色91| 99国产精品免费视频观看| 国产欧美日韩精品高清二区综合区| 免费成人网www| 四虎国产精品免费观看| 中文字幕日韩高清在线| 久久亚洲国产| 日韩成人a**站| 国产精品资源| 中文一区一区三区免费在线观| 成人国产精选| 欧美日本不卡高清| 欧美日韩国产综合网| 国内在线观看一区二区三区| 日产欧产美韩系列久久99| 99香蕉国产精品偷在线观看| 日韩一区亚洲二区| 国产精品chinese| 国产日产精品_国产精品毛片| 亚洲综合婷婷| 一区二区亚洲视频|