DroidPlugin:360 手機助手在 Android 系統上實現的一種新的插件機制
DroidPlugin 是360手機助手在Android系統上實現了一種新的插件機制:它可以在無需安裝、修改的情況下運行APK文件,此機制對改進大型APP的架構,實現多團隊協作開發具有一定的好處。
定義:
HOST程序:插件的宿主。
插件:免安裝運行的APK
限制和缺陷:
- 無法在插件中發送具有自定義資源的
Notification
,例如: a. 帶自定義RemoteLayout的Notification b. 圖標通過R.drawable.XXX指定的通知(插件系統會自動將其轉化為Bitmap) - 無法在插件中注冊一些具有特殊Intent Filter的
Service
、Activity
、BroadcastReceiver
、ContentProvider
等組件以供Android系統、已經安裝的其他APP調用。 - 對
Activity
的LaunchMode支持不夠好,Activity Stack管理存在一定缺陷。Activity的onNewIntent
函數可能不會被觸發。 (此為BUG,未來會修復) - 缺乏對Native層的Hook,對某些帶native代碼的apk支持不好,可能無法運行。比如一部分游戲無法當作插件運行。
</ol>
- 支持Androd 2.3以上系統
- 插件APK完全不需做任何修改,可以獨立安裝運行、也可以做插件運行。要以插件模式運行某個APK,你無需重新編譯、無需知道其源碼。
- 插件的四大組件完全不需要在Host程序中注冊,支持Service、Activity、BroadcastReceiver、ContentProvider四大組件
- 插件之間、Host程序與插件之間會互相認為對方已經"安裝"在系統上了。
- API低侵入性:極少的API。HOST程序只是需要一行代碼即可集成Droid Plugin
- 超強隔離:插件之間、插件與Host之間完全的代碼級別的隔離:不能互相調用對方的代碼。通訊只能使用Android系統級別的通訊方法。
- 支持所有系統API
- 資源完全隔離:插件之間、與Host之間實現了資源完全隔離,不會出現資源竄用的情況。
- 實現了進程管理,插件的空進程會被及時回收,占用內存低。
- 插件的靜態廣播會被當作動態處理,如果插件沒有運行(即沒有插件進程運行),其靜態廣播也永遠不回被觸發。 </ol>
-
我們只是需要將Droid Plugin當作一個lib工程應用到主項目中,然后:
</li> -
在
AndroidManifest.xml
中使用插件的com.morgoo.droidplugin.PluginApplication
:
</li><application android:name="com.morgoo.droidplugin.PluginApplication" android:label="@string/app_name" android:icon="@drawable/ic_launcher"
-
如果你使用自定義的
</li> </ol>Application
,那么你需要在自定義的Application classonCreate
和attachBaseContext
方法中添加如下代碼:@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" />
-
集成完成。
</li> </ol>安裝、卸載插件:
-
安裝、更新插件,使用如下方法:
int PluginManager.getInstance().installPackage(String filepath, int flags)
說明:安裝插件到插件系統中,
</li>filepath
為插件apk路徑,flags
可以設置為0,如果要更新插件,則設置為PackageManagerCompat.INSTALL_REPLACE_EXISTING
返回值及其含義請參見PackageManagerCompat
類中的相關字段。 -
卸載插件,使用如下方法:
int PluginManager.getInstance().deletePackage(String packageName,int flags);
說明:從插件系統中卸載某個插件,
</li>packageName
傳插件包名即可,flags
傳0。 -
啟動插件:啟動插件的
</li> </ol> https://github.com/Qihoo360/DroidPluginActivity
、Service
等都和你啟動一個以及安裝在系統中的app一樣,使用系統提供的相關API即可。組件間通訊也是如此。本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
-
-
特點:
使用方法:
集成
在host中集成Droid Plugin項目非常簡單: