Android應用及應用管理簡介
一、概述
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平臺的檔案管理器中找到對應安裝包,點選即可啟動安裝步驟。這裡給出了相應的程式碼,有興趣的開發者可以嘗試使用。
使用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平臺提供的標識有:
標識本應用屬於受限應用,應用將會被安裝到保護目錄,只有該應用可以訪問程式碼段和不屬於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系統同樣支援多種解除安裝方式。
使用預置解除安裝工具
系統內建了解除安裝工具。這裡給出了啟動程式碼,執行後即可看到解除安裝步驟:
使用API解除安裝
Android提供了解除安裝應用的標準API:PackageManager().deletePackage(String packageName, IPackageDeleteObserver observer, int flags);
- observer實現了回撥函式packageDeleted(boolean succeeded)以檢查解除安裝是否成功
- 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Lucene介紹及簡單應用
- WebSocket 簡介及應用例項Web
- 01 . ELK Stack簡介原理及部署應用
- Android中mmap原理及應用簡析Android
- Android 極簡反射教程及應用示例Android反射
- Sqlite 介紹及應用SQLite
- ProxySQL簡介原理及讀寫分離應用SQL
- Hive簡介、應用場景及架構原理Hive架構
- LAMP平臺服務簡介、部署及應用LAMP
- 模切廠ERP應用及方案簡介
- 讓 Android 應用提交更簡單——用Worktile管理Android ReleaseAndroid
- 7.3 應用場景簡介
- XML SOAP應用簡介 (轉)XML
- Android Protobuf應用及原理Android
- Android 應用程式元件介紹Android元件
- 01 . Shell詳細入門介紹及簡單應用
- Rsync原理介紹及配置應用
- Android ExpandableListView的簡單應用AndroidView
- 深入學習ProGuard之:ProGuard簡介與android的應用Android
- 2、安裝及管理應用程式
- 移動應用隱私合規檢測簡介及目標檢測技術的應用
- Redis HyperLogLog介紹及應用Redis
- 正交多項式介紹及應用
- Zookeeper 介紹及典型應用場景
- Disruptor的簡單介紹與應用
- scrapy框架簡介和基礎應用框架
- Web 應用安全性: HTTP簡介WebHTTP
- Json-schema簡介和應用JSON
- gRPC應用實戰:(一)簡介RPC
- 移動應用程式開發簡介!
- LUKS加密卷應用技術簡介加密
- arguments的應用示例簡單介紹
- SAP作業型別應用簡介型別
- kylix 資料庫應用簡介 (轉)資料庫
- android 管理應用的記憶體Android記憶體
- 01 . SaltStack部署配置及簡單應用
- 加推時序系統RTS實現原理及應用簡介
- 網管知多少:交換機技術簡介及應用分析(轉)