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就實現了最小特權原則:每一個app之間只能經過訪問組件達到工做目的;app不能訪問系統未給與權限的部分。app
然而,仍是有方法使app之間能分享數據和訪問系統服務:eclipse
Zygote是一個虛擬機進程,同時也是一個虛擬機實例的孵化器,每當系統要求執行一個 Android應用程序,Zygote就會fork出一個子進程來執行該應用程序。這樣作的好處顯而易見:異步
Zygote工做流程以下圖:ide
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的請求時激活的。
在Android系統能夠啓動一個應用程序組件以前,Android系統必須經過讀取這個程序的AndroidManifest.xml(即manifest文件)文件來肯定要啓動的組件存在。你的程序必須在這個manifest文件聲明用到的全部的組件,而且這個manifest文件必須在項目的根目錄下。
另外,這個manifest文件還聲明一些其餘的東西,好比:
一個應用程序不只僅由代碼組成——它須要與代碼分隔的資源。使用應用程序資源文件,能夠更容易地更新你的應用程序的特性而無需修改代碼,而且 — 經過提供多套備選資源文件 — 使您可以針對各類設備配置優化你的應用程序(好比不一樣語言或屏幕大小)。
對於你的安卓工程裏面包含的每一項資源, SDK 構建工具定義一個惟一的正整數 ID 標識符,你可使用該標識符從你的應用程序代碼中或者從XML文件中定義的其餘資源中特指該資源。
將資源提供工做同你的源代碼分隔開來最重要的緣由之一是可以使你爲不一樣的設備配置提供可替換的資源文件。 對於備選資源,Android 支持許多不一樣的限定符(qualifiers)。限定符是包含在你的資源文件夾名稱中的一個短字符串,以便界定哪些設備配置可以使用這些資源(好比drawable-hdpi)。