Android 插件擴展系列之 -- 封裝與應用


<---擴展插件最終是以“.jar”的形式提交到服務器,也要符合我們的命名規范,即plugin_+插/件名稱。其中插件名稱要和plugin.xml中的uexName一致。例如plugin_uexDemo.jar,和下載管理插件plugin_DownloaderMgr.jar等。--->

 

1.   開發環境搭建

Android的開發環境搭建主要包括JDK、Eclipse、Android SDK的安裝。

您也可以直接安裝好JDK后,去Android官網下載ADT套裝(http://developer.android.com/tools/index.html) ,解壓縮即可使用。

整個安裝過程較為簡單,下面主要驗證JDK和Android SDK是否安裝成功的問題。

1.1.  JDK安裝驗證

安裝完成之后,可以在檢查JDK是否安裝成功。打開cmd窗口,輸入java –version 查看JDK的版本信息。出現類似下面的畫面表示安裝成功了:

1.   擴展插件的開發

1.1.  開發流程

1.1.1.    插件開發基本流程

1.1.1.1.  插件開發基礎工程搭建

將AppcanBaseProject導入eclipse,此工程為插件開發基礎工程,工程內res及assets文件夾含有插件開發的必要文件,開發者不要隨意刪除。

1.1.1.1.  將代碼集成到AppCan基礎開發工程

1.1.1.1.1.        插件入口類編寫

編寫插件代碼時,應當有至少一個入口類,需要說明的是,此類須繼承基礎類EUExBase類,並實現或重寫父類的相關方法,隨后我們就可以按照自己的功能需求編寫代碼了。

例如在入口類uexDemo中,編寫了一個打開activity的方法,實現打開編寫好的HelloAppCanNative(請讀者自行完成,此處省略HelloAppCanNative編寫過程)。

1.1.1.1.1.        插件配置文件編寫

入口類編寫好后,想在網頁端調用入口類的方法,這就需要配置文件來處理。

注意到在工程的res/xml文件夾下,有一個plugin.xml文件,,此文件就是鏈接插件與網頁的橋梁。

 

在plugin.xml文件中,最外部的標簽統一寫為<uexplugins>,接下來配置<plugin>標簽,此標簽包含兩個屬性,className為入口類的包名加類名,uexName是給入口類起的別名。最后需要配置子標簽<method>,子標簽的name屬性即為入口類內已經編寫好的方法。

如有多個入口類,繼續添加<plugin>標簽即可。

1.1.1.1.1.        Html頁面調用插件配置

入口類和插件配置文件都配置完畢,現在需要在html頁面調用入口類的方法。

注意到在工程assets/widget/下,有index.html文件,此網頁即為入口類的調用入口。

在網頁內編寫代碼,實現調用入口類uexDemo內打開activity的方法:

其中onclick的屬性值為:入口類的別名.方法名()。

1.1.1.1.1.        AndroidManifest.xml配置

打開AppcanBaseProject工程,開發者不要改動AndroidManifest的application內的name屬性;

插件的入口activity也不要改動,程序打開后會默認進入此activity,彈出assets/widget/index.html頁面。

 

1.1.1.2.  測試插件

在工程上右鍵,選擇“run as”--->“Android Applicition”--->“運行程序”,即可跳轉到如下界面;

點擊按鈕,即可實現調用入口類的相應方法。

 

1.1.2.    生成插件包

插件是為了實現跨平台統一性和實現一些網頁中不能實現的功能,插件最后的展現形式是.zip壓縮包,插件又分為兩種:一種是用於AppCan SDK移動應用開發系統上,另一種是用於AppCan 3.0 IDE上。

1)如何生成用於AppCan SDK移動應用開發系統上的插件包以及所需文件,請參考下邊“如何生成AppCan SDK移動應用開發系統插件包”。

2)如何用於AppCan 3.0 IDE上的插件包以及所需文件,請參考下邊“如何生成AppCan 3.0 IDE插件包”。

 

1.2.  命名規范

插件文件的命名可任意,但在AppCan中有統一的命名規范,為了保持一致擴展插件的開發也要符合命名規范。

1.2.1.    plugin.xml中類及方法的命名

plugin.xml 文件位於res目錄下的xml目錄中,是配置自定義native Plugin調用對象的xml文件,如果需要自定義對象和開發原生插件,必須在此文件中配置自定義js對象名和java類的包名類名。下面以AppcanBaseProject插件為例:

 

 

uexName:為封裝的js對象的名稱,以uex前綴開頭,即uex+對象英文名稱;

className:與js對象映射的java對象的路徑包名及類名,建議命名為EUEx前綴+名稱;

