Android插件化開篇

前言

我在好久以前就想寫一系列關於插件化的博客,但是總被這樣或那樣的事情打斷。上週終於下定決心去作這個事情。今天這篇文章是一個開篇,做用有兩個:一是把吹的牛發佈到網上,前面已經說過了;二是對插件化的知識作一個簡單的介紹,順便幫本身整理一下接下來的寫做思路。網絡

什麼是插件化

一般,咱們的app只有一個apk文件。而插件化是一種將app拆分爲多個apk的技術,每個apk都是app功能的一部分。通常,咱們把app啓動時由系統加載的apk稱之爲宿主。而宿主是能夠加載其餘的apk的,這些被宿主加載的apk咱們稱爲插件。app

插件化的用途

在學習一項新技能以前,咱們首先要弄清楚它能爲咱們帶來什麼。那插件化能給咱們帶來什麼呢?框架

  • 從項目管理角度來講:學習

    1. 插件化將應用的不一樣功能劃分到一個個的插件中,便於程序的維護。
    2. 每一個插件能夠單獨運行調試極大的提升了開發效率。
    3. 每一個插件互不影響,多人協同開發更加高效。
  • 從程序運行角度來講:gradle

    1. 按需加載插件,佔用內存更少。
    2. 按需更新,更省流量。
  • 從公司運營角度來講:優化

    1. 實時更新,便於運營推廣。
    2. 修復線上BUG,將風險降到最低。

插件化須要哪些內功

插件化像是一門十分高深的武功,它須要修習者有必定理論基礎後才能修煉。那它須要哪些理論支撐呢?操作系統

  • ClassLoader插件

    ClassLoader是由JVM平臺提供的類加載器。它容許程序從網絡、硬盤甚至是內存加載Class,這就爲Android插件化提供了最基礎的技術保障。咱們知道Android平臺對字節碼文件做了優化,摒棄了傳統JVM須要的.jar文件,而是採用體積更小的.dex文件。所以,Android自定義了一系列ClassLoader以知足對dex加載。在這些ClassLoader中,有一個DexClassLoader,它容許咱們的app加載外部的.jar和.apk文件。翻譯

  • 反射和Hook技術調試

    Hook的翻譯是"鉤子"。咱們知道Android操做系統有一套本身的機制,例如,Activity啓動流程、事件分發機制、資源管理機制等。有時候,這些機制沒法知足咱們的需求,經過系統的API也無能爲力。這時候就須要Hook技術對原有流程進行攔截,而後將系統流程替換成咱們本身的流程。而反射是Hook技術的一種必要手段。

  • APP安裝過程

    咱們知道apk文件中包含了app運行須要的Activity、Service等信息。這些信息是在程序安裝過程當中經過PackageManagerService解析AndroidManifest文件取得的。只有瞭解了這些原理,咱們才能知道如何解析插件中的Activity、Service等信息。

  • 四大組件的啓動流程

    單純解析出插件的Activity、Service等信息是不行,咱們指望的是這些Activity、Service等能夠像咱們普通App中的同樣能夠正常運行。這就須要咱們去熟悉四大組件的啓動流程,而後經過Hook技術加入宿主啓動插件的Activity、Service等邏輯。

  • 資源管理

    插件化會給資源管理帶來兩個問題:

    1. 在Android打包編譯時,gradle會爲圖片、文案等資源生成一個惟一的Id。在運行期,經過對資源Id的引用來查找相應的資源。因爲宿主apk和各插件apk打包不是在一次gradle assemble命令中完成的,這就有可能形成多個apk中產生的資源id相同,咱們稱之爲資源衝突

    2. 各apk中的資源是沒法共享的,例如在宿主中沒法引用插件中的資源。

    爲了解決這兩個問題,咱們有必要掌握Android平臺的資源管理機制。

後續文章會以什麼樣的方式呈現

後續文章我會採用原理+DEMO的表現形式。在每篇文章的前半部分主要是介紹原理知識;後半部分是代碼Demo,這些Demo串聯在一塊兒就是一個簡單的插件化框架。

相關文章
相關標籤/搜索