#### **Android 打包應用程序并安裝的過程**
目前,是使用**Eclipse編譯工具打包安裝APK的過程分析**,至于使用AndroidStudio的過程可以參考
:-: 
圖1 Android 打包應用程序并安裝的過程
1. 拷貝apk文件到 /data/app/xx.apk
2. 寫注冊表 /data/system/package.xml packages.list
#### **Eclipse對安卓測試程序啟動過程**
**程序**:
* adt: android develop tools (eclipse的一個插件)
* ddms : dalvik debug manager system
* adb.exe android debug bridge android調試橋
* aapt.exe android application package tools android程序打包工具
1. Eclipse將.java源文件編譯成.class
2. 使用dx工具將所有.class文件轉換為.dex文件
3. 再將.dex文件和所有資源打包成.apk文件
4. 將.apk文件安裝到虛擬機完成程序安裝
5. 啟動程序 – 開啟進程 – 開啟主線程
6. 創建Activity對象 – 執行OnCreate()方法
7. 按照main.xml文件初始化界面
#### **工程編譯步驟**
步驟中提到的工具如下表:

* **第一步:打包資源文件,生成R.java文件**
【輸入】Resource文件(就是工程中res中的文 件)、Assets文件(相當于另外一種資源,這種資源Android系統并不像對res中的文件那樣優化它)、AndroidManifest.xml 文件(包名就是從這里讀取的,因為生成R.java文件需要包名)、Android基礎類庫(Android.jar文件)
【輸出】打包好的資源(一般在Android工程的bin目錄可以看到一個叫resources.ap_的文件就是它了)、R.java文件(在gen目錄中,大家應該很熟悉了)
【工 具】aapt工具,它的路徑在${ANDROID_SDK_HOME}/platform-tools/aapt(如果你使用的是Windows系統,按 慣例路徑應該這樣寫:%ANDROID_SDK_HOME%\platform-tools\aapt.exe,下同)。
* **第二步:處理AIDL文件,生成對應的.java文件(當然,有很多工程沒有用到AIDL,那這個過程就可以省了)**
【輸入】源碼文件、aidl文件、framework.aidl文件
【輸出】對應的.java文件
【工具】aidl工具
* **第三步:編譯Java文件,生成對應的.class文件**
【輸入】源碼文件(包括R.java和AIDL生成的.java文件)、庫文件(.jar文件)
【輸出】.class文件
【工具】javac工具
* **第四步:把.class文件轉化成Davik VM支持的.dex文件**
【輸入】 .class文件(包括Aidl生成.class文件,R生成的.class文件,源文件生成的.class文件),庫文件(.jar文件)
【輸出】.dex文件
【工具】javac工具
* **第五步:打包生成未簽名的.apk文件**
【輸入】打包后的資源文件、打包后類文件(.dex文件)、libs文件(包括.so文件,當然很多工程都沒有這樣的文件,如果你不使用C/C++開發的話)
【輸出】未簽名的.apk文件
【工具】apkbuilder工具
* **第六步:對未簽名.apk文件進行簽名**
【輸入】未簽名的.apk文件
【輸出】簽名的.apk文件
【工具】jarsigner
* **第七步:對簽名后的.apk文件進行對齊處理(不進行對齊處理是不能發布到Google Market的)**
【輸入】簽名后的.apk文件
【輸出】對齊后的.apk文件
【工具】zipalign工具
知道了這些細節之后,我們就可以實現很多我們想實現東西了,比如:**自動化**,我們可以使用某種腳本,像Windows下的批處理,linux下的Bash,Java下的Ant,Python、Perl這樣的腳本語言,甚至直接用Java、.net這們的強類型語言也是可以的。**如果你真正弄懂了上面的步驟,了解了編譯打包過程的本質,你完全可以以你想要的任何方式實現它的自動化,這才是真正的“舉一反三,以不變應萬變”**。再比如,**對Android SDK的精簡**,大家知道,現在Android SDK動轍幾百兆,我們完全可以應用上面的知識,只保留必要的工具,把SDK精簡到10M以下。當然,還可以做很多事情,前提是你真正弄懂了它。
- 前言
- Android系統的體系結構
- Dalvik VM 和 JVM 的比較
- Android 打包應用程序并安裝的過程
- Android ADB工具
- Android應用開發
- Android UI相關知識總結
- Android 中window 、view、 Activity的關系
- Android應用界面
- Android中的drawable和bitmap
- AndroidUI組件adapterView及其子類和Adapter的關系
- Android四大組件
- Android 數據存儲
- SharedPreference
- Android應用的資源
- 數組資源
- 使用Drawable資源
- Material Design
- Android 進程和線程
- 進程
- 線程
- Android Application類的介紹
- 意圖(Intent)
- Intent 和 Intent 過濾器(Google官網介紹)
- Android中關于任務棧的總結
- 任務和返回棧(官網譯文)
- 總結
- Android應用安全現狀與解決方案
- Android 安全開發
- HTTPS
- 安卓 代碼混淆與打包
- 動態注入技術(hook技術)
- 一、什么是hook技術
- 二、常用的Hook 工具
- Xposed源碼剖析——概述
- Xposed源碼剖析——app_process作用詳解
- Xposed源碼剖析——Xposed初始化
- Xposed源碼剖析——hook具體實現
- 無需Root也能Hook?——Depoxsed框架演示
- 三、HookAndroid應用
- 四、Hook原生應用程序
- 五、Hook 檢測/修復
- Android 應用的逆向與加固保護技術
- OpenCV在Android中的開發
- Android高級開發進階
- 高級UI
- UI繪制流程及原理
- Android新布局ConstraintLayout約束布局
- 關鍵幀動畫
- 幀動畫共享元素變換
- Android異步消息處理機制完全解析,帶你從源碼的角度徹底理解
- Android中為什么主線程不會因為Looper.loop()里的死循環卡死?
- 為什么 Android 要采用 Binder 作為 IPC 機制?
- JVM 中一個線程的 Java 棧和寄存器中分別放的是什么?
- Android源碼的Binder權限是如何控制?
- 如何詳解 Activity 的生命周期?
- 為什么Android的Handler采用管道而不使用Binder?
- ThreadLocal,你真的懂了嗎?
- Android屏幕刷新機制