Android 群英傳筆記
第一章Android體系與系統(tǒng)架構(gòu)
第二章 Android開(kāi)發(fā)工具及技巧
第三章 Android控件架構(gòu)與事件攔截機(jī)制
第四章 ListView 使用技巧
第五章 Android Scroll 分析
第六章 Android 繪圖機(jī)制與屏幕適配
第七章 Android 動(dòng)畫(huà)機(jī)制與使用技巧
第八章 Activity與Activity調(diào)用棧分析
第九章 Android 系統(tǒng)信息與安全機(jī)制
第十章 Android性能優(yōu)化
本文出自:
http://www.reibang.com/u/a1251e598483
Android的系統(tǒng)體系結(jié)構(gòu)分為四層循捺,自頂向下分別是:
- 應(yīng)用程序(Applications)
- 應(yīng)用程序框架(Application Frameworks)
- 系統(tǒng)運(yùn)行庫(kù)與Android運(yùn)行環(huán)境(Libraris & Android Runtime)
- Linux內(nèi)核(Linux Kernel)
Application 層
使用NDK 開(kāi)發(fā)和使用Java 開(kāi)發(fā)的App 主要構(gòu)成 都有 Android Manifest 文件,Dalvik Classes,Resource Bundle 這幾個(gè)東西,使用NDK 還多了Libraries&JNI;
NDK 是什么 : 原生開(kāi)發(fā)工具包 (NDK) 是一組可讓您在 Android 應(yīng)用中利用 C 和 C++ 代碼的工具毯侦。 可用以從您自己的源代碼構(gòu)建喧笔,或者利用現(xiàn)有的預(yù)構(gòu)建庫(kù)。
NDK 不適用于大多數(shù)初學(xué)的 Android 編程者怕享,對(duì)許多類(lèi)型的 Android 應(yīng)用沒(méi)什么價(jià)值。 因?yàn)樗豢杀苊獾貢?huì)增加開(kāi)發(fā)過(guò)程的復(fù)雜性,所以通常不值得使用递鹉。 但如果您需要執(zhí)行以下操作弓候,它可能很有用:
1,從設(shè)備獲取卓越性能以用于計(jì)算密集型應(yīng)用郎哭,例如游戲或物理模擬。
2,重復(fù)使用您自己或其他開(kāi)發(fā)者的 C 或 C++ 庫(kù)菇存。
而我們大部分開(kāi)發(fā)的都是Java 應(yīng)用,基本上是屬于圖中最上面一層的開(kāi)發(fā).
應(yīng)用程序框架(Application Frameworks)
提供應(yīng)用程序開(kāi)發(fā)的各種API進(jìn)行快速開(kāi)發(fā)夸研,也即隱藏在每個(gè)應(yīng)用后面的是一系列的服務(wù)和系統(tǒng),大部分使用Java編寫(xiě)依鸥,所謂官方源碼很多也就是看這里亥至,其中包括:
- 豐富而又可擴(kuò)展的視圖(Views),可以用來(lái)構(gòu)建應(yīng)用程序贱迟, 它包括列表(lists)姐扮,網(wǎng)格(grids),文本框(text boxes)衣吠,按鈕(buttons)茶敏, 甚至可嵌入的web瀏覽器。
- 內(nèi)容提供器(Content Providers)使得應(yīng)用程序可以訪問(wèn)另一個(gè)應(yīng)用程序的數(shù)據(jù)(如聯(lián)系人數(shù)據(jù)庫(kù))蒸播, 或者共享它們自己的數(shù)據(jù)
- 資源管理器(Resource Manager)提供 非代碼資源的訪問(wèn)睡榆,如本地字符串,圖形袍榆,和布局文件( layout files )胀屿。
- 通知管理器 (Notification Manager) 使得應(yīng)用程序可以在狀態(tài)欄中顯示自定義的提示信息。
- 活動(dòng)管理器( Activity Manager) 用來(lái)管理應(yīng)用程序生命周期并提供常用的導(dǎo)航回退功能包雀。
系統(tǒng)運(yùn)行庫(kù)與Android運(yùn)行環(huán)境(Libraris & Android Runtime)
1.系統(tǒng)運(yùn)行庫(kù)
Android 包含一些C/C++庫(kù)宿崭,這些庫(kù)能被Android系統(tǒng)中不同的組件使用。它們通過(guò) Android 應(yīng)用程序框架為開(kāi)發(fā)者提供服務(wù)才写。以下是一些核心庫(kù):
- Bionic系統(tǒng) C 庫(kù) - 一個(gè)從 BSD 繼承來(lái)的標(biāo)準(zhǔn) C 系統(tǒng)函數(shù)庫(kù)( libc )葡兑, 它是專(zhuān)門(mén)為基于 embedded linux 的設(shè)備定制的。
- 媒體庫(kù) - 基于 PacketVideo OpenCORE赞草;該庫(kù)支持多種常用的音頻讹堤、視頻格式回放和錄制,同時(shí)支持靜態(tài)圖像文件厨疙。編碼格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 洲守。
- Surface Manager - 對(duì)顯示子系統(tǒng)的管理,并且為多個(gè)應(yīng)用程序提 供了2D和3D圖層的無(wú)縫融合。這部分代碼
- Webkit,LibWebCore - 一個(gè)最新的web瀏覽器引擎用梗醇,支持Android瀏覽器和一個(gè)可嵌入的web視圖知允。鼎鼎大名的 Apple Safari背后的引擎就是Webkit
- SGL - 底層的2D圖形引擎
- 3D libraries - 基于OpenGL ES 1.0 APIs實(shí)現(xiàn);該庫(kù)可以使用硬件 3D加速(如果可用)或者使用高度優(yōu)化的3D軟加速叙谨。
- FreeType -位圖(bitmap)和矢量(vector)字體顯示温鸽。
- SQLite - 一個(gè)對(duì)于所有應(yīng)用程序可用,功能強(qiáng)勁的輕型關(guān)系型數(shù)據(jù)庫(kù)引擎手负。
還有部分上面沒(méi)有顯示出來(lái)的就是硬件抽象層涤垫。其實(shí)Android并非講所有的設(shè)備驅(qū)動(dòng)都放在linux內(nèi)核里面,而是實(shí)現(xiàn)在userspace空間竟终,這么做的主要原因是GPL協(xié)議雹姊,Linux是遵循該 協(xié)議來(lái)發(fā)布的,也就意味著對(duì) linux內(nèi)核的任何修改衡楞,都必須發(fā)布其源代碼。而現(xiàn)在這么做就可以避開(kāi)而無(wú)需發(fā)布其源代碼敦姻,畢竟它是用來(lái)賺錢(qián)的瘾境。 而 在linux內(nèi)核中為這些userspace驅(qū)動(dòng)代碼開(kāi)一個(gè)后門(mén),就可以讓本來(lái)userspace驅(qū)動(dòng)不可以直接控制的硬件可以被訪問(wèn)镰惦。而只需要公布這個(gè) 后門(mén)代碼即可迷守。一般情況下如果要將Android移植到其他硬件去運(yùn)行,只需要實(shí)現(xiàn)這部分代碼即可旺入。包括:顯示器驅(qū)動(dòng)兑凿,聲音,相機(jī)茵瘾,GPS,GSM等等
2. Android運(yùn)行環(huán)境
該核心庫(kù)提供了JAVA編程語(yǔ)言核心庫(kù)的大多數(shù)功能礼华。
每一個(gè)Android應(yīng)用程序都在它自己的進(jìn)程中運(yùn) 行,都擁有一個(gè)獨(dú)立的Dalvik虛擬 機(jī)實(shí)例拗秘。Dalvik被設(shè)計(jì)成一個(gè)設(shè)備可以同時(shí)高效地運(yùn)行多個(gè)虛擬系統(tǒng)圣絮。 Dalvik虛擬機(jī)執(zhí)行(.dex)的Dalvik可執(zhí)行文件,該格式文件針對(duì)小內(nèi)存使用做了 優(yōu)化雕旨。同時(shí)虛擬機(jī)是基于寄存器的扮匠,所有的類(lèi)都經(jīng)由JAVA編譯器編譯,然后通過(guò)SDK中 的 "dx" 工具轉(zhuǎn)化成.dex格式由虛擬機(jī)執(zhí)行凡涩。
App 安裝到設(shè)備后棒搜,每個(gè) Android 應(yīng)用都運(yùn)行在自己的安全沙箱內(nèi):
Android 操作系統(tǒng)是一種多用戶(hù) Linux 系統(tǒng),其中的每個(gè)應(yīng)用都是一個(gè)不同的用戶(hù)活箕;
默認(rèn)情況下力麸,系統(tǒng)會(huì)為每個(gè)應(yīng)用分配一個(gè)唯一的 Linux 用戶(hù) ID(該 ID 僅由系統(tǒng)使用,應(yīng)用并不知曉)。系統(tǒng)為應(yīng)用中的所有文件設(shè)置權(quán)限末盔,使得只有分配給該應(yīng)用的用戶(hù) ID 才能訪問(wèn)這些文件筑舅;
每個(gè)進(jìn)程都具有自己的虛擬機(jī) (VM),因此應(yīng)用代碼是在與其他應(yīng)用隔離的環(huán)境中運(yùn)行陨舱;
默認(rèn)情況下翠拣,每個(gè)應(yīng)用都在其自己的 Linux 進(jìn)程內(nèi)運(yùn)行。Android 會(huì)在需要執(zhí)行任何應(yīng)用組件時(shí)啟動(dòng)該進(jìn)程游盲,然后在不再需要該進(jìn)程或系統(tǒng)必須為其他應(yīng)用恢復(fù)內(nèi)存時(shí)關(guān)閉該進(jìn)程误墓。
Android 系統(tǒng)可以通過(guò)這種方式實(shí)現(xiàn) 最小權(quán)限原則。也就是說(shuō)益缎,默認(rèn)情況下谜慌,每個(gè)應(yīng)用都只能訪問(wèn)執(zhí)行其工作所需的組件,而不能訪問(wèn)其他組件莺奔。 這樣便營(yíng)造出一個(gè)非常安全的環(huán)境欣范,在這個(gè)環(huán)境中,應(yīng)用無(wú)法訪問(wèn)系統(tǒng)中其未獲得權(quán)限的部分令哟。
不過(guò)恼琼,應(yīng)用仍然可以通過(guò)一些途徑與其他應(yīng)用共享數(shù)據(jù)以及訪問(wèn)系統(tǒng)服務(wù):
可以安排兩個(gè)應(yīng)用共享同一 Linux 用戶(hù) ID,在這種情況下屏富,它們能夠相互訪問(wèn)彼此的文件晴竞。 為了節(jié)省系統(tǒng)資源,可以安排具有相同用戶(hù) ID 的應(yīng)用在同一 Linux 進(jìn)程中運(yùn)行狠半,并共享同一 VM(應(yīng)用還必須使用相同的證書(shū)簽署)噩死。
應(yīng)用可以請(qǐng)求訪問(wèn)設(shè)備數(shù)據(jù)(如用戶(hù)的聯(lián)系人、短信神年、可裝載存儲(chǔ)裝置 [SD 卡]已维、相機(jī)、藍(lán)牙等)的權(quán)限已日。 用戶(hù)必須明確授予這些權(quán)限衣摩。
- 在 Android 上,一個(gè)應(yīng)用程序只有一個(gè)UID捂敌,當(dāng)然多個(gè)應(yīng)用程序也可以共享一個(gè)UID艾扮。
不同的應(yīng)用程序可以運(yùn)行在相同的進(jìn)程中。對(duì)于此方法占婉,首先必須使用相同的私鑰簽署這些應(yīng)用程序泡嘴,然后必須使用 manifest 文件給它們分配相同的 Linux 用戶(hù) ID,這通過(guò)用相同的值/名定義 manifest 屬性 android:sharedUserId 來(lái)做到逆济,從而共享對(duì)其數(shù)據(jù)和代碼的訪問(wèn) - 一個(gè)進(jìn)程就是host應(yīng)用程序的沙箱酌予,里面一般有一個(gè)UID和多個(gè)GIDS磺箕,每個(gè)進(jìn)程只能訪問(wèn)UID的權(quán)限范圍內(nèi)的文件和GIDs所允許訪問(wèn)的接口,構(gòu)成了Android最基本的安全基礎(chǔ)抛虫。
Linux內(nèi)核(Linux Kernel)
Android的核心系統(tǒng)服務(wù)依賴(lài)于Linux 2.6 內(nèi)核松靡,如安全性,內(nèi)存管理建椰,進(jìn)程管理雕欺, 網(wǎng)絡(luò)協(xié)議棧和驅(qū)動(dòng)模型。 Linux 內(nèi)核也同時(shí)作為硬件和軟件棧之間的抽象層棉姐。其外還對(duì)其做了部分修改屠列,主要涉及兩部分修改:
- Binder (IPC):提供有效的進(jìn)程間通信,雖然linux內(nèi)核本身已經(jīng)提供了這些功能伞矩,但Android系統(tǒng)很多服務(wù)都需要用到該功能笛洛,為了某種原因其實(shí)現(xiàn)了自己的一套。
- 電源管理:主要是為了省電乃坤,畢竟是手持設(shè)備嘛苛让,低耗電才是我們的追求。
四大組件
Acitivity, BroadCastReciever ,ContentProvider 和Service.
Android 系統(tǒng)提供一個(gè)信使 Intent , 組件與組件之間通過(guò)Intent 來(lái)通信,傳遞信息,交換數(shù)據(jù)
Context 的已經(jīng)寫(xiě)過(guò)了 參考 http://www.reibang.com/p/4f90ee8c92fe
查看手機(jī)根目錄
連接上手機(jī),輸入adb shell,輸入 cd /system/app/ 使用Linux的ls命令,查看目錄
清單文件
在 Android 系統(tǒng)啟動(dòng)應(yīng)用組件之前湿诊,系統(tǒng)必須通過(guò)讀取應(yīng)用的 AndroidManifest.xml
文件(“清單”文件)確認(rèn)組件存在蝌诡。 您的應(yīng)用必須在此文件中聲明其所有組件,該文件必須位于應(yīng)用項(xiàng)目目錄的根目錄中枫吧。
除了聲明應(yīng)用的組件外,清單文件還有許多其他作用宇色,如:
- 確定應(yīng)用需要的任何用戶(hù)權(quán)限九杂,如互聯(lián)網(wǎng)訪問(wèn)權(quán)限或?qū)τ脩?hù)聯(lián)系人的讀取權(quán)限
- 根據(jù)應(yīng)用使用的 API,聲明應(yīng)用所需的最低API 級(jí)別和軟件功能宣蠕,如相機(jī)例隆、藍(lán)牙服務(wù)或多點(diǎn)觸摸屏幕
- 應(yīng)用需要鏈接的 API 庫(kù)(Android 框架 API 除外),如 Google 地圖庫(kù)
- 其他功能
參考 :
<Android 群英傳> https://item.jd.com/11758334.html
https://developer.android.google.cn/guide/components/fundamentals.html#Resources
https://hit-alibaba.github.io/interview/Android/basic/Android-Arch.html