DroidPlugin:360 手機助手在 Android 系統上實現的一種新的插件機制

jopen 9年前發布 | 12K 次閱讀 DroidPlugin

DroidPlugin 是360手機助手在Android系統上實現了一種新的插件機制:它可以在無需安裝、修改的情況下運行APK文件,此機制對改進大型APP的架構,實現多團隊協作開發具有一定的好處。

定義:

HOST程序:插件的宿主。

插件:免安裝運行的APK

限制和缺陷:

  1. 無法在插件中發送具有自定義資源的Notification,例如: a. 帶自定義RemoteLayout的Notification b. 圖標通過R.drawable.XXX指定的通知(插件系統會自動將其轉化為Bitmap)
  2. 無法在插件中注冊一些具有特殊Intent Filter的ServiceActivityBroadcastReceiverContentProvider等組件以供Android系統、已經安裝的其他APP調用。
  3. Activity的LaunchMode支持不夠好,Activity Stack管理存在一定缺陷。Activity的onNewIntent函數可能不會被觸發。 (此為BUG,未來會修復)
  4. 缺乏對Native層的Hook,對某些帶native代碼的apk支持不好,可能無法運行。比如一部分游戲無法當作插件運行。
  5. </ol>

    特點:

    1. 支持Androd 2.3以上系統
    2. 插件APK完全不需做任何修改,可以獨立安裝運行、也可以做插件運行。要以插件模式運行某個APK,你無需重新編譯、無需知道其源碼。
    3. 插件的四大組件完全不需要在Host程序中注冊,支持Service、Activity、BroadcastReceiver、ContentProvider四大組件
    4. 插件之間、Host程序與插件之間會互相認為對方已經"安裝"在系統上了。
    5. API低侵入性:極少的API。HOST程序只是需要一行代碼即可集成Droid Plugin
    6. 超強隔離:插件之間、插件與Host之間完全的代碼級別的隔離:不能互相調用對方的代碼。通訊只能使用Android系統級別的通訊方法。
    7. 支持所有系統API
    8. 資源完全隔離:插件之間、與Host之間實現了資源完全隔離,不會出現資源竄用的情況。
    9. 實現了進程管理,插件的空進程會被及時回收,占用內存低。
    10. 插件的靜態廣播會被當作動態處理,如果插件沒有運行(即沒有插件進程運行),其靜態廣播也永遠不回被觸發。
    11. </ol>

      使用方法:

      集成

      在host中集成Droid Plugin項目非常簡單:

      1. 我們只是需要將Droid Plugin當作一個lib工程應用到主項目中,然后:

        </li>

      2. AndroidManifest.xml中使用插件的com.morgoo.droidplugin.PluginApplication

        <application android:name="com.morgoo.droidplugin.PluginApplication" 
                     android:label="@string/app_name"
                     android:icon="@drawable/ic_launcher" 
        </li>

      3. 如果你使用自定義的Application,那么你需要在自定義的Application class onCreateattachBaseContext方法中添加如下代碼:

        </li> </ol>

        @Override
        public void onCreate() {
            super.onCreate();
            //這里必須在super.onCreate方法之后,順序不能變
            PluginHelper.getInstance().applicationOnCreate(getBaseContext());
        }

        @Override protected void attachBaseContext(Context base) { PluginHelper.getInstance().applicationAttachBaseContext(base); }</pre>
        將插件中Libraries\DroidPlugin\AndroidManifest.xml所有provider對應的authorities修改成自己的,默認為com.morgoo.droidplugin_stub_P00,如下:

        <provider
            android:name="com.morgoo.droidplugin.stub.ContentProviderStub$StubP00"
            android:authorities="com.morgoo.droidplugin_stub_P00"
            android:exported="false"
            android:label="@string/stub_name_povider" />

        可以修改為自己的包名,如: com.example.droidplugin_stub_P00 防止跟其它本插件使用者沖突:

        <provider
            android:name="com.morgoo.droidplugin.stub.ContentProviderStub$StubP00"
            android:authorities="com.example.droidplugin_stub_P00"
            android:exported="false"
            android:label="@string/stub_name_povider" />

        1. 集成完成。

          </li> </ol>

          安裝、卸載插件:

          1. 安裝、更新插件,使用如下方法:

            int PluginManager.getInstance().installPackage(String filepath, int flags) 

            說明:安裝插件到插件系統中,filepath為插件apk路徑,flags可以設置為0,如果要更新插件,則設置為PackageManagerCompat.INSTALL_REPLACE_EXISTING返回值及其含義請參見PackageManagerCompat類中的相關字段。

            </li>

          2. 卸載插件,使用如下方法:

            int PluginManager.getInstance().deletePackage(String packageName,int flags); 

            說明:從插件系統中卸載某個插件,packageName傳插件包名即可,flags傳0。

            </li>

          3. 啟動插件:啟動插件的ActivityService等都和你啟動一個以及安裝在系統中的app一樣,使用系統提供的相關API即可。組件間通訊也是如此。

            </li> </ol> https://github.com/Qihoo360/DroidPlugin

             本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
             轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
             本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!