Android APK安裝過程學習筆記

来源:http://www.cnblogs.com/zhangmiao14/archive/2017/06/06/6950561.html
-Advertisement-
Play Games

1.什麼是APK APK,即Android Package,Android安裝包。不同平臺的安裝文件格式都不同,類似於Windows的安裝包是二進位的exe格式,Mac的安裝包是dmg格式。APK可以再Android上執行安裝,APK的本質是一個Zip壓縮包,只是尾碼被修改為apk,其中打包了源代碼 ...


1.什麼是APK

  APK,即Android Package,Android安裝包。不同平臺的安裝文件格式都不同,類似於Windows的安裝包是二進位的exe格式,Mac的安裝包是dmg格式。APK可以再Android上執行安裝,APK的本質是一個Zip壓縮包,只是尾碼被修改為apk,其中打包了源代碼編譯出的class.dex、一些圖片視屏資源文件和一些Native庫文件。APK文件與Zip文件最大的一個不同是APK包含簽名文件,用於保證安裝包安全不被修改。

2.什麼是DEX文件和ODEX文件

  Java卡平臺是由源代碼編譯出的class文件分別運行在不同平臺的虛擬機上,由虛擬機屏蔽了不同平臺的差異。但是由於Android系統針對手持設備,對Dalvik虛擬機進行了優化,主要包括:
    (1)將原來class文件進行優化,例如將其中的常量冗餘信息進行合併,提供虛擬機解析效率;
    (2)修改JVM運行時基於棧的數據結構修改為Dalvik基於寄存器的數據結構,數據訪問方式更快,運行效率更高。
  這種情況下,原來的.class文件就有些不適用了,因此,出現了dex文件格式,它是源代碼編譯後打包生成的文件。它是APK的一個組成部分。ODEX文件是Dalvik將dex文件中可執行文件class.dex文件解壓出來後,存儲在本地後生成的。因為Android系統無法直接運行APK文件,需要將其解壓後找到class.dex文件後才可以運行,因此在安裝時就將其取出放在本地,可以提高應用啟動速度。除了這個原因,其實在將class.dex轉換成ODEX文件過程中,還根據當前系統進行了優化(直接複製到其他系統不一定可以運行),文件大小會減少,ODEX文件比DEX文件更難反編譯,這也在一定程度上提高了安全性,因此在一些系統預安裝或系統級應用大多採用了ODEX優化。一般ODEX不直接運行,在Dalvik運行ODEX時,需要通過JIT進行優化,提高運行效率。JIT是一種在運行時同步將位元組碼轉化成機器碼的過程,Dalvik直接運行轉化後的機器碼,這會導致部分的記憶體和時間開銷,但是整體來說,在某些情況下是會提高系統性能的。(有些動態編譯器,可能根據經驗或嘗試編譯,優化這一過程,可能運行次數越多,優化效果越好)。

3.什麼是OAT文件

  OAT文件是ART運行的文件,是一種二進位可運行文件,包含DEX文件和編譯出的本地機器指令文件,其文件格式類似於網路數據報文,包含文件頭和文件體,文件頭的oatdata、oatexec和oatlastword欄位分別描述DEX文件位置和本地機器指令的起止位置。因為OAT文件包含DEX文件,因此比ODEX文件占用空間更大,由於其在安裝時經過了ART的處理,ART載入OAT文件後不需要經過處理就可以直接運行,它沒有了從位元組碼轉換成機器碼的過程,因此運行速度更快。可以理解為JIT進行優化從運行時才解析提前到了安裝時解析,安裝變慢,運行變快。

4.什麼是Dalvik和ART

  Dalvik和ART都是Android運行環境,但是由於Dalvik存在一些不足,ART是在高版本手機上替換Dalvik的。Dalvik和ART是Android平臺實現的JAVA虛擬機。用於解析DEX文件、ODEX文件和OAT文件。ART即Android Runtime,Android運行時,由於Android系統運行在不同的設備上,底層硬體不同,Linux系統屏蔽了一些這些系統的細節,但是直接在Linux上開發應用太難,實現成本太高,為了屏蔽Linux的細節,Google創建出了Dalvik和ART,對Linux進行了再一次封裝,這樣,
使用Google提供的集成開發環境SDK,就可以輕鬆開發應用了,Dalvik與ART的關係是ART用來替換Dalvik,現在市場上ART的占用率已經超過了70%。ART是Android應用的運行模式,在這種模式下,Android應用在安裝後,會進行一次預編譯,將應用安裝包中的位元組碼轉換成機器語言存儲在本地(系統只能運行二進位程式),這樣,應用在運行時,可以直接執行這些二進位程式。相比較於Dalvik來說,Dalvik的做法是在應用安裝後,直接將位元組碼存儲起來,在每次運行時,需要將代碼編譯成機器語言,這樣在運行程式時,就比ART慢了一些。ART這樣做導致了安裝後應用所占的空間更大,安裝時間更長,但是對於經常使用的應用,這樣做是值得的。

5.APK是如何安裝的?

  程式的源代碼,首先經過SDK編譯成DEX文件,DEX文件和一些資源文件(圖片、視頻等)、Native Code(C語言等編譯出的.so文件)會直接打包進APK。安裝APK的過程,其實是安裝包解壓的過程。資源文件、二進位庫等解壓後直接存儲在本地,DEX文件不僅僅解壓,會根據系統的運行環境,採用不同的處理方式,被處理成不同格式的文件存儲在本地,等待程式啟動調用,這樣就完成了應用的安裝過程。

 

總結:APK是Android安裝包,Dalvik和ART都是Android運行環境,ART是在高版本手機上替換Dalvik的。dex文件是源代碼編譯後打包生成的文件,是APK的一個組成部分,安裝時Dalvik將dex文件中可執行文件class.dex解壓存儲在本地的文件就是ODEX文件。ART運行生成的文件是OAT。

Dalvik與ART比較
(1)Dalvik和ART是Android平臺實現的JAVA虛擬機。用於解析DEX文件、ODEX文件和OAT文件。
(2)ART解析模式是Android應用在安裝後,會進行一次預編譯,將應用安裝包中的位元組碼轉換成機器語言存儲在本地。
(3)Dalvik解析模式是在應用安裝後,直接將位元組碼存儲起來,每次運行時,需要將代碼編譯成機器語言。
(4)運行程式時,Dalvik比ART慢,ART安裝後應用所占的空間更大,安裝時間長。


ODEX文件與OAT文件比較:
(1)Dalvik將APK中的內容轉化成ODEX,ART將其轉化成OAT。
(2)ODEX需要通過JIT進行優化,提高運行效率。
(3)OAT包含DEX文件和編譯出的本地機器指令文件,比ODEX文件占用空間大,不需要經過處理就可以直接運行,運行速度快。


學習文章:http://mp.weixin.qq.com/s/37wjSQs1HWVfX0xL27NjBg


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言: 從接觸Kotlin開始,也就是我今天開啟寫技術博客的決定,文采不佳,歡迎各位閱讀者的理解與指點。而該篇文章是最為博客新手的我對Kotlin成長的引導篇,所以內容一般是Kotlin技術博客的目錄頁以及個人相關言論,將持續更新中。 2017谷歌I/O大會:宣佈 Kotlin 成 Android ...
  • 代碼: RootViewController.h RootViewController.m ...
  • 最近,想做一個跨平臺的區域網的文件傳輸軟體,思路是組播設備信息,TCP連接傳輸文件。於是進行了一次簡單的UDP組播測試,發現Android對於UDP組播接收數據的支持即極為有限。 部分代碼如下 1 package com.hsocket.Udp; 2 3 import java.io.IOExcep ...
  • iOS CAReplicatorLayer 實現脈衝動畫效果 效果圖 脈衝數量、速度、半徑、透明度、漸變顏色、方向等都可以設置。可以用於地圖標註(Annotation)、按鈕長按動畫效果(例如錄音按鈕)等。 代碼已上傳 GitHub:https://github.com/Silence GitHub ...
  • 公司最近需要往智能家居方面發展,需要用到UDP協議傳輸數據,在網上找到了一些資料,但是發現傳輸中文的時候有亂碼的現象,經過我多番搗鼓,終於解決了這個問題,下麵貼上關鍵代碼 客戶端: 服務端: ...
  • 前段時間擼代碼猥瑣發育的時候,設計師老王給了張截圖某寶APP上一個生成長圖分享的功能,正好公司有這個需求,於是在立馬開始操練起來!在萬能的度娘上搜集整理資料後發現很多文章介紹的方案對WKWebView不適用,iOS8.0後的系統基本使用WKWebView載入H5,生成截圖是往往後面一段很大的空白,這 ...
  • 1.安裝adb offline解決辦法: 原因就是android 4.2以上的版本過高,sdk的adb驅動不匹配,需要升級。我原本的adb是1.0.29,升級為1.0.31,問題就解決了。 2.安裝sdk 3.啟動monitor.bat 4.會輸出所有log 5.建立過濾器filter logcat ...
  • 又是一年的WWDC,激情過後還是該總結一下本次開發者大會的主要關註點。本次的開發者大會幾乎涵蓋了Apple的所有產品,包括軟體及硬體的更新,相比去年同期的開發者大會而言已然展示了Apple極大的誠意了。 接下來我們就來看看WWDC2017都發生了些什麼。整個大會分成6個Part: Part1帶來的是 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...