成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入詳解Apk編譯打包流程

移動開發 Android
使用aapt來打包res資源文件,生成R.java、resources.arsc和res文件(二進制 & 非二進制如res/raw和pic保持原樣)。

[[430397]]

前言

身為一個Android開發,一定要了解apk編譯打包流程;

那么今天我們就來學習下;

apk的編譯流程

1、apk文件

  • apk是Android Package的縮寫;
  • 解壓apk文件后包含AndroidManifest.xml、assets目錄、classes.dex(還可能有 classes2.dex,classes3.dex...classesN.dex)、lib目錄、META-INF目錄、res目錄和resources.arsc;
  • classes.dex 是.dex文件;
  • resources.arsc是resources resources文件;
  • AndroidManifest.xml是AndroidManifest.xml文件;
  • res是uncompiled resources;
  • META-INF是簽名文件夾;

2、打包流程

打包中需要的工具

  • aapt:Android資源打包工具,${ANDROID_SDK_HOME}/platform-tools/appt
  • aidl:Android接口描述語言轉化為.java文件的工具,${ANDROID_SDK_HOME}/platform-tools/aidl
  • javac:Java Compiler,${JDK_HOME}/javac或/usr/bin/javac
  • dex:轉化.class文件為Davik VM能識別的.dex文件,${ANDROID_SDK_HOME}/platform-tools/dx
  • apkbuilder:生成apk包,${ANDROID_SDK_HOME}/tools/opkbuilder
  • jarsigner:.jar文件的簽名工具,${JDK_HOME}/jarsigner或/usr/bin/jarsigner
  • zipalign:字節碼對齊工具,${ANDROID_SDK_HOME}/tools/zipalign

2.1打包資源文件,生成R.java文件

使用aapt來打包res資源文件,生成R.java、resources.arsc和res文件(二進制 & 非二進制如res/raw和pic保持原樣);

res目錄

  • animator:這類資源以XML文件保存在res/animator目錄下,用來描述屬性動畫;
  • anim:這類資源以XML文件保存在res/anim目錄下,用來描述補間動畫;
  • color:這類資源以XML文件保存在res/color目錄下,用描述對象顏色狀態選擇子;
  • drawable:這類資源以XML或者Bitmap文件保存在res/drawable目錄下,用來描述可繪制對象。例如,我們可以在里面放置一些圖片(.png, .9.png, .jpg, .gif),來作為程序界面視圖的背景圖;
  • layout:這類資源以XML文件保存在res/layout目錄下,用來描述應用程序界面布局;
  • menu:這類資源以XML文件保存在res/menu目錄下,用來描述應用程序菜單;
  • raw:這類資源以任意格式的文件保存在res/raw目錄下,它們和assets類資源一樣,都是原裝不動地打包在apk文件中的,不過它們會被賦予資源ID,這樣我們就可以在程序中通過ID來訪問它們。例如,假設在res/raw目錄下有一個名稱為filename的文件,并且它在編譯的過程,被賦予的資源ID為R.raw.filename,那么就可以使用以下代碼來訪問它:
  1. Resources res = getResources(); 
  2.  
  3. InputStream is = res .openRawResource(R.raw.filename); 
  • values:這類資源以XML文件保存在res/values目錄下,用來描述一些簡單值,例如,數組、顏色、尺寸、字符串和樣式值等,一般來說,這六種不同的值分別保存在名稱為arrays.xml、colors.xml、dimens.xml、strings.xml和styles.xml文件中;
  • xml:這類資源以XML文件保存在res/xml目錄下,一般就是用來描述應用程序的配置信息;

resources.arsc文件

  • resources.arsc這個文件記錄了所有的應用程序資源目錄的信息,包括每一個資源名稱、類型、值、ID以及所配置的維度信息;
  • 我們可以將這個resources.arsc文件想象成是一個資源索引表,這個資源索引表在給定資源ID和設備配置信息的情況下,能夠在應用程序的資源目錄中快速地找到最匹配的資源;

R.java文件

  • R.java文件,里面擁有很多個靜態內部類,比如layout,string等;
  • 每當有這種資源添加時,就在R.java文件中添加一條靜態內部類里的靜態常量類成員,且所有成員都是int類型;

2.2處理AIDL文件,生成對應的.java文件

  • AIDL (Android Interface Definition Language), Android接口定義語言,Android提供的IPC (Inter Process Communication,進程間通信)的一種獨特實現;
  • 這個階段處理.aidl文件,生成對應的Java接口文件;

2.3編譯Java文件,生成對應的.class文件

  • 編譯工程源碼,生成相應的class文件。處理文件包括src、R.java、AIDL生成的 java 文件,庫jar文件;
  • 調用了javac編譯工程的src目錄下所有的java源文件,生成的class文件位于工程的bin\classess目錄下;

