Android——app基礎

Android Application基礎

系統啓動過程

image

APK文件介紹

APK是Android Package的縮寫,即android安裝包。APK 文件實際上是zip 格式,但後綴名被修改成apk ,能夠經過解壓程序直接解壓查看。apk 解壓後,通常的可看到的目錄結構以下:java

文件或目錄 做用
AndroidManifest.xml文件 程序全局配置文件,它描述了應用的名字、版本、權限、引用的庫文件等等信息。在apk中的AndroidManifest.xml是通過壓縮的,能夠經過AXMLPrinter2工具解開,具體命令爲:java -jar AXMLPrinter2.jar AndroidManifest.xml 
META-INF目錄 存放的是簽名信息,用來保證apk包的完整性和系統的安全。在eclipse編譯生成一個apk包時,會對全部要打包的文件作一個校驗計算,並把計算結果放在META-INF目錄下。這就保證了apk包裏的文件不能被隨意替換。好比拿到一個apk包後,若是想要替換裏面的一幅圖片,一段代碼, 或一段版權信息,想直接解壓縮、替換再從新打包,基本是不可能的。如此一來就給病毒感染和惡意修改增長了難度,有助於保護系統的安全。
res目錄  存放資源文件。包括圖片,字符串等等。
lib目錄  子目錄armeabi存放的是一些so文件。這個地方多講幾句,都是在開發過程當中摸索出來的。eclipse在打包的時候會根據文件名的命名規則(lib****.so)去打包so文件,開頭和結尾必須分別爲「lib」和「.so」,不然是不會打包到apk文件中的。其餘非eclipse開發環境沒有測試過。若是你是用SDK和NDK開發的話,這部分很重要,甚至能夠經過把一些不是so文件的文件經過更名打包到apk中,具體能幹些什麼那就看你想幹什麼了。
assets目錄 存放一些配置文件,這些文件的內容在程序運行過程當中能夠經過相關的API得到。
classes.dex文件  DEX(DalvikVM executes的簡稱)是Android Dalvik執行程序文件,是Dalvik的字節碼而非Java的字節碼(首先是java文件經過jdk編譯成字節碼文件而後通過dex編譯成classes.dex)
resources.arsc文件  編譯後的二進制資源文件的索引(apk文件的資源表)

Android在運行程序時首先須要解壓apk文件,而後獲取編譯後的AndroidManifest.xml文件中配置信息,執行dex程序。android

系統基礎

每一個Android應用程序的都運行在它本身的安全沙箱中:安全

  • 而Android操做系統是一個多用戶Linux系統中,每一個應用程序是一個不一樣的用戶。 
  • 默認狀況下,每一個應用程序的系統分配一個惟一的Linux用戶ID(該ID僅用於系統,對應用程序來講是未知)。系統爲每個app的全部文件都設置權限,以便只有分配了該用戶ID的應用程序能夠訪問它們。 
  • 每一個進程都有它本身的虛擬機(VM),所以應用程序的代碼和其餘應用程序是隔離運行的。 
  • 默認狀況下,每一個應用程序運行在它本身的Linux進程。當應用程序的任何組件須要被執行時,Android會啓動一個進程。當該進程再也不須要或者系統須要爲其它程序恢復內存時,都會關閉該進程。

以這種方式,Android就實現了最小特權原則:每一個app之間只能經過訪問組件達到工做目的;app不能訪問系統未給與權限的部分。app

然而,仍是有方法使app之間能分享數據和訪問系統服務:eclipse

  • 當兩個app共享一個Linux用戶ID時,它們就能互相訪問文件。爲了節約系統資源,擁有相同用戶ID的app還能夠被安排運行在相同的Linux進程中而且共享相同的VM(app必須有相同的簽名)。
  • app能請求權限去訪問設備數據,好比聯繫人、短信、SD卡……全部的app權限必須在安裝時被授予。

Zygote

Zygote是一個虛擬機進程,同時也是一個虛擬機實例的孵化器,每當系統要求執行一個 Android應用程序,Zygote就會fork出一個子進程來執行該應用程序。這樣作的好處顯而易見:異步

  1. Zygote進程是在系統啓動時產生的,它會完成虛擬機的初始化,庫的加載,預置類庫的加載和初始化等等操做。
  2. 而在系統須要一個新的虛擬機實例時,Zygote經過複製自身,快速的提供一個執行進程。
  3. 另外,對於一些只讀的系統庫,全部虛擬機實例都和Zygote共享一塊內存區域,大大節省了內存開銷。

Zygote工做流程以下圖:ide

App組件

app組件是Android程序最重要的構造模塊。每個組件都是系統進入app的不一樣入口。app組件有四種不一樣的類型,分別爲Activities、Services、Content providers和Broadcast receivers,它們都有本身的用途和生命週期。函數

當系統啓動一個組件以後,若是這個組件所在的程序以前沒有運行的話,系統會自動開始這個程序的進程,並初始化這個組件所須要的相關類。好比,你的程序開啓了一個拍照功能程序的Activity,這時系統會啓動這個Activity所在的程序,因此這個Activity運行在拍照功能的程序當中,而不是在你的程序中。因此,不像其餘操做系統的中的程序同樣,Android程序沒有一個單獨的入口點(好比沒有咱們常見的main()函數)。工具

由於系統中的程序運行在本身的獨立進程中,而且程序中的文件都有本身的限制其餘程序訪問的權限,因此,你的程序不能直接激活其餘程序中的組件。可是Android系統就能夠。爲了激活其餘程序中的組件,你必須向系統發送一個消息來詳細說明你要啓動其餘組件的意圖,這樣系統纔會爲你激活這個組件。測試

四大組件中的三個組件——activities、services和broadcast receiver——是由一種叫intent的異步消息來激活的。這些intents在運行時(runtime)將特定的組件綁定在一塊兒(bind),你能夠把這些intents看做來自其餘組件請求活動的messengers。最後一種組件類型content provider並非由intent來激活的(activate)。而是由接收到ContentResolver的請求時激活的。 

Manifest

在Android系統能夠啓動一個應用程序組件以前,Android系統必須經過讀取這個程序的AndroidManifest.xml(即manifest文件)文件來肯定要啓動的組件存在。你的程序必須在這個manifest文件聲明用到的全部的組件,而且這個manifest文件必須在項目的根目錄下。

另外,這個manifest文件還聲明一些其餘的東西,好比:

  • 肯定這個程序須要的全部權限,好比Internet訪問權限或者讀取用戶聯繫人權限。 
  • 聲明這個運行這個程序所須要的最低API版本,這個能夠根據開發該程序所使用的API版本。 
  • 聲明該程序所須要的硬件或軟件特徵(features),好比照相機、藍牙服務或者多點觸屏。 
  • 聲明該程序須要連接(link against)的API庫(不是Andorid的framework APIs),好比Google Maps library。 
  • 等等。

App Resources

一個應用程序不只僅由代碼組成——它須要與代碼分隔的資源。使用應用程序資源文件,能夠更容易地更新你的應用程序的特性而無需修改代碼,而且 — 經過提供多套備選資源文件 — 使您可以針對各類設備配置優化你的應用程序(好比不一樣語言或屏幕大小)。

對於你的安卓工程裏面包含的每一項資源, SDK 構建工具定義一個惟一的正整數 ID 標識符,你可使用該標識符從你的應用程序代碼中或者從XML文件中定義的其餘資源中特指該資源。

將資源提供工做同你的源代碼分隔開來最重要的緣由之一是可以使你爲不一樣的設備配置提供可替換的資源文件。 對於備選資源,Android 支持許多不一樣的限定符(qualifiers)。限定符是包含在你的資源文件夾名稱中的一個短字符串,以便界定哪些設備配置可以使用這些資源(好比drawable-hdpi)。

相關文章
相關標籤/搜索