Android插件化學(xué)習(xí)總結(jié)

插件化概念

個人總結(jié)為:它是由宿主和插件應(yīng)用結(jié)合而成,兩者遵守一些標(biāo)準(zhǔn)規(guī)范的情況下昔榴,插件無需安裝辛藻,即可按需加載使用!

插件化優(yōu)點

  • 宿主和插件分開編譯
  • 并發(fā)進(jìn)行開發(fā)
  • 動態(tài)更新插件
  • 按需下載模塊
  • 方法數(shù)和變量數(shù) 65536問題

插件化步驟

  • 插件化分為宿主應(yīng)用和插件應(yīng)用
  • 新建Project - 也就是宿主應(yīng)用
  • 新建一個Module互订,具有生命周期接口吱肌,宿主跳插件應(yīng)用需要遵守一些標(biāo)準(zhǔn)規(guī)范
  • 新建Table Module - 也就是插件應(yīng)用,同時在BaseActivity里面實現(xiàn)生命周期接口
  • Module通過attach方法注入上下文context仰禽,因為插件apk未安裝氮墨,所以不能直接使用插件的上下文
  • 插件里面重寫setContextView(),getWindowManger,getClassLoader這些需要使用上下文的方法纺蛆,然后使用注入的that進(jìn)行替換super調(diào)用
  • 在宿主app里面創(chuàng)建ProxyActivity,通過插樁的方式進(jìn)行注冊插件的Activity规揪。ProxyActivity里面獲取跳轉(zhuǎn)傳入的className,同時重寫getClassLoader和getResource的方法桥氏,替換為PluginManager創(chuàng)建的ClassLoader和Resource
  • 創(chuàng)建PluginManager,單例的形式創(chuàng)建,實現(xiàn)loadPath方法,去加載apk(DexClassLoader)猛铅。因為 未安裝就不能通過getClassLoader的方式Class.forName這樣的方式了
  • 加載未安裝apk(DexClassLoader)
  • 插件二級Activity的地方回傳到宿主APP里面字支,BaseActivity里面startActivity

主要代碼有:
1、初始化插件的ClassLoader奕坟,插件的主Activity祥款,插件的Resources

object PluginManager {
    private lateinit var dexClassLoader:DexClassLoader
    private lateinit var resource:Resources
    private var entryActivityName:String = ""
    fun loadPath(context:Context,path: String){
        //獲取插件的ClassLoader
        val dexOutFile = context.getDir("dex",Context.MODE_PRIVATE)
        dexClassLoader = DexClassLoader(path,dexOutFile.absolutePath,null,context.classLoader)
        //插件的第一個Activity
        val packageManager = context.packageManager
        val packageInfo = packageManager.getPackageArchiveInfo(path,PackageManager.GET_ACTIVITIES)
        entryActivityName =  packageInfo.activities[0].name
        //實例化Resource
        val assetManager = AssetManager::class.java.newInstance()
        AssetManager::class.java.getDeclaredMethod("addAssetPath",String::class.java).invoke(assetManager,path)
        resource = Resources(assetManager,context.resources.displayMetrics,context.resources.configuration)
    }
    fun getClassLoader() = dexClassLoader
    fun getResource() = resource
    fun getEntryActivityName() = entryActivityName
}

2、插樁的形式創(chuàng)建ProxyActivity

class ProxyActivity : Activity() {
    private var className: String? = null
    private var aliPayInterface: IAliPay? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        className = intent.getStringExtra("className")
        try {
            val activityClass = classLoader.loadClass(className)
            val constructor = activityClass.getConstructor(*arrayOf())
            val instance = constructor.newInstance(*arrayOf())
            aliPayInterface = instance as IAliPay
            aliPayInterface!!.attach(this)
            val bundle = Bundle()
            aliPayInterface!!.onCreate(bundle)

        } catch (e: ClassNotFoundException) {
            e.printStackTrace()
        } catch (e: NoSuchMethodException) {
            e.printStackTrace()
        } catch (e: SecurityException) {
            e.printStackTrace()
        } catch (e: InstantiationException) {
            e.printStackTrace()
        } catch (e: IllegalAccessException) {
            e.printStackTrace()
        } catch (e: InvocationTargetException) {
            e.printStackTrace()
        }

    }

    override fun onStart() {
        super.onStart()
        aliPayInterface!!.onStart()
    }

    override fun onResume() {
        super.onResume()
        aliPayInterface!!.onResume()
    }

    override fun onPause() {
        super.onPause()
        aliPayInterface!!.onPause()
    }

    override fun onStop() {
        super.onStop()
        aliPayInterface!!.onStop()
    }

    override fun onDestroy() {
        super.onDestroy()
        aliPayInterface!!.onDestroy()
    }

    override fun getClassLoader(): ClassLoader {
        return PluginManager.getClassLoader()
    }

    override fun getResources(): Resources {
        return PluginManager.getResource()
    }

    override fun startActivity(intent: Intent) {
        val classNameFromTaoPiaoPiao = intent.getStringExtra("className")
        val newIntent = Intent(this, ProxyActivity::class.java)
        newIntent.putExtra("className", classNameFromTaoPiaoPiao)
        startActivity(newIntent)
    }
}

通過插件的classLoader和傳入的className獲取到約定規(guī)范的AliPay接口月杉,然后調(diào)用插件里面主Activity的生命周期刃跛,同時重寫ProxyActivity的跳轉(zhuǎn),從而實現(xiàn)插件的二級頁面的跳轉(zhuǎn)苛萎。

詳細(xì)Demo查看Github-GoachAlipay

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末桨昙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子腌歉,更是在濱河造成了極大的恐慌蛙酪,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翘盖,死亡現(xiàn)場離奇詭異桂塞,居然都是意外死亡,警方通過查閱死者的電腦和手機馍驯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進(jìn)店門阁危,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人汰瘫,你說我怎么就攤上這事狂打。” “怎么了混弥?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵趴乡,是天一觀的道長。 經(jīng)常有香客問我蝗拿,道長晾捏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任哀托,我火速辦了婚禮粟瞬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘萤捆。我一直安慰自己裙品,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布俗或。 她就那樣靜靜地躺著市怎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辛慰。 梳的紋絲不亂的頭發(fā)上区匠,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天,我揣著相機與錄音帅腌,去河邊找鬼驰弄。 笑死,一個胖子當(dāng)著我的面吹牛速客,可吹牛的內(nèi)容都是我干的戚篙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼溺职,長吁一口氣:“原來是場噩夢啊……” “哼岔擂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起浪耘,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤乱灵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后七冲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痛倚,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年澜躺,在試婚紗的時候發(fā)現(xiàn)自己被綠了蝉稳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡苗踪,死狀恐怖颠区,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情通铲,我是刑警寧澤毕莱,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站颅夺,受9級特大地震影響朋截,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吧黄,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一部服、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拗慨,春花似錦廓八、人聲如沸奉芦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽声功。三九已至,卻和暖如春宠叼,著一層夾襖步出監(jiān)牢的瞬間先巴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工冒冬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留伸蚯,地道東北人。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓简烤,卻偏偏與公主長得像剂邮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子乐埠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內(nèi)容