VirtualApp原理解析(3)--安裝雙開應用流程

VirtualApp原理解析(3)–安裝雙開應用流程

雙開應用安裝在後天服務進程中進行,主要是解析apk文件信息,獲取存儲Activity、Service、廣播等組建信息並保存。

以下是主要流程圖:

在ListActivity中選擇需要安裝的目標應用後,後回到HomeActivity在onActivityResult()中接受需要安裝的應用的信息AppInfoLite。安裝流程是從此處開始的。

1.直接調用到HomePresenterImpl.addApp(AppInfoLite)方法執行安裝邏輯。在addApp方法中:

  • 首先通過VirtualCore調用VAppMS.getInstalledAppInfo()檢查該包名對應的應用是否執行官安裝操作,即是否存在對應的數據結構InstalledAppInfo。根據該數據結構是否爲null判斷是否已經安裝過。

  • 假設首次安裝執行到AppRepository.addVirtualApp()該函數內部跨進程調用到後臺服務進程中的VAppMS.installPackage()真正執行安裝的地方就在此處。

2.在VAppMS.installPackage()執行安裝邏輯:

  • 首先調用PackageParserEx.parsePackage()傳入apk路徑,該方法內部會反射獲取PackageParser對象並解析對應apk獲取該應用的組件信息並保存到VPackage中。

  • 從PackageCacheManager中的緩存中獲取對應包名的VPackage數據結構,凡是安裝成功的應用這裏都會保存。通過獲取的VPackage中的PackageSetting變量是否爲null判斷該應用是否已經安裝過。如果安裝過需要判斷是否需要更新操作。這裏涉及到應用升級邏輯。

  • 爲該應用新建一個文件夾。如果是一個更新操作刪除對應應用目錄。

  • 接下來判斷是否依賴系統的條件,如果不依賴與系統需要將目標apk拷貝到VirtualApp中爲應用新建的文件夾下。同時需要設置下該文件夾權限。

  • 接着新建一個PackageSetting數據結構,將上述屬性如:是否依賴系統、是否是art模式、目標apk所在路徑、以及自己定義的一個uid。這個uid純粹是自己定義爲了區分該應該是第幾次雙開使用。因爲VirtualApp支持同一應用多次安裝成功多個應用同時的雙開,這裏uid就是爲了區分這種情況。還有需要保存一個安裝時間更新時間等。

  • 調用PackageParserEx.savePackageCache()將VPackage持久化保存到配置文件中。

  • 最後調用PackageCacheManager.put()函數,這裏由一些關鍵步驟:

    • 首先調用PackageParserEx.initApplicationInfoBase(ps, pkg);該函數是將VPackage中的ApplicationInfo數據結構對應的應用文件目錄、dataDir等屬性修改爲PackageSetting中的屬性。

    • 接着保存一份VPackage到PackageCacheManager中緩存下次判斷使用。同時將PackageSetting保存到VPackage的mExtras字段中。

    • 最後調用到VPMS.analyzePackageLocked()該函數內部會將傳入的VPackage中的四大組件信息遍歷之後保存到VPMS中對應的ActivityIntentResolver…一系列數據結構中。

  • 執行完以上之後調用BroadcastSystem.get().startApp(pkg)處理目標應用中的靜態廣播,將該該廣播先註冊到VirtualApp中,當收到廣播後先到VirtualApp中,根據廣播類型及其他條件確定是否需要分發給雙開應用中去處理。

  • 最後如果有需要通知接口應用安裝成功。返回安裝結果。

3.安裝結束需要獲取安裝後的信息及通知UI安裝結果。

  • 首先調用PackageAppDataStorage.get().acquire()獲取一個PackageAppData,這個東西其實就是之前安裝信息的分裝。

  • 根據PackageAppData判斷是否是已經安裝過的應用及多版本模式雙開。

  • 如果第一次安裝通知UI安裝,調用handleOptApp()函數。該函數中調用preOpt獲取安裝的信息,如果該應用不是在art模式下運行執行dex文件優化。最後在一次更新UI。

以上就是雙開應用安裝步驟,簡單總結如下:

  • 安裝主要流程是在後臺服務進程中的VAppMS中進行。

  • 安裝過程主要是反射調用系統API解析傳入apk獲取該應用組件信息並保存。

  • 安裝成功後同時將組件信息保存到VPMS中。

  • 安裝後續工作優化dex文件及通知UI展示。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章