#### **Android 打包应用程序并安装的过程**
目前,是使用**Eclipse编译工具打包安装APK的过程分析**,至于使用AndroidStudio的过程可以参考
:-: ![](https://box.kancloud.cn/350b2d3af15a6a088018a32426d639ef_762x200.png)
图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文件初始化界面
#### **工程编译步骤**
步骤中提到的工具如下表:
![](https://box.kancloud.cn/4131d904339fda67b3dd4705a54657f5_662x244.jpg)
* **第一步:打包资源文件,生成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屏幕刷新机制