Android 應(yīng)用采用 Java 編程語言編寫冲甘。Android SDK 工具將您的代碼油宜,連同任何數(shù)據(jù)和資源文件編譯到一個(gè) APK: Android 軟件包,即帶有 .apk
后綴的存檔文件中。一個(gè) APK 文件包含 Android 應(yīng)用的所有內(nèi)容悼瓮,它是基于 Android 系統(tǒng)的設(shè)備用來安裝應(yīng)用的文件。
那么Android程序是怎么從源碼變成可以安裝使用的apk的呢
? 簡易版
? 官方版
? 詳細(xì)版
APK的打包與安裝比較復(fù)雜艰猬,這里暫時(shí)不展開討論横堡,留待以后單獨(dú)成文說明,在此簡單總結(jié)一下基本的流程:
- 利用aapt打包資源文件冠桃,生成R.java和編譯后的資源
- 處理aidl文件命贴,生成相應(yīng)java 文件
- 編譯工程源代碼,生成相應(yīng)class 文件
- 通過dex工具把class文件轉(zhuǎn)換成dex文件
- 生成apk文件
- 對apk簽名
- 對簽名后的apk文件進(jìn)行對齊處理食听,使apk中所有資源文件距離文件起始偏移為4字節(jié)的整數(shù)倍胸蛛,從而在通過內(nèi)存映射訪問apk文件時(shí)會(huì)更快
安裝到設(shè)備后,每個(gè) Android 應(yīng)用都運(yùn)行在自己的安全沙箱(SandBox)內(nèi):
Android擴(kuò)展了Linux內(nèi)核安全模型的用戶與權(quán)限機(jī)制樱报,將多用戶操作系統(tǒng)的用戶隔離機(jī)制巧妙地移植為應(yīng)用程序隔離葬项。在linux中,一個(gè)用戶標(biāo)識(shí)(UID)識(shí)別一個(gè)給定用戶迹蛤;在Android上民珍,一個(gè)UID則識(shí)別一個(gè)應(yīng)用程序。在安裝應(yīng)用程序時(shí)向其分配UID(該 ID 僅由系統(tǒng)使用盗飒,應(yīng)用并不知曉)嚷量。應(yīng)用程序在設(shè)備上存續(xù)期間內(nèi),其UID保持不變逆趣。僅限用于允許或限制應(yīng)用程序(而非用戶)對設(shè)備資源的訪問蝶溶。如此,Android的安全機(jī)制與Linux內(nèi)核的安全模型完美銜接宣渗!不同的應(yīng)用程序分別屬于不同的用戶抖所,因此梨州,應(yīng)用程序運(yùn)行于自己獨(dú)立的進(jìn)程空間,每個(gè)進(jìn)程都具有自己的虛擬機(jī) (VM),與UID不同的應(yīng)用程序自然形成資源隔離田轧,如此便形成了一個(gè)操作系統(tǒng)級別的應(yīng)用程序“沙箱”
Android 系統(tǒng)可以通過沙箱模型實(shí)現(xiàn)最小權(quán)限原則摊唇。也就是說,默認(rèn)情況下涯鲁,每個(gè)應(yīng)用都只能訪問執(zhí)行其工作所需的組件巷查,而不能訪問其他組件。 這樣便營造出一個(gè)非常安全的環(huán)境抹腿,在這個(gè)環(huán)境中岛请,應(yīng)用無法訪問系統(tǒng)中其未獲得權(quán)限的部分。
不過警绩,應(yīng)用仍然可以通過一些途徑與其他應(yīng)用共享數(shù)據(jù)以及訪問系統(tǒng)服務(wù):
- 可以安排兩個(gè)應(yīng)用共享同一 Linux 用戶 ID崇败,在這種情況下,它們能夠相互訪問彼此的文件肩祥。為了節(jié)省系統(tǒng)資源后室,可以安排具有相同用戶 ID 的應(yīng)用在同一 Linux 進(jìn)程中運(yùn)行,并共享同一 VM(應(yīng)用還必須使用相同的證書簽署)混狠;
- 應(yīng)用可以請求訪問設(shè)備數(shù)據(jù)(如用戶的聯(lián)系人岸霹、短信、可裝入存儲(chǔ)裝置 [SD 卡]将饺、相機(jī)贡避、藍(lán)牙等)的權(quán)限。所有應(yīng)用權(quán)限都必須由用戶在安裝時(shí)授予予弧。
應(yīng)用組件
應(yīng)用組件是 Android 應(yīng)用的基本構(gòu)建基塊.共有四種不同的應(yīng)用組件類型刮吧。每種類型都服務(wù)于不同的目的,其各自都有不同的生命周期掖蛤。
-
Activity
Activity表示具有用戶界面的單一屏幕杀捻。譬如一個(gè)顯示用戶信息的Activity。Activity是四大組件中唯一具有界面的組件蚓庭。
-
Service
Service是一種在后臺(tái)運(yùn)行的組件致讥,用戶可以執(zhí)行長時(shí)間運(yùn)行的操作,但是這個(gè)長時(shí)間也是相對來說的彪置,如果在Service中執(zhí)行時(shí)間過長拄踪,也會(huì)引起ANR蝇恶。
-
ContentProvier
ContentProvier 管理一組共享的應(yīng)用數(shù)據(jù)拳魁。您可以將數(shù)據(jù)存儲(chǔ)在文件系統(tǒng)、SQLite 數(shù)據(jù)庫撮弧、Web 上或您的應(yīng)用可以訪問的任何其他永久性存儲(chǔ)位置潘懊。其他應(yīng)用可以通過內(nèi)容提供程序查詢數(shù)據(jù)姚糊,甚至修改數(shù)據(jù)(如果內(nèi)容提供程序允許)
-
BroadcastReceiver
BroadcastReceiver 是一種用于響應(yīng)系統(tǒng)范圍廣播通知的組件。許多廣播都是由系統(tǒng)發(fā)起的授舟,例如救恨,通知屏幕已關(guān)閉、電池電量不足或已拍攝照片的廣播释树。
啟動(dòng)組件
四種組件類型中的三種—Activity肠槽、服務(wù)和廣播接收器,通過名為 Intent的異步消息進(jìn)行啟動(dòng)奢啥。 Intent 會(huì)在運(yùn)行時(shí)將各個(gè)組件相互綁定(您可以將 Intent 視為從其他組件請求操作的信使)秸仙,無論組件屬于您的應(yīng)用還是其他應(yīng)用。
每種類型的組件有不同的啟動(dòng)方法:
- 您可以通過將
Intent
傳遞到startActivity()
或startActivityForResult()
(當(dāng)您想讓 Activity 返回結(jié)果時(shí))來啟動(dòng) Activity(或?yàn)槠浒才判氯蝿?wù))桩盲; - 您可以通過將
Intent
傳遞到startService()
來啟動(dòng)服務(wù)(或?qū)?zhí)行中的服務(wù)下達(dá)新指令)寂纪。或者赌结,您也可以通過將Intent
傳遞到bindService()
來綁定到該服務(wù)捞蛋; - 您可以通過將
Intent
傳遞到sendBroadcast()
、sendOrderedBroadcast()
或sendStickyBroadcast()
等方法來發(fā)起廣播柬姚; - 您可以通過在
ContentResolver
上調(diào)用query()
來對內(nèi)容提供程序執(zhí)行查詢拟杉。
清單文件
在 Android 系統(tǒng)啟動(dòng)應(yīng)用組件之前,系統(tǒng)必須通過讀取應(yīng)用的 AndroidManifest.xml
文件(“清單”文件)確認(rèn)組件存在量承。您的應(yīng)用必須在此文件中聲明其所有組件捣域,該文件必須位于應(yīng)用項(xiàng)目目錄的根目錄中。
除了聲明應(yīng)用的組件外宴合,清單文件還有許多其他作用焕梅,如:
- 確定應(yīng)用需要的任何用戶權(quán)限,如互聯(lián)網(wǎng)訪問權(quán)限或?qū)τ脩袈?lián)系人的讀取權(quán)限
- 根據(jù)應(yīng)用使用的 API卦洽,聲明應(yīng)用所需的最低API 級別
- 聲明應(yīng)用使用或需要的硬件和軟件功能贞言,如相機(jī)、藍(lán)牙服務(wù)或多點(diǎn)觸摸屏幕
- 應(yīng)用需要鏈接的 API 庫(Android 框架 API 除外)阀蒂,如 Google Maps API 庫
- 其他功能
應(yīng)用資源
Android 應(yīng)用并非只包含代碼—它還需要與源代碼分離的資源该窗,如圖像、音頻文件以及任何與應(yīng)用的視覺呈現(xiàn)有關(guān)的內(nèi)容蚤霞。Android一般使用XML定義界面布局酗失,對應(yīng)的資源(如圖片)放到對應(yīng)的資源目錄。提供與源代碼分離的資源的其中一個(gè)最重要優(yōu)點(diǎn)在于昧绣,您可以提供針對不同設(shè)備配置的備用資源规肴。