淺談Android虛擬機器的動態載入技術

來源:互聯網
上載者:User
11人收藏此文章, 我要收藏發表於1個月前(2013-03-04
15:23) , 已有147次閱讀 ,共0個評論

    Android虛擬機器的動態載入技術分為兩種:一種是載入基於NDK的so庫;另一種是載入用java語言開發的zip包。我今天主要討論後者。

    先簡單說明一下so庫載入。NDK的執行效率很高,加密性很好,但同時開發入門難度大,一般用於加解密、數學運算等場合。so的載入很簡單,如果APK發布時已經攜帶了so檔案,只需要在載入時調用System.loadLibrary(libName)方法即可。由於軟體的安裝目錄中存放so的目錄是沒有寫入權限的,開發人員不能更改該目錄的內容,所以如果要動態載入存放在其他地方的so檔案,用System.load(pathName)方法即可。

    現在我們重點來看一下如何用java開發android的動態包。之所以前面稱之為zip包,是因為jar和apk其實都是zip格式的。android虛擬機器支援這兩種檔案尾碼的包。android虛擬機器支援載入zip包中的dex格式的代碼檔案。所以我們要用到一個很重要的類DexClassLoader,這個類是動態加在技術的關鍵。提到動態載入,還需要用到的一個就是java的反射技術,下面就舉一個調用虛擬碼:

    DexClassLoader dcl = new DexClassLoader(zip檔案所在絕對路徑, zip檔案所在目錄, 預設載入so所在目錄,Context包含的classLoader);
    Class<?> clazz = dcl.loadClass(想要載入類的完整包名);
    Method getInstance = clazz .getMethod(方法名, 參數類);
    getInstance.invoke(null, 參數); //第一個參數為null表示是靜態方法

    這樣就把zip檔案中的類載入起來了,圖片等資源也可以放在zip包中載入。有了這個技術,很多的執行邏輯可以通過網路下載的方式動態調整,實現了應用的多樣性。

    不過動態載入是有一些限制的,比如zip包中的Activity、Service類是不能動態載入的,因為缺少聲明;即使你在Manifest檔案中進行了聲明,系統預設也是到安裝apk所在的路徑中去尋找類,所以你會遇到一個ClassNotFound的異常。外掛程式裡你可以用apk中先前放入的layout、strings等資源。但是外掛程式中內建的介面只能用純程式碼進行編寫,外掛程式中是不能載入zip包中的xml作為layout等資源使用的。所以在開發上一些特效會比較困難些,建議預先植入apk中。

    對於Activity、Service的動態載入,有一種變通的方法來解決,那就是在apk開發的時候預留各種Activity、Service的封裝類,定義最常用的處理event的方法,然後在事件處理的時候調用外掛程式內定義的方法即可。

    zip外掛程式的製作:將代碼和資源匯出成jar檔案。通常在這一步的基礎上我們用混淆器對代碼進行一次混淆。最後通過命令列dx命令將jar中的class檔案轉換成dex檔案。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.