從頭開始學(xué)Android—應(yīng)用基礎(chǔ)知識(shí)

官方說明

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的呢

? 簡易版

apk_easy.png

? 官方版

apk_m.png

? 詳細(xì)版

apk_h.png

APK的打包與安裝比較復(fù)雜艰猬,這里暫時(shí)不展開討論横堡,留待以后單獨(dú)成文說明,在此簡單總結(jié)一下基本的流程:

  1. 利用aapt打包資源文件冠桃,生成R.java和編譯后的資源
  2. 處理aidl文件命贴,生成相應(yīng)java 文件
  3. 編譯工程源代碼,生成相應(yīng)class 文件
  4. 通過dex工具把class文件轉(zhuǎn)換成dex文件
  5. 生成apk文件
  6. 對apk簽名
  7. 對簽名后的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è)備配置的備用資源规肴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拖刃,更是在濱河造成了極大的恐慌删壮,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兑牡,死亡現(xiàn)場離奇詭異央碟,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)均函,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門亿虽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人苞也,你說我怎么就攤上這事经柴。” “怎么了墩朦?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵坯认,是天一觀的道長。 經(jīng)常有香客問我氓涣,道長牛哺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任劳吠,我火速辦了婚禮引润,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘痒玩。我一直安慰自己淳附,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布蠢古。 她就那樣靜靜地躺著奴曙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪草讶。 梳的紋絲不亂的頭發(fā)上洽糟,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機(jī)與錄音堕战,去河邊找鬼坤溃。 笑死,一個(gè)胖子當(dāng)著我的面吹牛嘱丢,可吹牛的內(nèi)容都是我干的薪介。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼越驻,長吁一口氣:“原來是場噩夢啊……” “哼汁政!你這毒婦竟也來了道偷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤烂完,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后诵棵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抠蚣,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年履澳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嘶窄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡距贷,死狀恐怖柄冲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情忠蝗,我是刑警寧澤现横,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站阁最,受9級特大地震影響戒祠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜速种,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一姜盈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧配阵,春花似錦馏颂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瘫拣,卻和暖如春近上,著一層夾襖步出監(jiān)牢的瞬間拂铡,已是汗流浹背壹无。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留感帅,地道東北人斗锭。 一個(gè)月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像失球,于是被迫代替她去往敵國和親岖是。 傳聞我的和親對象是個(gè)殘疾皇子帮毁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,517評論 25 707
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 6,358評論 0 17
  • 幾個(gè)中年老婆子湊在一塊兒豺撑,含嬌帶嗔地臭白男人:男人沒良心烈疚,男人花心,男人見一個(gè)愛一個(gè)聪轿,沒有男人能坐懷不亂爷肝,沒有男...
    雙槍老太閱讀 408評論 0 0
  • 朱夏冰閱讀 429評論 0 2
  • 【回答】 卑鄙是卑鄙者的通行證, 高尚是高尚者的墓志銘陆错, 看吧灯抛,在那鍍金的天空中, 飄滿了死者彎曲的倒影音瓷。 冰川紀(jì)...
    絡(luò)羽閱讀 1,151評論 0 1