深入android源码---apk生成过程综述
来源:互联网 发布:剩余windows重置计数2 编辑:程序博客网 时间:2024/06/06 14:29
Apk生成过程包括apk的打包编译最终生成apk包的过程
一、apk打包
1.Apk打包有两种方式,Eclipse或者ant,不管哪一种都包含下面七个步骤
第一步:编译打包资源文件
其实就是编译xml文件和编译资源生成resources.arsc文件,然后把res文件,这三样一起弄成压缩包
使用工具appt位于android-sdk\platform-tools目录下,源码在Android系统源码目录的frameworks\base\tools\appt
Resource.cpp的buildResources()检测AndroidManifest.xml的合法性
makeFileResource()对res目录下的资源子目录进行资源文件名合法性检测。向资源table添加条目
ResourceTable.cpp的compileResourceFile()函数编译res与asserts目录下的资源生成resource.arsc文件
parseAndAddEntry()函数生成R.java文件,
compileXmlFile()函数对res目录下的xml文件分别进行编译
最后将所有的资源与编译生成的resource.arsc文件以及加密过得androidManifest.xml文件压缩成resource.ap_
第二步:处理aidl文件,生成相应的Java文件。
aidl位于android-sdk/platform-tools目录下,源码位于android源码的frameworks\base\tools\aidl目录下。
第三步:编译工程源码生成相应的class文件
第四步:转换所有的class文件,生成classes.dex文件
使用android-sdk\platform-tools目录下的dx
第五步:打包生成apk文件
打包工具为apkbuilder,位于android-sdk\tools目录下,apkbuilder为一个脚本文件
第六步:对apk文件进行签名
调试时eclipse使用debug,keystore,我们打包发布用jdk的jarsigner工具,或者android源码中的
Build\tools\signapk工具
第七步:使用zipalign工具对签名后的APK文件进行对齐处理。
Zipalign工具位于android-sdk\tools目录,源码位于Android系统源码的build\tools\zipalign目录
2.Apk的打包过程流程图
3.打包过程中用到的工具
名称
功能介绍
在操作系统中的路径
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
4.手动实现编译和打包
Win7环境首选创建工程
使用eclipse新建一个工程handpackTest
android create project -n HandPackTest -t 1 -k com.snowtest -a HandPackTest -p ./HandPackTest
1、使用aapt命令编译资源文件
[1] 在HandPackTest目录新建gen然后cd到HandPackTest目录输入下面命令
aapt package -f -m -J gen -S res -I D:/run_ProgramFile/android_sdk_new/platforms/android-19/android.jar -M AndroidManifest.xml
这里的命令参数有点多就不全部介绍了,就说明几个:
-J 后面跟着是gen目录,也就是编译之后产生的R类,存放的资源Id
-S 后面跟着是res目录,也就是需要编译的资源目录
-l 后面跟着是系统的库,因为我们在项目资源中会用到系统的一些资源文件,所以这里需要链接一下
-M 后面跟着是工程的清单文件,需要从这个文件中得到应用的包名,然后产生对应的R文件和包名。
生成文件:将多出一个文件HandPackTest\gen\com\snowtest\R.java
[2]在HandPackTest目录新建assets目录然后cd到HandPackTest目录输入下面命令
使用aapt命令生成资源包文件(编码AndroidManifest.xml,resource.arsc等)
aapt package -f -A assets -S res -I D:/run_ProgramFile/android_sdk_new/platforms/android-19/android.jar -M AndroidManifest.xml -F bin/handpackTest
生成文件:/bin/handpackTest其实此文件是res和AndroidManifest.xml和resources.arsc的编译后的压缩文件,可以用好压解压
这个命令其实就是将资源文件进行编码成二进制文件,我们之前介绍的一篇文章中,就是解析这些二进制文件:
这些二进制文件都是有自己的格式的,系统编程二进制文件是为了优化,减小包的大小。
但是这里需要注意的是assets目录是不会进行二进制编译的。
2、此工程不存在,省去
3.使用javac命令编译源文件
javac -target 1.7 -bootclasspath D:/run_ProgramFile/android_sdk_new/platforms/android-19/android.jar -d bin gen\com\snowtest\*.java src\com\snowtest\*.java
-target:表示编译之后的class文件运行的环境版本
-bootclasspath:表示编译需要用到的系统库
-d:表示编译之后的class文件存放的目录 这里需要把gen下和src下面的java都编译了。
生成文件:\bin\com\snowtest目录大量的文件
4.使用dx命令,将class文件转化成dex
D:\run_ProgramFile\android_sdk_new\build-tools\19.0.0\dx --dex --output=bin/classes.dex bin
生成文件:\bin目录下生成classes.dex文件
5.使用apkbuilder命令来编译
apkbuilder在android sdk build tools r22里面被移除了,发现其实是调用androidsdk根目录/tools/lib/sdklib.jar这个jar包,
解决办法windows上
把\android_sdk_new\tools\android.bat文件复制一份改名为apkbuilder.bat
然后修改apkbuilder.bat里面的com.android.sdkmanager.Main为 com.android.sdklib.build.ApkBuilderMain就可以了
apkbuilder E:/apk从启动到运行全解/1.apk生成过程/HandPackTest/bin/handpackTest.apk -v -u -z E:/apk从启动到运行全解/1.apk生成过程/HandPackTest/bin/handpackTest -f E:/apk从启动到运行全解/1.apk生成过程/HandPackTest/bin/classes.dex -rf E:/apk从启动到运行全解/1.apk生成过程/HandPackTest/src
生成文件:\bin目录下生成handpackTest.apk文件
6.使用keytool来产生一个keystore文件
Keytool在jdk目录
keytool -genkey -keystore snowtest.keystore -keyalg RSA -validity 10000 -alias snowtest.keystore
回车之后会要求输入密码和各种信心最后生成一个snowtest.keystore文件
-genkey 产生证书文件
-keystore 指定密钥库的.keystore文件中
-keyalg 指定密钥的算法
-validity 为证书有效天数,这里我们写的是10000天。
-alias 产生别名
7.使用jarsigner签名apk文件
jarsigner -verbose -keystore snowtest.keystore -signedjar handpackTest_signed.apk handpackTest.apk snowtest.keystore
以上命令的说明:
-verbose:指定生成详细输出
-keystore:指定数字证书存储路径
-signedjar:该选项的三个参数为 签名后的apk包 未签名的apk包 数字证书别名
注意有效期哦。
参考: android软件安全与逆向分析
- 深入android源码---apk生成过程综述
- android程序自动化生成apk的过程
- android程序自动化生成apk的过程
- Android原理揭秘之APk生成过程
- android程序自动化生成apk的过程
- Android apk生成过程(超级简单)
- android apk安装过程源码解析
- Android APK安装过程源码解析
- android apk安装过程源码解析
- 从Android源码到apk——apk打包过程
- Android APK 生成APK签名过程和反解压(安装)过程详解
- 【转载】如何生成Android apk签名文件及签名过程
- Android的编译与运行,APK的生成过程
- Kivy A to Z -- Android apk的生成过程
- Android 4.4 apk安装到桌面生成icon过程
- 使用Ant打包Android应用——apk生成过程
- 编译android源码apk是否生成odex方法
- 编译android源码apk是否生成odex方法
- 10年软件测试工作总结
- java逆时针螺旋输出矩阵
- JS数组的去重与降维
- 批量创建neo4j中的节点的时候,如果需要用到现有的节点需要使用with连接起来
- Ubuntu Android OpenJDK 1.6、1.7、1.8、1.9下载安装
- 深入android源码---apk生成过程综述
- 解决IOS滑动触发Body的滑动
- android客户端首次进入轮播引导图(亖)
- Gridview 关于添加静态数据的快速方法
- Java SE学习笔记:File类、IO流以及他们的经典案例
- show ip vrf interfaces --check 检查接口加入的 vrf 配置
- 播放音乐
- Android Notification使用
- 设计模式——单例模式(Singleton)