1. 程式人生 > >RePlugin外掛啟動原始碼分析

RePlugin外掛啟動原始碼分析

圖片取自zoommy

大年初一,先祝各位新年快樂!今天還在看部落格學習的兄dei很強大,如果能把一年節日假期時間分配到自己成長上,那你的一年 = 別人一年 * 1.1。如果能夠做到年年如此,10年後你就相當於活了11年。而這期間,學習複利效應的效果是呈現指數增長的。當然,朋友關係也不能落下,但在節假日做無聊的事情就是浪費時間了。

之前搭建了RePlugin原始碼閱讀環境,詳情請參考部落格RePlugin閱讀原始碼環境搭建

今天來分析一下RePlugin啟動外掛(RePlugin.startActivity)的流程。

下圖是我用StarUML畫的時序圖-SequenceDiagram,簡單表現了RePlugin.startActivity呼叫後發生的事情及其先後順序。

RePlugin外掛啟動時序圖

下面進行詳細分析。

1. RePlugin.startActivity

RePlugin中啟動外掛,就是通過呼叫以下方法。

RePlugin.startActivity(context, intent);

// 或者

RePlugin.startActivity(context, intent, pluginName, activity);

RePlugin是一個有很多靜態方法的類。集成了安裝解除安裝外掛、啟動外掛等功能。使用RePlugin框架,一般來說只需要操作RePlugin類就行。

2. Factory.startActivityWithNoInjectCN

這兩個startActivity方法,最終都會呼叫

Factory.startActivityWithNoInjectCN(context, intent, plugin, activity, process);

startActivity(context, intent, pluginName, activity)方法,中間多了一步,就是給intent設定ComponentName。會先呼叫以下方法初始化componentName,然後呼叫startActivityWithNoInjectCN方法。

Factory.startActivity

Factory是框架內部的一個工具類,主要集成了查詢外掛、查詢外掛資源、查詢Activity資訊、載入外掛等功能。在啟動外掛中,Factory中所做的工作就是設定ComponentName給Intent。其中ComponentName主要包括兩個屬性:pkgName和clsName。這兩個屬性和外掛屬性對應關係:pkgName == pluginName、clsName == activityName。

startActivityWithNoInjectCN方法的程式碼如下:

boolean result = sPluginManager.startActivity(context, intent, plugin, activity, process);

RePlugin.getConfig().getEventCallbacks().onStartActivityCompleted(plugin, activity, result);

startActivityWithNoInjectCN就包括兩部分,第一行程式碼是直接呼叫PluginCommImpl的startActivity方法啟動Activity,這個在下一部分繼續說。

第二行是呼叫RePluginConfig的方法回撥,告知已經啟動Activity。這裡的RePluginConfig回撥,是可以在自己宿主的application中設定的。設定回撥後,就可以在application中進行各個事件的處理,比如外掛安裝失敗事件回撥方法onInstallPluginFailed。以官方samplehost程式碼為例,設定回撥的程式碼如下。

// SampleApplication.java

repluginConfig.setEventCallbacks(new HostEventCallbacks(this));
3. PluginCommImpl.startActivity

Factory.startActivityWithNoInjectCN中,呼叫了pluginCommImpl.startActivity方法,而在此方法中沒有做任何實質的工作,直接呼叫了PluginLibraryInternalProxy.startActivity方法。

4. pluginLibraryInternalProxy.startActivity

PluginLibraryInternalProxy是最終實現啟動外掛的地方,也是做了最多工作的地方。流程圖見下圖。

pluginLibraryInternalProxy.startActivity流程圖

在PluginLibraryInternalProxy中,先判斷download標籤和plugin是否為null。download標籤預設為true,目前沒有手動修改的辦法。如果判斷成立,則回撥application中的方法。

然後判斷是否是動態類,是的話設定Intent、啟動Activity即可。否則進入下一步。

如果外掛還沒有載入,呼叫onLoadLargePluginForActivity方法載入外掛。然後初始化ComponentName,設定Intent,呼叫context.startActivity啟動外掛中指定的Activity。最後呼叫回撥方法,通知application已經啟動完畢。

總結

這樣來看,RePlugin啟動外掛,也就是RePlugin.startActivity方法的呼叫過程,最終還是呼叫context.startActivity方法實現的。RePlugin框架所做的就是對Activity的pkgName、activityName進行處理:使用這兩個屬性建立ComponentName,並傳遞給Intent;以及在啟動外掛的不同時期,對RePluginConfig的回撥,如未找到外掛時會回撥onPluginNotExistsForActivity方法。

最後,RePlugin啟動外掛可以說是RePlugin框架原始碼的入口,接下來會對外掛安裝、解除安裝等功能的原始碼進行分析,以此一步步的對RePlugin框架整體建立系統的認識,對RePlugin的實現機制有所瞭解。學習框架中的設計模式,最終能夠應用到自己的程式碼中去。

版權宣告
本文首發自簡書:搜尋作者 QinGeneral
同步發於CSDN部落格:搜尋作者 迷失
無需授權即可轉載,甚至無需保留以上版權宣告;
轉載時請務必註明作者。