method:插件對象中的方法名稱,依舊符合駝峰命名法,回調網頁的函數不需要寫入到此文件中,但是應寫到插件的API文檔中。

 

1.2.2.    類的命名

插件入口類的命名前綴為EUEx,即類的命名規范為EUEx+對象英文名稱,例如EUExDemo,又例如我們已經封裝的下載管理插件EUExDownloaderMgr等。當然這個命名規范不是必須的,但是必須保證插件入口類的類名和plugin.xml中的類名一致即可。

1.2.3.    方法的命名

方法名符合駝峰命名法,例如下載接插件中的創建下載對象“createDownloader”,和下載“download”。值得注意的是,這里的方法名要與plugin.xml中的相應類下的method name保持一致,否則會調用失敗。

1.2.4.    jar包的命名

擴展插件最終是以“.jar”的形式提交到服務器,也要符合我們的命名規范,即plugin_+插件名稱。其中插件名稱要和plugin.xml中的uexName一致。例如plugin_uexDemo.jar,和下載管理插件plugin_DownloaderMgr.jar等。

1.2.5.    資源文件的命名

命名規則為plugin_+plugin對象名_+其他信息,例如plugin_uexdemo_xxx.png、plugin_uexdemo_yyy.xml、<string name=" plugin_uexdemo_zzz ">等等。

1.3.  插件組成

1.3.1.    AppCan SDK移動應用開發系統插件包組成

插件是插件是以.zip文件的形式存在的,解壓之后如下:

 

AppcanBaseProject插件包含的文件有plugin.xml、info.xml(AppCan3.0新添加文件)、AndroidManifest.xml文件、jar文件、res文件夾(如果插件使用資源文件就需要有個文件夾,沒有就不需要)。

 

1.3.1.1.  Plugin.xml文件

將plugin.xml 文件添加到res目錄下的xml目錄中,按照命名規范填寫插件中用到的類、方法等。例如AppcanBaseProject工程中,用到uexDemo對象名,startActivityForResult方法等,如圖:

 

1.3.1.2.  info.xml文件

此文件是AppCan3.0新引入的文件,主要用於說明插件版本信息和更新內容等。Info.xml文件的內容如下:

 

 

         uexName:代表插件名字。

         version:代表當前插件的版本號,以后通過info.xml文件也可以知道當前插件的版本信息。

         build:代表當前插件的小版本,內部使用。

         info:代表當前插件版本修改信息,以后通過info.xml文件也可以知道當前插件此版本修改信息。

         在AppCan3.0中此文件是新添加的並且必須要有的,請開發人員注意。

1.3.1.3.  AndroidManifest.xml

配置本插件中用到的activity、service、receiver權限,以及應用的屬性,例如橫豎屏啟動等等。可參考AppcanBaseProject工程中的AndroidManifest.xml文件。

1.3.1.4.  jar文件夾

此中存放插件jar包,這是插件包上傳的必備文件。

1.3.2.    AppCan 3.0 IDE插件包組成

1.3.2.1.  plugin.xml文件

同AppCan SDK移動應用開發系統插件中的plugin.xml。

1.3.2.2.  info.xml文件

同AppCan SDK移動應用開發系統插件中的info.xml。

1.3.2.3.  AndroidManifest.xml

同AppCan SDK移動應用開發系統插件中的AndroidManifest.xml

1.3.2.4.  jar文件夾

同AppCan SDK移動應用開發系統插件中的jar文件夾。

1.3.2.5.  dex文件夾

此文件夾存放在AppCan 3.0 IDE 中可用的jar包,這是AppCan 3.0 IDE生成安裝包的必備文件(請開發人員注意)。

如何生成AppCan 3.0 IDE 可用的jar包,請參考下面“生成可用於AppCan 3.0 IDE的jar包”。

1.4.  插件代碼詳細介紹

編寫插件代碼時,應當有至少一個入口類,提供給前端使用,此類須繼承plugin的基礎類EUExBase類,然后實現或重寫相關函數,並添加自定義的接口方法與plugin.xml中的method對應。開發插件中可能遇到的常見問題,請查看下文中的插件開發中常見問題部分。

1.4.1.    編寫基礎類

代碼中繼承的接口主要包括以下3個:

EUExBase.java

封裝了JS調用native 以及native回調JS的橋接函數的父類,任何Native擴展插件的對象均需要繼承此類;

EUExUtil.java

提供動態獲取本應用資源id等功能的工具類。

注意:AppCan中的所有資源文件,包括字符串資源等,都必須使用此工具類當中的相關函數動態獲取其資源ID,而不能直接使用R文件引用!具體使用方法請參考下文中“如何調用res中的資源”。

EUExCallback.java

與plugin的callback相關的一些常量,不再一一列舉,可自行查看。

1.4.2.    定義與js對象映射的java類

新建java類UexDemo.java並繼承自EUExBase。如圖:

 

工程中其余部分按照插件的開發需求編寫,但要注意命名規范。

其中:所有接口函數的參數均為1個string數組。此數組的長度即為js傳過來的參數個數,此數組的index與js中參數的index相對應。

例如,在js中有類似調用:

uexDemo.showInputDialog (p1,p2,p3,p4)

那么,當它映射到UexDemo.java的:

public void showInputDialog(String[] parm)

函數中時,parm的長度將為4,可通過parm[0]取得p1,parm[1]取得p2,parm[2]取得p3,parm[3]取得p4,以此類推。

如圖所示:

 

繼承EUExBase類必須實現clean方法, 是平台封裝的調用方法,把一些與當前網頁有關的內存等等在切換網頁的時候釋放掉(請參考AppcanBaseProject工程)。

注意,clean(String[] params) 方法當切換窗口時會自動調用,因此如果想保持某些資源在不同窗口中使用,則不應當再此方法中回收資源。

1.4.3.    向網頁回調數據

方法主要分為兩種:

標准回調方式:

AppCan平台的Native擴展插件中,推薦使用的回調規則是uexDemo.cbMethodName(opId,dataType,data),其中opId代表操作碼區分操作,dataType用來表示data的類型,data是回調數據。這種回調方式可以使用平台提供的封裝方法jsCallback來實現。

下面是一個返回json數據的例子:

 

自定義回調方式:

除了使用標准回調方式,還可以使用自定義的回調方式,返回js的參數個數和類型可以根據需要自定義。這種回調方式應使用平台提供的封裝方法onCallback來實現。

下面是一個自定義回調的例子:

 

其中SCRIPT_HEADER是EUExBase中的常量,繼承后可以直接使用,方便拼接js字符串,也可以自己寫上javascript:代替。后面的ON_FUNCTION_MAP_DRAG為預先自定義好的回調方法名,形式與上面的標准回調方式中相同,具體參照命名規范說明。

 

1.5.  如何生成AppCan SDK移動應用開發系統插件包

AppCan SDK移動應用開發系統插件包主要組成部分:

JAR文件夾:

工程src下所有的類打出來的包文件存放在此目錄下;

res文件夾:

將插件工程res文件夾下自己使用到的圖片,xml文件等(AppcanBaseProject工程自帶的資源文件除外)復制出來,放在res文件夾下;

AndroidManifest.xml文件:

將插件工程的AndroidManifest.xml文件復制出來即可,具體見下文“AndroidManifest.xml文件配置”;

Plugin.xml文件:

將插件工程res/xml下的plugin.xm復制出來即可,具體修改見上文“plugin.xml中類及方法的命名”的介紹;

info.xml文件:

此文件是AppCan3.0新引入的文件,主要用於說明插件版本信息和更新內容等。

 

一個帶有資源文件的原生插件包目錄結構一般類似於下圖:

 

其中,jar目錄為存放你的jar文件的目錄,jar文件、info.xml文件和 plugin.xml文件為必須的(如果jar包對應有jni接口,則含有so文件),其他不帶資源文件的插件可能沒有res目錄或者沒有AndroidManifest.xml文件。

 

以下為插件包中相應目錄及文件的詳細解釋:

1.5.1.       jar文件夾

 

此中存放插件jar包,這是插件包上傳的必備文件。命名必須符合命名規則,plugin_+擴展對象名+具體的后綴,如:plugin_uexDemo.jar。

制作jar包方法:選中插件工程src下所有包和類文件,右鍵選擇Excport--Java--JAR file,選擇輸出路徑按照提示打包即可。

1.5.2.      plugin.xml文件配置

plugin.xml是上傳的必備文件,內容見上文中命名規范說明。

1.5.3.    info.xml文件配置

info.xml是上傳的必備文件。此文件是AppCan3.0新引入的文件,主要用於說明插件版本信息和更新內容等。Info.xml文件的內容如下:

 

 

         uexName:代表插件名字。

         version:代表當前插件的版本號,以后通過info.xml文件也可以知道當前插件的版本信息。

         build:代表當前插件的小版本,內部使用。

         info:代表當前插件版本修改信息,以后通過info.xml文件也可以知道當前插件此版本修改信息。

         在AppCan3.0中此文件是新添加的並且必須要有的,請開發人員注意。

1.5.4.      AndroidManifest.xml配置

AndroidManifest.xml是非必須的,用於配置本原生插件中用到的activity,service,receiver,權限等的主配置文件。只配置此plugin用到的。其結構類似於下圖:

 

1.5.5.      res文件夾

res文件夾是非必須的,用於存放擴展插件特有的資源。此目錄中的所有目錄同AppcanBaseProject工程的res目錄相對應。因此提交時要將資源放到相應的文件夾下,命名應當符合上文中提到的命名規則。目錄結構及命名規則示例如圖:



1.6.  如何生成AppCan 3.0 IDE插件包

AppCan SDK移動應用開發系統插件包主要組成部分:

首先解壓縮已有的標准插件,可以看到插件的目錄結構如下圖所示:

 

其中 so 文件夾和res文件夾為可選項,如果插件里引用的有自己開發的ndk生成的so文件或者是第三方的so文件,就在插件目錄結構里新建so文件夾,將so文件放到so文件夾下,如果插件里沒有引用so文件,則無需建立此文件夾。jar 文件夾用來放置自己導出的jar文件和第三方的jar文件,res文件夾用來放置布局和資源文件,內部目錄結構和Android原生開發里面的res目錄結構相同,AndroidManifest文件里面只需要寫入自己插件里面用到代碼即可,plugin里面用來注冊插件接口。

在該目錄結構下新建dex文件夾,里面用來放置生成的AppCan 3.0 IDE可用的jar文件:

 

首先打開命令提示符,轉到Android SDK路徑下的sdk\build-tools\android-4.3這個路徑,如圖所示:

 

將插件用到的所有jar文件(包括自己本地實現導出的jar文件)拷貝到該路徑下,如圖所示:以uexFlowDetection插件為例:

 

該插件總共有4個jar文件,包括三個第三方的jar文件和一個本地自己導出的jar文件,編輯命令,如圖所示:

 

命令解釋:

dx –dex –output= 為命令頭,是固定的,命令行中 plugin_uexFlowDetection_dex.jar 為要生成的字節碼文件,命名格式為 plugin_uexXXX_dex.jar。后面四個參數為該插件所要用到的4個jar文件,插件用到多少個jar文件,后面跟多少個jar文件的名字。

點擊回車,即可生成字節碼文件,生成后如圖所示:

 

上圖中紅框內的即為生成后的字節碼文件。

將該字節碼文件拷貝到第2步創建的dex文件夾內,打包插件即可,到此一個AppCan SDK移動應用開發系統插件包,已經成功生成為一個可以AppCan 3.0 IDE中使用的插件包。

 

2.   插件開發中常見問題

2.1.  如何添加一個窗口

在AppCan平台中,為了便於管理窗口和與前端js交互,開啟新的Activity時應當用主Activity轉換為ActivityGroup來管理由插件開啟的新Activity。示例代碼如下:

 

2.2.  如何調用res中的資源

在AppCan的插件開發中,不應使用應用中的R文件引用資源id,會產生問題,應當使用平台提供的EUExUtil類中的方法來通過資源名稱獲取對應的id。示例如下:

 

上面是引用控件id。

相應的,還有getResDrawableID,getResLayoutID等方法,它們與Android資源id類R的常用內部類一一對應,只要傳入相應的資源的文件名作為參數即可(跟原生開發一樣,不填寫.xml .png等這種擴展名)。

2.3.  插件在測試中未正確運行

表現:

在eclipse中提示引擎錯誤,或者無法接收到原生插件傳到前端的回調信息。

可能原因:

1、plugin.xml文件配置錯誤(檢查className與前端調用時使用的插件名是否一致);

2、info.xml文件配置錯誤(此文件為AppCan3.0引擎新增加的機制,必須正確配置到插件包中並填寫插件相應信息,詳細做法參照上文中的info.xml文件的介紹);

3、傳遞json字符串參數時應當注意,表示js字符串的引號最好用單引號,防止與json數據中的雙引號產生歧義;或者最外層可以用雙引號,但是內部的雙引號要用 “\” 轉義;

4、clean()方法為引擎再切換頁面時自動調用,在其中不應處理一些頁面間共享的數據的回收;

5、若要在其他activity或者對象中向網頁端回調信息,不應傳遞插件對象,應當定義一個回調接口並生成對象完成回調工作。

2.4.  插件上傳后打包應用失敗

表現:

在AppCan SDK移動應用開發系統中提示打包失敗。

可能原因:

1、插件包中的資源文件缺少;

2、插件包結構錯誤(必須包含必備的目錄結構,jar文件夾中要有引用的jar包和so文件,還應包含info.xml 、 plugin.xml);

3、資源文件存在問題(如xml格式錯誤、9patch圖片制作出錯等)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM