編輯:Android開發實例
前言
在目前的軟硬件環境下,Native App與Web App在用戶體驗上有著明顯的優勢,但在實際項目中有些會因為業務的頻繁變更而頻繁的升級客戶端,造成較差的用戶體驗,而這也恰恰是Web App的優勢。本文對網上Android動態加載jar的資料進行梳理和實踐在這裡與大家一起分享,試圖改善頻繁升級這一弊病。
正文
一、 基本概念和注意點
1.1 首先需要了解一點:在Android中可以動態加載,但無法像Java中那樣方便動態加載jar
原因:Android的虛擬機(Dalvik VM)是不認識Java打出jar的byte code,需要通過dx工具來優化轉換成Dalvik byte code才行。這一點在咱們Android項目打包的apk中可以看出:引入其他Jar的內容都被打包進了classes.dex。
所以這條路不通,請大家注意。
1.2 當前哪些API可用於動態加載
1.2.1 DexClassLoader
這個可以加載jar/apk/dex,也可以從SD卡中加載,也是本文的重點。
1.2.3 PathClassLoader
只能加載已經安裝到Android系統中的apk文件。
二、 准備
本文主要參考"四、參考文章"中第一篇文章,補充細節和實踐過程。
2.1 下載開源項目
http://code.google.com/p/goodev-demo
將項目導入工程,工程報錯的話應該是少了gen文件夾,手動添加即可。注意這個例子是從網上下載優化好的jar(已經優化成dex然後再打包成的jar)到本地文件系統,然後再從本地文件系統加載並調用的。本文則直接改成從SD卡加載。
三、實踐
3.1 編寫接口和實現
3.1.1 接口IDynamic
package com.dynamic;3.1.2 實現類DynamicTest
package com.dynamic;
3.2 打包並轉成dex
3.2.1 選中工程,常規流程導出即可,如圖:
注意:在實踐中發現,自己新建一個Java工程然後導出jar是無法使用的,這一點大家可以根據文章一來了解相關原因,也是本文的重點之一。這裡打包導出為dynamic.jar
(後期修復:打包請不要把接口文件打進來,參見文章末尾後續維護!)
3.2.2 將打包好的jar拷貝到SDK安裝目錄android-sdk-windows\platform-tools下,DOS進入這個目錄,執行命名:
dx --dex --output=test.jar dynamic.jar
3.3 修改調用例子
修改MainActivity,如下:
@Override
3.4 執行結果
四、參考文章
[推薦]在Android中動態載入自定義類
Android app中加載jar插件
關於Android的ClassLoader探索
Android App 如何動態加載類
五、補充
大家可以看看DexClassLoader的API文檔,裡面不提倡從SD卡加載,不安全。此外,我也正在組織翻譯組盡快把這個命名空間下的幾個類都翻譯出來,以供大家參考。
工程下載:這裡,Dex文件下載:這裡。大家可以直接把Dex文件拷貝到SD卡,然後運行例子。
六、後期維護
6.1 2011-12-1 修復本文錯誤
感謝網友ppp250和liuzhaocn的反饋,基本按照評論2來修改:
6.1.1 不需要在本工程裡面導出jar,自己新建一個Java工程然後導出來也行。
6.1.2 導出jar時不能帶接口文件,否則會報以下錯:
java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
6.1.3 將jar優化時應該重新成jar(jar->dex->jar),如果如下命令:
dx --dex --output=test.jar dynamic.jar
結束
除了翻譯組的工作和自己本職的工作以外,很難抽時間出來分享一些開發心得,但正所謂擠擠總是有的,歡迎交流!
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