Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android插件開發初探——基礎篇

Android插件開發初探——基礎篇

編輯:關於Android編程

Android插件開發初探

對於Android的插件化其實已經討論已久了,但是市面上還沒有非常靠譜成熟的插件框架供我們使用。這裡我們就嘗試性的對比一下Java中,我們使用插件化該是一個怎麼樣的流程,且我們如何將此流程移植到Android框架上去使用。很多代碼都是內部資料,不喜勿噴,謝謝~

為什麼要插件化?

功能越來越多 代碼、安裝包越來越大 小的更新也需要重新發布 更新頻繁,安裝成本太大 用戶無法選擇性加載需要的模塊 ……

插件化的好處

主安裝包較小 強制模塊化,降低耦合度 減少整體更新的次數 插件可單獨靜默更新 用戶可以有所選擇 ……

插件化的要求

沒有獨立運行的入口 主應用控制,下載、安裝、刪除、靜默升級、打開和關閉 主應用和插件資源共享

安裝包的組成

entervcq9xvS2r77fzOW1xLLlvP6jrM2syrG0+MjrTWFwwODQzbLOyv278tXfanNvbrSuss7K/SDKudPDz+DNrLXEYW5kcm9pZDpzaGFyZWRVc2VySWSjrNfK1LTK/b7dubLP7SC4+b7dc2hhcmVkVXNlcklkwLSy6dXSsuW8/iBxdWVyeUludGVudEFjdGl2aXRpZXOy6dXSt/u6z9XiuPZhY3Rpb261xMv509BhY3Rpdml0eaOou/LG5Mv8o6m8tLLlvP4gcXVlcnm3vcq9v8nS1LvxtcOy5bz+tcTCt7620tS8sMq1z9a907/awOC1xMDgw/sgzai5/bzsy/dzaGFyZWRVc2VySWTE3Lm7tcO1vcK3vrbItM7et6i78bXDtb3A4MP7IM2os6O/ydLUyrnTw9K7uPbD6Mr2zsS8/qOoeG1soaJqc29uo6nD6Mr2suW8/r3hubkgY3JlYXRlUGFja2FnZUNvbnRleHQoKSBnZXRSZXNvdXJjZXNGb3JBcHBsaWNhdGlvbigpDQo8cD48c3Ryb25nPravzKy809TYxtXNqMDgPC9zdHJvbmc+PGJyIC8+DQotIEphdmEgv8nS1NPDIENsYXNzTG9hZGVyILavzKy809TYLmphciDW0LXEQ2xhc3POxLz+o6xhbmRyb2lkv8nS1MLwo788YnIgLz4NCi0gUGF0aENsYXNzTG9hZGVyPGJyIC8+DQotIERleENsYXNzTG9hZGVyPC9wPg0KPHA+PHN0cm9uZz6907/awOA8L3N0cm9uZz48L3A+DQo8cHJlIGNsYXNzPQ=="brush:java;"> package com.plug; public interface InterfacePlug { public String function_01(); public int function_02(int a,int b); }

實現類

import com.plug.InterfacePlug;
public class PlugImpl  implements InterfacePlug{
    @Override
    public String function_01() {
        return null;
    }

    @Override
    public int function_02(int a, int b) {
        return a+b;
    }
}

主應用類

package com.host;

public class MyhostActivity extends Activity {
    public void useDexClassLoader() {
        DexClassLoader cDexClassLoader =
                new DexClassLoader(/mnt/sdcard/Myplugdex.jar, /data/data/com.host, null, this.getClass()
                        .getClassLoader());
        try {
            Class class1 = cDexClassLoader.loadClass(com.plug.PlugImpl);
            InterfacePlug interfacePlug = (InterfacePlug) class1.newInstance();
            int ret = interfacePlug.function_02(12, 13);
            tv.setText( return value : + ret);
        } catch (Exception e) {
        }
    }
}

enter

導出插件包時只能導出實現類,否則會出餡喎?/kf/yidong/wp/" target="_blank" class="keylink">WPC9zdHJvbmc+PC9wPg0KPHByZSBjbGFzcz0="brush:java;"> Classref in pre-verified class resolvedtounexpected implementation 重復定義錯誤

當然,安裝包的解析與插件安裝遠不止於類文件的加載,我們還需要:

不是普通類怎麼辦? 系統組件如何接收回調? 如何加載資源? PackageInfo處理? Resources的處理? Assets的處理?

動態加載系統組件和資源

PluginLib
enter

PluginHost
enter

PluginTest

enter

我們一個簡單的插件框架就如下圖所示:
enter

主應用列出安裝的Plugins,點擊啟動對應的PluginActivity
enter

當然,我們也可以根據此簡單的機制來完成一個完整的插件系統。

可以基本完整實現一個Activity

可以繼續增加其他組件的插件,完成更多的功能(Service,Receiver,ContentProvider,Application?)

此插件機制的缺點

Manifest中注冊的信息由系統控制,因此插件需要權限信息需要預先注冊在主程序中。 目前實現有一定的限制,如插件宿主的相互調用、插件間的相互調用

Github上的插件框架,基於Fragment的開源插件框架

https://github.com/mmin18/AndroidDynamicLoader UI基於Fragment 反射得到Resources 通過uri進行頁面跳轉

/*
* @author zhoushengtao(周聖韬)
* @since 2015年1月27日 上午14:02:22
* @weixin stchou_zst
* @blog http://blog.csdn.net/yzzst
* @交流學習QQ群:341989536
* @私人QQ:445914891
/

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved