Android應用及應用管理簡介

Nikey001發表於2009-06-09

一、概述

07年,Google公司推出了基於Java語言的Android平臺,引起了IT業界的一致關注,同年,播思通訊公司開始研發基於其的OPhone平臺。

08年,第一款Android手機G1面世,這款Google為HTC量身打造的滑蓋手機由T Mobile發行,獲得了使用者的極大好評,也為整個Android平臺的正式商用作出了榜樣。

09年,將是OPhone/Android手機的第一個井噴年,播思通訊聯合中國移動和各個手機廠商即將推出多款觸屏手機。同時,Android社群也日趨壯大,已擁有各種應用五百多個,並在快速增長之中。

本文將對Android應用結構及Android系統的應用管理加以介紹。

本文面對的讀者是對Android應用的研發人員、或有過Android開發經驗的入門者。p

二、Android應用結構

 

 

什麼是Android應用?

理解什麼是Android應用是Android入門所必須的,也是瞭解應用管理的前提。

那什麼是Android應用呢?即指基於Android開發,編譯,執行在Android平臺的應用。這種應用在編譯階段被打成一個jar包, 以.apk結尾,包內包含了所有執行階段需要的程式碼與資源,其中主要分為三塊:描述檔案AndroidManifest.xml、程式碼段和執行時資源。

AndroidManifest.xml

AndroidManifest.xml是Android應用的描述檔案,它描述了該應用的相關資訊,主要包括以下各個元素。

包名(package)

指定本應用內java主程式包的包名。當沒有指定apk的檔名時,編譯後產生程式包將以此命名。本包名應當在Android系統執行時唯一。

認證(certificate)

指定本應用程式所授予的信任級別,目前有的認證級別有platform(system)、shared、media以及應用自定義的認證。不同的認證可以享受不同的許可權。

許可權組(permission-group)

許可權組的定義是為了描述一組具有共同特性的許可權。Android系統中預訂了一些組,它們是:

  • android.permission-group.COST_MONEY
  • android.permission-group.MESSAGES
  • android.permission-group.MESSAGES
  • android.permission-group.PERSONAL_INFO
  • android.permission-group.LOCATION
  • android.permission-group.NETWORK
  • android.permission-group.ACCOUNTS
  • android.permission-group.HARDWARE_CONTROLS
  • android.permission-group.PHONE_CALLS
  • android.permission-group.SYSTEM_TOOLS
  • android.permission-group.DEVELOPMENT_TOOLS

從字面意思我們就可以理解每個組的特性。具體含義可以參考SDK文件。

許可權(permission)

許可權用來描述是否擁有做某件事的權力。Android系統中許可權是分級的,前分為普通級別(Normal),危險級別(dangerous),簽名級別(signature)和系統/簽名級別(signature or system)。

系統中所有預定義的許可權根據作用的不同,分別屬於不同的級別。

對於普通和危險級別的許可權,我們稱之為低階許可權,應用申請即授予。其他兩級許可權,我們稱之為高階許可權或系統許可權,應用擁有platform級別的認證才能申請。

當應用試圖在沒有許可權的情況下做受限操作,應用將被系統殺掉以警示。

系統應用可以使用任何許可權。許可權的宣告者可無條件使用該許可權。

目前Android系統定義了許多許可權,通過SDK文件使用者可以查詢到哪些操作需要哪些許可權,然後按需申請。

許可權樹(permission-tree)

許可權樹的設定是為了統一管理一組許可權,宣告於該樹下的許可權所有者歸屬該應用。系統提供了API,應用可以在執行時動態新增。
 PackageManager.addPermission()
 

使用許可權(uses-permission)

應用需要的許可權應當在此處申請,所申請的許可權應當被系統或某個應用所定義,否則視為無效申請。
同時,使用許可權的申請需要遵循許可權授予條件,非platform認證的應用無法申請高階許可權。
 

SDK(uses-sdk)

標識本應用執行的SDK版本。高相容性的應用可以忽略此項。

application

application是Android應用內最高階別(top level)的模組,每個應用內最多隻能有一個application,如果應用沒有指定該模組,一個預設的application將被啟用。

application將在應用啟動時最先被載入,並存活在應用的整個執行時生命週期。因此一些初始化的工作適合在本模組完成。

Application元素有許多屬性,其中:“persistent”表示本應用是否為常駐記憶體,“enable”表示本應用當前是否應當被載入。

其它相關屬性請參考SDK文件,開發者可以根據需要新增。

在AndroidManifest.xml檔案中,執行時模組的定義都作為本模組的子元素。

當執行時模組被排程時,如果應用沒有啟動,將首先啟動應用進行初始化,然後排程對應模組。

activity

activity是application模組的執行時子元素,標識了一個UI。除了application,一個應用可以宣告並實現零至多個其它執行時模組,activity也同樣。

activity也包含了許多定義它工作狀態的屬性,其中:“name”是必須的,它指定了該activity所在的檔名,如果該檔案所屬包不同於該應用的包名(即本描述檔案的最開始處),那麼名字前面需要加入所在包名。

activity通過增加intent-fliter來標識哪些intent可以被處理,同時intent也是排程activity的主要引數。

作為一個執行時的物件,activity的排程方式大致分為兩種:一種是指定activit所在類名直接排程,另一種是利用activity可以處理的intent進行排程。

同一種intent可以被不同應用的不同activity處理。當出現此種情況時,使用者需要選擇具體的activity。

receiver

receiver也是application的執行時子元素。

receiver通過增加intent-fliter來標識它需要接受哪些intent。當收到intent後,receiver將根據不同的intent進行不同的處理。

當一個Intent發出後,所有註冊了該intent的receiver都將會收到,系統會根據receiver在系統中的註冊次序順序傳送。當一個receiver處理完該Intent後,系統才會向下一個receiver傳送。

當一個receiver有多個未接收的intent時,將按照intent傳送的次序順序接收。

service

service也是application的執行時子元素。Service屬於後臺模組,啟動後將長時間執行,除非停止該service或所在應用程式被殺死。

service從功能上分為兩種,一種是服務於本應用,此時的service是一個普通的執行時模組,另一種是服務於所有應用或對應應用,此時需要定義API並將之公佈來與其它應用進行互動。

service需要通過API:startService()新增到service管理器中,新增後即在後臺執行。它接受外界資訊的方式分兩種:一種是增加IntentFilter來接收intent,一種是外界應用呼叫該service所定義的API。

provider

provider也是application的執行時子元素。它繼承於ContentProvider,是對該應用管理的使用者資料的結構化接入,是基於資料庫操作方式的封裝。

如果應用允許外部應用訪問/管理它的使用者資料,provider是Android平臺提供的最佳方式。

activity-alias

顧名思義,是已有activity的別名。

uses-library

標識應用啟動所必須的共享庫。

程式碼段

應用所有的java檔案被放入一個包結構,該包命名為classes.dex。

執行時資源

Android應用執行時所需的各種資源有layout,drawable,string,style等型別。編譯後所有資源統一存放在專案路徑/res裡,按照用途的不同存放在各個子資料夾中。

編譯階段,所有resource將被排序,每個resource在程式包中都擁有唯一的標識,同時一個名為resources.arsc的檔案生成並被置入安裝包中,該檔案包含了所有索引以供執行時快速查詢。而resource以同樣目錄結構組織放入安裝包中。

應用管理

應用管理是對系統中所有應用整個生命週期的管理。Android系統中,應用都是以.apk檔案的形式存在,因此應用管理也可以簡單理解為對.apk檔案的管理。

從一個應用在系統中的生命週期來看,應用管理可以分為安裝,解除安裝和使用等部分。

應用安裝

Android系統中,安裝應用時不能指定安裝目錄,所有的應用都只能裝在預置資料夾下。

Android系統支援數種安裝方式,而播思通訊的Ophone平臺在此基礎上支援更多方式。

Android系統中,應用安裝包.apk檔案屬於預設支援的檔案型別,它的的mime type被定義為"application/vnd.android.package-archive"。

系統內建了安裝工具來解析並安裝.apk檔案。你可以從OPhone平臺的檔案管理器中找到對應安裝包,點選即可啟動安裝步驟。這裡給出了相應的程式碼,有興趣的開發者可以嘗試使用。

  1. Intent apkintent = new Intent(Intent.ACTION_VIEW);                
  2. final Uri puri = Uri.fromFile(new File(path));    //path is the path of source apk  
  3. apkintent.setDataAndType(puri, "application/vnd.android.package-archive");  
  4. startActivity(apkintent); 
 

使用API安裝

Android系統提供了安裝應用的API:PackageManager.installPackage(final Uri packageURI,
final IPackageInstallObserver observer, final int flags);

 
  • uri給出了原檔案的地址
  • observer實現了回撥函式packageInstalled(final String packageArchiveName, final int returnCode) 以檢查安裝是否成功
  • flags提供安裝標識。Android平臺提供的標識有: 
1.PackageManager.FORWARD_LOCK_PACKAGE = 0x00000001
標識本應用屬於受限應用,應用將會被安裝到保護目錄,只有該應用可以訪問程式碼段和不屬於resource的asset資源。
2.PackageManager.REPLACE_EXISTING_PACKAGE = 0x00000002;
應用如已存在,則先刪除再安裝。
3.PackageManager.SDCARD_PACKAGE = 0x00000004;
 

由OPhone平臺擴充套件,標識該應用安裝目錄為儲存卡,預設為data分割槽。

因為手機中data分割槽大小有限,因此OPhone平臺預設將應用裝到儲存卡上。

本API需要"android.permission.INSTALL_PACKAGES"許可權,該許可權屬於簽名級別,因此只有系統級別的應用程式才能使用。

拷貝即安裝

Android支援拷貝即安裝的方式,即將安裝包拷貝到預置安裝目錄即可自動安裝,但所有的預置目錄對於使用者不可見。

OPhone平臺擴充套件後,使用者可將安裝包拷入儲存卡的app目錄下,系統將監控該資料夾,檢測到新的安裝檔案後自動安裝。

這種方式適合一次安裝大量應用,但是也有壞處。一是無法知道哪些應用安裝成功,哪些安裝失敗, 二是安裝失敗的應用將會作為垃圾存放在預置目錄中,在系統啟動時延長啟動時間,三是過多的應用可能將data分割槽的空間佔用過多,影響系統的正常使用。

安裝步驟

  • 解析安裝包是否合法,如果合法即載入應用,如果非法即放棄安裝
  • 取出程式碼段,放入/data/dalvik-cache目錄
  • 建立/data/data/包名的資料夾,以存放使用者資料
  • 將安裝包攜帶的lib放入/data/data/包名/lib中
  • 以上步驟完成後將安裝包拷到安裝目錄
  • 載入該應用資訊 

應用解除安裝

Android系統同樣支援多種解除安裝方式。

使用預置解除安裝工具

系統內建了解除安裝工具。這裡給出了啟動程式碼,執行後即可看到解除安裝步驟:

  1. Uri packageURI = Uri.parse("package:"+packageName);  
  2. Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);  
  3. startActivity(uninstallIntent); 

使用API解除安裝

Android提供了解除安裝應用的標準API:PackageManager().deletePackage(String packageName, IPackageDeleteObserver observer, int flags);

  1. observer實現了回撥函式packageDeleted(boolean succeeded)以檢查解除安裝是否成功
  2. flags提供解除安裝標識。Android平臺提供的標識有

PackageManager.DONT_DELETE_DATA = 0x00000001;
標識解除安裝時是否同時刪除使用者資料。 

本API需要"android.permission.DELETE_PACKAGES"許可權,該許可權屬於簽名級別,因此只有系統級別的應用程式才能使用。

刪除即解除安裝

對應於拷貝即安裝,系統同樣支援刪除即解除安裝功能。當使用者刪除/sdcard/app目錄下安裝包時,系統將自動檢測到刪除事件並解除安裝對應應用。
本方法適合一次刪除大量應用。

解除安裝步驟

  • 刪除程式碼段
  • 如果需要刪除使用者資料,則刪除
  • 建立/data/data/包名的資料夾,以存放使用者資料
  • 刪除應用資訊
  • 刪除安裝包

 