2.4把.class文件轉化成Davik VM支持的.dex文件

  • 轉換所有的class文件,生成classes.dex文件。處理文件就是上一步生成的 .class 文件;
  • 使用dx工具將java字節碼轉換為dalvik字節碼、壓縮常量池、消除冗余信息等;
  • 通過dex命令,將.class文件和第三方庫中的.class文件處理生成classes.dex;

2.5打包生成未簽名的.apk文件

  • 將classes.dex、resources.arsc、res文件夾(res/raw資源被原裝不動地打包進APK之外,其它的資源都會被編譯或者處理)、Other Resources(assets文件夾)、AndroidManifest.xml打包成apk文件;

注意:

res/raw和assets的相同點:

兩者目錄下的文件在打包后會原封不動的保存在apk包中,不會被編譯成二進制;

res/raw和assets的不同點:

  • res/raw中的文件會被映射到R.java文件中,訪問的時候直接使用資源ID即R.id.filename;assets文件夾下的文件不會被映射到R.java中,訪問的時候需要AssetManager類;
  • res/raw不可以有目錄結構,而assets則可以有目錄結構,也就是assets目錄下可以再建立文件夾;

2.6對未簽名.apk文件進行簽名

  • android的應用程序需要簽名才能在android設備上安裝,簽名apk文件有兩種情況:
  • 在調試應用程序時,也就是我們通常稱為的debug模式的簽名,平時開發的時候,在編譯調試程序時會自己使用一個debug.keystore對apk進行簽名;
  • 正式發布時對應用程序打包進行簽名,這種情況下需要提供一個符合android開發文檔中要求的簽名文件。這種簽名也是分兩種:JDK中提供的jarsigner工具簽名 、android源碼中提供的signapk工具;

2.7對簽名后的.apk文件進行對齊處理

  • release mode 下使用 aipalign進行align,即對簽名后的apk進行對齊處理;
  • Zipalign是一個android平臺上整理APK文件的工具,它對apk中未壓縮的數據進行4字節對齊,對齊后就可以使用mmap函數讀取文件,可以像讀取內存一樣對普通文件進行操作。如果沒有4字節對齊,就必須顯式的讀取,這樣比較緩慢并且會耗費額外的內存;
  • 在 Android SDK 中包含一個名為 “zipalign” 的工具,它能夠對打包后的 app 進行優化。其位于 SDK 的 build-tools 目錄下;

總結 

人生很有意思,就像升級打怪,打了一怪又一怪,雖然過程有辛苦有困難,有失敗的危險,也有后退的風險,但是打一怪很有感覺;加油打工人!!!

 

責任編輯:武曉燕 來源: Android開發編程
相關推薦

2015-07-13 15:52:18

反編譯Android APK

2017-07-13 13:13:49

AndroidAPK反編譯

2023-07-12 13:25:17

Vue 2模版編譯

2013-05-14 10:39:27

AIR Android打包APK文件

2022-02-07 07:48:17

MyBatisJavaORM

2009-12-23 17:42:37

WPF Control

2011-09-13 17:30:41

Eclipse And

2011-01-19 17:13:44

Sylpheed

2009-12-25 14:03:46

Linux vi

2015-12-24 09:48:40

JavaScriptthis指針深

2010-06-29 15:29:22

UML建模流程

2021-10-29 16:36:53

AMSAndroidActivityMan

2009-12-24 17:06:35

編譯Fedora內核

2010-01-13 16:55:10

CentOS PHP安

2009-11-04 14:19:32

寬帶接入技術

2009-10-19 13:33:45

綜合布線施工規范

2015-12-30 10:29:40

Git協作流程詳解

2009-07-24 09:24:31

Java終止函數

2022-10-11 07:43:34

AndroidSyncGradle 構建

2010-01-14 16:53:40

CentOS Apac
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕在线国产 | 日本成人免费观看 | 日韩中文字幕一区二区 | 欧美在线一区二区三区 | 亚洲自拍偷拍免费视频 | 精品视频一区二区 | 欧美一区二不卡视频 | 日韩中文字幕 | 国产日韩欧美一区二区 | 免费一区在线 | 中文字幕 在线观看 | 久久一区二区三区四区 | 久久99精品久久久久久琪琪 | 久草青青草 | 午夜精品久久久久久久星辰影院 | 色噜噜狠狠色综合中国 | 一级a性色生活片久久毛片 午夜精品在线观看 | 国产精品视频久久久 | 在线观看中文视频 | 国产精品久久国产精品久久 | 一级亚洲 | 涩涩视频网站在线观看 | 成人在线观看黄 | av在线电影网站 | 欧美一区二区三区免费电影 | 亚洲伊人a| 在线一区视频 | 欧美成人免费在线 | 亚洲第1页| 午夜精品视频在线观看 | 国产区久久 | 亚洲国产精品久久久 | 成人影视网址 | 伊人在线视频 | av黄色网 | 亚洲男女视频在线观看 | 欧美日韩精品专区 | 国产精品免费观看 | 欧美在线日韩 | 久久久精品网 | 福利社午夜影院 |