標籤:android openatlas 外掛程式化 啟動方式 啟動廣播
到現在為止已經寫了6篇文章了
- Android外掛程式化開發之OpenAtlas初體驗
- Android外掛程式化開發之OpenAtlas產生外掛程式資訊列表
- Android外掛程式化開發之OpenAtlas資源打包工具補丁aapt的編譯
- Android外掛程式化開發之OpenAtlas外掛程式適配
- Android外掛程式化開發之解決OpenAtlas組件在宿主的註冊問題
- Android外掛程式化開發之OpenAtlas中四大組件與Application功能的驗證
這篇文章主要介紹一下OpenAtlas外掛程式的幾種啟動方式,在AtlasConfig這個類中,有幾個靜態字串數組
public class AtlasConfig { public static String[] DELAY = new String[]{}; public static String[] AUTO = new String[]{}; public static String[] STORE = new String[]{};}
也就是OpenAtlas的外掛程式的啟動的三種方式,DELAY 為延時載入,即用到的時候才會去載入。AUTO 為隨宿主啟動而啟動,而STORE看名字還不知道他的啟動方式是怎麼樣的。我們看下什麼地方引用了它,其實整個架構中就兩個函數引用了它,在OptDexProcess類中
/**** 對已安裝並且安裝方式為STORE的Bundle進行dexopt操作 ****/ private void optStoreDex() { for (Bundle bundle : Atlas.getInstance().getBundles()) { if (!(bundle == null || contains(AtlasConfig.STORE, bundle.getLocation()))) { try { ((BundleImpl) bundle).optDexFile(); Log.e("OptDexProcess", "optStoreDex"); } catch (Throwable e) { if (e instanceof DexLoadException) { throw ((RuntimeException) e); } Log.e("OptDexProcess", "Error while dexopt >>>", e); } } } } /**** 對全部安裝方式為Store的Bundle進行dexopt操作 ***/ private void optStoreDex2() { for (String bundle : AtlasConfig.STORE) { Bundle bundle2 = Atlas.getInstance().getBundle(bundle); if (bundle2 != null) { try { ((BundleImpl) bundle2).optDexFile(); Log.e("OptDexProcess", "optStoreDex2"); } catch (Throwable e) { if (e instanceof DexLoadException) { throw ((RuntimeException) e); } Log.e("OptDexProcess", "Error while dexopt >>>", e); } } } }
看函數好像是對dex繼續最佳化。
在Android系統中,一個App的所有代碼都在一個Dex檔案裡面。Dex是一個類似Jar的存
儲了多有Java編譯位元組碼的歸檔檔案。因為Android系統使用Dalvik虛擬機器,所以需要把
使用Java Compiler編譯之後的class檔案轉換成Dalvik能夠執行的class檔案。這裡需要強
調的是,Dex和Jar一樣是一個歸檔檔案,裡面仍然是Java代碼對應的位元組碼檔案。
當Android系統啟動一個應用的時候,有一步是對Dex進行最佳化,這個過程有一個專門的
工具來處理,叫DexOpt。DexOpt的執行過程是在第一次載入Dex檔案的時候執行的。這
個過程會產生一個ODEX檔案,即Optimised Dex。執行ODex的效率會比直接執行Dex文
件的效率要高很多。
但是呢,我在裡面加入了日誌,看輸出,仍然看不到其輸出,只有隨宿主啟動的才會進行odex最佳化,配置了STORE,也看不到最佳化的日誌輸出,這裡姑且不去理會,也可能是我使用的方式不對,一般我們使用DELAY或者AUTO即可。我們對之前的幾個外掛程式進行配置。讓test隨宿主啟動,讓zxing延時載入,其他幾個為STORE(其實在效果上和DELAY差不多,只不過可能內部真的進行了odex最佳化,然而我看不到日誌輸出而已),配置的位置呢,在我們宿主的Applictaion中即可,使用靜態代碼塊。
public class BootApp extends AtlasApp { static{ AtlasConfig.DELAY = new String[]{"com.lizhangqu.zxing"}; AtlasConfig.AUTO = new String[]{"com.lizhangqu.test"}; AtlasConfig.STORE = new String[]{"com.lizhangqu.fragment","com.lizhangqu.component"}; } @Override public void onCreate() { super.onCreate(); }}
下面的外掛程式啟動的日誌輸出。隨宿主啟動的外掛程式
延時載入的外掛程式,只要啟動了它才會被載入。
還有一個重要的問題就是外掛程式如果隨宿主啟動,我們要知道外掛程式是否安裝成功。安裝成功後進行頁面跳轉。而外掛程式只需要安裝一次,安裝完後就可直接啟動了。這裡OpenAtlas提供了一個廣播,當外掛程式安裝完成後會廣播該訊息。我們註冊該廣播即可。
public class BootActivity extends Activity { private BundlesInstallBroadcastReceiver atlasBroadCast; private class BundlesInstallBroadcastReceiver extends BroadcastReceiver { private BundlesInstallBroadcastReceiver() { } @Override public void onReceive(Context context, Intent intent) { try { startActivity(new Intent(BootActivity.this,MainActivity.class)); BootActivity.this.finish(); Log.e("TAG","BundlesInstallBroadcastReceiver,the bundle has install"); } catch (Exception e) { } } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_boot); if ("false".equals(System.getProperty("BUNDLES_INSTALLED", "false"))) { this.atlasBroadCast = new BundlesInstallBroadcastReceiver(); registerReceiver(this.atlasBroadCast, new IntentFilter(PlatformConfigure.ACTION_BROADCAST_BUNDLES_INSTALLED)); }else{ startActivity(new Intent(BootActivity.this,MainActivity.class)); BootActivity.this.finish(); } }}
就這樣,可以監聽到外掛程式的安裝,當時該廣播只有安裝外掛程式的時候會廣播,安裝成功後之後就不會再進行廣播了,使用的時候注意一下就好了。
原始碼,就不傳csdn,放在github上,有興趣的clone下來看看就好了。
- https://github.com/lizhangqu/OpenAtlasDemo
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Android外掛程式化開發之OpenAtlas外掛程式啟動方式與外掛程式啟動廣播