應用使用

應用安裝後即處於可用狀態。對於系統中所有應用,從管理層面分為資訊管理和應用排程兩部分;從應用自身角度分為去啟用與啟用兩種狀態。

資訊管理

Android應用的相關資訊在AndroidManifest.xml檔案中定義,前面已經介紹,資訊管理的第一步就是載入資訊。

系統啟動時,將根據安裝目錄的不同,先後對已安裝應用進行資訊載入;系統啟動後,執行時安裝的應用,在安裝成功後進行資訊載入。

系統中所有資訊載入後,在system service程式(Android應用的核心程式,存放了幾乎所有的系統service和核心資料結構)中形成了對應資料結構:

  • permission資料:應用申請的使用許可權在此存放,標識了哪些應用有哪些許可權。
  • application資料:每一個應用生成一個application資料,標識了application模組的各種屬性和原始檔/使用者資料的路徑。
  • providers資料:存放了所有的provider及其屬性
  • receiver資料:存放所有receiver及其屬性
  • service資料:存放所有service及其屬性
  • activity資料:存放所有的activity及其屬性。

 

應用排程

應用排程既所有應用的執行時管理,是建立在資訊管理之上的。根據執行時模組的靜態資訊,系統可以進行模組載入和管理。

  • 根據application資訊,可以得知哪些應用是常駐記憶體應用,哪些應用是動態載入的應用
  • 根據provider資訊,可以得知哪些provider是系統級的,哪些是應用級別的,哪些是公開的,哪些是內不得
  • 根據activity資訊,可以獲得目標UI來處理使用者請求
  • 根據receiver資訊,可以得知哪些訊息可以被處理 

 

去啟用與啟用狀態

系統啟動時,應用資訊會被載入,而應用未被啟動,此時所有應用處於去啟用狀態。系統啟動完成時,常駐記憶體應用將被啟動,這些應用在系統執行中始終處 於啟用狀態。對於其他應用,當執行時模組(activity,service,receiver,provider等)被排程時,應用將會啟用。

對於所有已啟用的應用,系統將之納入程式管理和記憶體管理。程式管理將快取應用執行時資料和狀態,當應用因非正常原因被殺掉後,將有機會在重啟後恢復 原來狀態。系統記憶體不足時,加通過殺掉非常駐記憶體應用來釋放記憶體,其優先順序為空閒應用>後臺應用(即有後臺UI)>前臺應用(即有UI在前 臺)。

當應用所在程式被殺掉後,應用重新回到去啟用狀態。

應用使用的API

Android系統為應用管理功能提供了大量的API。根據功能的不同,這些API分為兩大類:PackageManager相關和ActivitManager相關。

PackageManager相關

本類API是對所有基於載入資訊的資料結構的封裝,包括以下功能:

  • 安裝,解除安裝應用
  • 查詢permission相關資訊
  • 查詢Application相關資訊(application,activity,receiver,service,provider及相應屬性等)
  • 查詢已安裝應用
  • 增加,刪除permission
  • 清除使用者資料、快取,程式碼段等

非查詢相關的API需要特定的許可權,具體的API請參考SDK文件。

ActivityManager相關

本類API是對執行時管理功能和執行時資料結構的封裝,包括以下功能

  • 啟用/去啟用activity
  • 註冊/取消註冊動態接受intent
  • 傳送/取消傳送intent
  • activity生命週期管理(暫停,恢復,停止,銷燬等)
  • activity task管理(前臺->後臺,後臺->前臺,最近task查詢,執行時task查詢)
  • 啟用/去啟用service
  • 啟用/去啟用provider等

task管理相關API需要特定的許可權,具體API可參考SDK文件。
 

三、總結

本文實質上是對Android相關API的理論總結與串聯,從總體上介紹應用管理的相關知識,並不是一份開發文件或教材,讀者仍然需要參考SDK文件中。

如果讀者看完本文後,對於應用管理有了一定理論基礎,對開發有一定的幫助。本文的目的也就達到了。 (作者:鄒偉

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21255398/viewspace-605619/,如需轉載,請註明出處,否則將追究法律責任。

相關文章