osgiandroid
❶ 如何使用ApkPlug進行Android平台下模塊化開發
步驟1:注冊ApkPlug官網賬號:
打開Apkplug官網後,點擊右上角的「注冊」,在跳轉頁面填入相關信息,注冊界面如下:
確認後注冊成功,使用你的賬號登錄網站。你就可以用Apkplug開發應用了
END
步驟2:開發插件
Apkplug中的插件也是一個完整的apk,它與普通應用的區別有以下3點:
1, 插件assets目錄下有一個plugin.xml文檔,通過它可判斷一個工程是主應用還是插件。
2, 插件有一個入口類BundleActivator
3, 插件會外部引用一個osgi.jar文件
開發插件的步驟有如下4步:
1,引入osgi.jar庫文件
Apkplug中插件需要導入的庫文件只有一個osgi.jar。
導入osgi.jar庫文件需要注意一下
osgi.jar文件只能引用不能編譯到apk文件中,否則會出現類沖突的情況
異常代碼:had used a different Lorg/osgi/framework/BundleActivator; ring pre-verification。
osgi.jar包導入方法:
這文件在Apkplug SDK中可以找到。
❷ 怎樣在eclipse 工具中安裝android開發工具包插件
二 軟體安裝
(1)安裝jdk 6u19 安裝完成即可,無需配置環境變數
(2)解壓eclipse eclipse無需安裝,解壓後,直接打開就行
(3)解壓android sdk 這個也無需安裝,解壓後供後面使用
(4)最終有三個文件夾,如下圖:
三 Eclipse配置
1 安裝android 開發插件
(1)打開Eclipse, 在菜單欄上選擇 help->Install New SoftWare 出現如下界面:
點擊 Add按鈕,出現如下界面
輸入網址: https://dl-ssl.google.com/android/eclipse/ (如果出錯,請將https改成http)
名稱: Android (這里可以自定義)
點擊OK,將出現如下界面
點擊 Next按鈕 ,出現如下界面:
點擊Next按鈕,出現如下界面:
選擇 I accept the terms of the license agreements 點擊Next,進入安裝插件界面
安裝完成後,出現如下界面
點擊Yes按鈕,重啟Eclipse
2 配置android sdk
(1)點擊菜單window->preferences,進入如下界面
選擇你的android SDK解壓後的目錄,選錯了就會報錯,這個是升級工具,目前還沒有一個版本的SDK
(2)升級SDK版本,選擇菜單 window->Android sdk and avd manager 出現如下界面
選擇update all按鈕,出現如下界面
選擇左邊的某一項,點擊accept表示安裝,點擊reject表示不安裝,我這里只選了SDK 2.1 和samples for api 7 , 自己可以任意自定義,確定後,選擇install按鈕,進入安裝界面如下:
安裝完成如下:
(3)新建AVD(android vitural device) 和上面一樣,進入android sdk and avd manager,選中Vitural Devices 在點擊New按鈕
點擊New按鈕後,進入如下界面:
名稱可以隨便取,target選擇你需要的SDK版本,SD卡大小自定義,點擊 Create AVD,得到如下結果
如上顯示創建AVD完畢
3 新建Android項目
(1)選擇菜單file->new->other 進入如下界面:
選擇新建Android Project項目,點擊Next按鈕,進入如下界面
名稱自定義,應用程序名自定義,報名必須包含一個點以上,min SDK version裡面必須輸入整數
點擊Next出現如下界面:
注: 若有錯誤如: Project ... is missing required source folder: 'gen' ,則將gen->Android.Test->R.java這個文件刪掉,Eclipse會為我們重新生成這個文件,並且不會報錯。
(3)配置運行
右鍵項目->Run as -> Run Configuration 進入如下界面:
該界面,點擊Browse 按鈕,選擇你要運行的項目
選擇Target切換到以下界面
該界面選擇運行的AVD,將AVD前面的方框設置為選擇狀態。
(4)測試項目運行
右鍵項目名稱->run as ->Android Application 即可啟動運行該Android程序,如下所示:
正在進入
測試程序運行結果
❸ android 熱部署是什麼意思
在 Java 開發領域,熱部署一直是一個難以解決的問題,目前的 Java 虛擬機只能實現方法體的修改熱部署,對於整個類的結構修改,仍然需要重啟虛擬機,對類重新載入才能完成更新操作。對於某些大型的應用來說,每次的重啟都需要花費大量的時間成本。雖然 osgi 架構的出現,讓模塊重啟成為可能,但是如果模塊之間有調用關系的話,這樣的操作依然會讓應用出現短暫的功能性休克。本文將探索如何在不破壞 Java 虛擬機現有行為的前提下,實現某個單一類的熱部署,讓系統無需重啟就完成某個類的更新。
類載入的探索
首先談一下何為熱部署(hotswap),熱部署是在不重啟 Java 虛擬機的前提下,能自動偵測到 class 文件的變化,更新運行時 class 的行為。Java 類是通過 Java 虛擬機載入的,某個類的 class 文件在被 classloader 載入後,會生成對應的 Class 對象,之後就可以創建該類的實例。默認的虛擬機行為只會在啟動時載入類,如果後期有一個類需要更新的話,單純替換編譯的 class 文件,Java 虛擬機是不會更新正在運行的 class。如果要實現熱部署,最根本的方式是修改虛擬機的源代碼,改變 classloader 的載入行為,使虛擬機能監聽 class 文件的更新,重新載入 class 文件,這樣的行為破壞性很大,為後續的 JVM 升級埋下了一個大坑。
另一種友好的方法是創建自己的 classloader 來載入需要監聽的 class,這樣就能控制類載入的時機,從而實現熱部署。本文將具體探索如何實現這個方案。首先需要了解一下 Java 虛擬機現有的載入機制。目前的載入機制,稱為雙親委派,系統在使用一個 classloader 來載入類時,會先詢問當前 classloader 的父類是否有能力載入,如果父類無法實現載入操作,才會將任務下放到該 classloader 來載入。這種自上而下的載入方式的好處是,讓每個 classloader 執行自己的載入任務,不會重復載入類。但是這種方式卻使載入順序非常難改變,讓自定義 classloader 搶先載入需要監聽改變的類成為了一個難題。
不過我們可以換一個思路,雖然無法搶先載入該類,但是仍然可以用自定義 classloader 創建一個功能相同的類,讓每次實例化的對象都指向這個新的類。當這個類的 class 文件發生改變的時候,再次創建一個更新的類,之後如果系統再次發出實例化請求,創建的對象講指向這個全新的類。
下面來簡單列舉一下需要做的工作。
創建自定義的 classloader,載入需要監聽改變的類,在 class 文件發生改變的時候,重新載入該類。
改變創建對象的行為,使他們在創建時使用自定義 classloader 載入的 class。
自定義載入器的實現
自定義載入器仍然需要執行類載入的功能。這里卻存在一個問題,同一個類載入器無法同時載入兩個相同名稱的類,由於不論類的結構如何發生變化,生成的類名不會變,而 classloader 只能在虛擬機停止前銷毀已經載入的類,這樣 classloader 就無法載入更新後的類了。這里有一個小技巧,讓每次載入的類都保存成一個帶有版本信息的 class,比如載入 Test.class 時,保存在內存中的類是 Test_v1.class,當類發生改變時,重新載入的類名是 Test_v2.class。但是真正執行載入 class 文件創建 class 的 defineClass 方法是一個 native 的方法,修改起來又變得很困難。所以面前還剩一條路,那就是直接修改編譯生成的 class 文件。
利用 ASM 修改 class 文件
可以修改位元組碼的框架有很多,比如 ASM,CGLIB。本文使用的是 ASM。先來介紹一下 class 文件的結構,class 文件包含了以下幾類信息,一個是類的基本信息,包含了訪問許可權信息,類名信息,父類信息,介面信息。第二個是類的變數信息。第三個是方法的信息。ASM 會先載入一個 class 文件,然後嚴格順序讀取類的各項信息,用戶可以按照自己的意願定義增強組件修改這些信息,最後輸出成一個新的 class。
首先看一下如何利用 ASM 修改類信息。
清單 1. 利用 ASM 修改位元組碼
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
ClassReader cr = null;
String enhancedClassName = classSource.getEnhancedName();
try {
cr = new ClassReader(new FileInputStream(
classSource.getFile()));
} catch (IOException e) {
e.printStackTrace();
return null;
}
ClassVisitor cv = new EnhancedModifier(cw,
className.replace(".", "/"),
enhancedClassName.replace(".", "/"));
cr.accept(cv, 0);