Android应用程序(APK)的编译打包过程

流程图:

我们重点关心的是(1)这个过程的输入是什么?(2)这个过程的输出是什么?(3)这个过程使用了什么工具?至于使用什么参数,可以自己去看对应命令的帮助文件,或者在网上搜索,这不是本文的重点。

aapt->

aidl -> javac-> dx(dex)-> apkbuilder-> jarsigner-> zipalign 

步骤中提到的工具如下表:

名称 功能介绍 在操作系统中的路径
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

第一步:打包资源文件,生成R.java文件

编译R.java类需要用到AndroidSDK提供的aapt工具,aapt参数众多,以下是主要参数:

-d one or more device assets to include, separated by commas
 -f force overwrite of existing files
 -g specify a pixel tolerance to force images to grayscale, default 0
 -j specify a jar or zip file containing classes to include
 -k junk path of file(s) added
 -m make package directories under location specified by -J
 -u update existing packages (add new, replace older, remove deleted files)
 -v verbose output
 -x create extending (non-application) resource IDs
 -z require localization of resource attributes marked with
 localization="suggested"
 -A additional directory in which to find raw asset files
 -G A file to output proguard options into.
 -F specify the apk file to output
 -I add an existing package to base include set
 -J specify where to output R.java resource constant definitions
 -M specify full path to AndroidManifest.xml to include in zip
 -P specify where to output public resource definitions
 -S directory in which to find resources. Multiple directories will be scann 

aapt编译R.java文件具体如下:

需要进入应用程序目录,新建一个gen目录,没有gen目录,命令将会出现找不到文件的错误!

命令成功执行后将会在gen目录下生成成包结构的目录树,及R.java文件!

列子:

第二步:处理AIDL文件,生成对应的.java文件(当然,有很多工程没有用到AIDL,那这个过程就可以省了)

将.aidl文件生成.java文件需要用到AndroidSDK自带的aidl工具,此工具具体参数如下:

-I<DIR> search path for import statements.
-d<FILE> generate dependency file.
-p<FILE> file created by --preprocess to import.
-o<FOLDER> base output folder for generated files.
-b fail when trying to compile a parcelable. 

值得注意的是:这个工具的参数与参数值之间不能有空格,Google也有对工资不满意的工程师!

例子:

第三步:编译Java文件,生成对应的.class文件

javac命令用法如下:

其中,可能的选项包括:

 -g  生成所有调试信息
 -g:none  不生成任何调试信息
 -g:{lines,vars,source} 只生成某些调试信息
 -nowarn  不生成任何警告
 -verbose  输出有关编译器正在执行的操作的消息
 -deprecation 输出使用已过时的 API 的源位置
 -classpath <路径> 指定查找用户类文件和注释处理程序的位置
 -cp <路径>  指定查找用户类文件和注释处理程序的位置
 -sourcepath <路径> 指定查找输入源文件的位置
 -bootclasspath <路径> 覆盖引导类文件的位置
 -extdirs <目录> 覆盖安装的扩展目录的位置
 -endorseddirs <目录> 覆盖签名的标准路径的位置
 -proc:{none,only} 控制是否执行注释处理和/或编译。
 -processor <class1>[,<class2>,<class3>...]要运行的注释处理程序的名称;绕过默认的搜索进程
 -processorpath <路径> 指定查找注释处理程序的位置
 -d <目录>  指定存放生成的类文件的位置
 -s <目录>  指定存放生成的源文件的位置
 -implicit:{none,class} 指定是否为隐式引用文件生成类文件
 -encoding <编码> 指定源文件使用的字符编码
 -source <版本> 提供与指定版本的源兼容性
 -target <版本> 生成特定 VM 版本的类文件
 -version  版本信息
 -help  输出标准选项的提要
 -Akey[=value] 传递给注释处理程序的选项
 -X  输出非标准选项的提要
 -J<标志>  直接将 <标志> 传递给运行时系统 

例子:

javac -encoding utf-8 -target 1.5 -bootclasspath E:\Androiddev\android-sdk-windows2.2\platforms\android-3\android.jar -d bin src\com\byread\reader\*.java gen\com\byread\reader\R.java 

第四步:把.class文件转化成Davik VM支持的.dex文件

将工程bin目录下的class文件编译成classes.dex,Android虚拟机只能执行dex文件!

例子:

第五步:打包生成未签名的.apk文件

【输入】打包后的资源文件、打包后类文件(.dex文件)、libs文件(包括.so文件,当然很多工程都没有这样的文件,如果你不使用C/C++开发的话)

【输出】未签名的.apk文件

【工具】apkbuilder工具

apkbuilder工具用法如下:

-v Verbose.
-d Debug Mode: Includes debug files in the APK file.
-u Creates an unsigned package.
-storetype Forces the KeyStore type. If ommited the default is used.
-z Followed by the path to a zip archive.
 Adds the content of the application package.
-f Followed by the path to a file.
 Adds the file to the application package.
-rf Followed by the path to a source folder.
 Adds the java resources found in that folder to the application
 package, while keeping their path relative to the source folder.
-rj Followed by the path to a jar file or a folder containing
 jar files.
 Adds the java resources found in the jar file(s) to the application
 package.
-nf Followed by the root folder containing native libraries to
 include in the application package.<span style="color: rgb(0, 0, 255); font-family: 楷体; line-height: 20px;font-size:18px; ">I:最后一步,通过jarsigner命令用证书文件对未签名的APK文件进行签名</span>

列子:

apkbuilder ${output.apk.file} -u -z ${packagedresource.file} -f ${dex.file} -rf ${source.dir} -rj ${libraries.dir} 

第六步:对未签名.apk文件进行签名

【输入】未签名的.apk文件

【输出】签名的.apk文件

【工具】jarsigner

用法:jarsigner [选项] jar 文件别名
jarsigner -verify [选项] jar 文件
[-keystore <url>]      密钥库位置
[-storepass <口令>]     用于密钥库完整性的口令
[-storetype <类型>]     密钥库类型
[-keypass <口令>]      专用密钥的口令(如果不同)
[-sigfile <文件>]      .SF/.DSA 文件的名称
[-signedjar <文件>]     已签名的 JAR 文件的名称
[-digestalg <算法>]  摘要算法的名称
[-sigalg <算法>]    签名算法的名称
[-verify]          验证已签名的 JAR 文件
[-verbose]         签名/验证时输出详细信息
[-certs]          输出详细信息和验证时显示证书
[-tsa <url>]        时间戳机构的位置
[-tsacert <别名>]      时间戳机构的公共密钥证书
[-altsigner <类>]      替代的签名机制的类名
[-altsignerpath <路径列表>] 替代的签名机制的位置
[-internalsf]        在签名块内包含 .SF 文件
[-sectionsonly]       不计算整个清单的散列
[-protected]        密钥库已保护验证路径
[-providerName <名称>]   提供者名称
[-providerClass <类>    加密服务提供者的名称
[-providerArg <参数>]] ... 主类文件和构造函数参数

第七步:对签名后的.apk文件进行对齐处理(不进行对齐处理是不能发布到Google Market的)

【输入】签名后的.apk文件

【输出】对齐后的.apk文件

【工具】zipalign工具

知道了这些细节之后,我们就可以实现很多我们想实现东西了,比如:自动化,我们可以使用某种脚本,像Windows下的批处理,linux下的Bash,Java下的Ant,Python、Perl这样的脚本语言,甚至直接用Java、.net这们的强类型语言也是可以的。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持我们!

(0)

相关推荐

  • 解析Android中webview和js之间的交互

    1.android中利用webview调用网页上的js代码.Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true,,然后通过loadUrl就可以直接进行调用,如下所示:mWebView.getSettings().setJavaScriptEnabled(true);mWebView.loadUrl("javascript:test()"); 2. 网页上调用android中java代码的方法在网页中

  • Android获取apk签名指纹的md5值(防止重新被打包)的实现方法

    本文实例讲述了Android获取apk签名指纹的md5值以防止重新被打包的实现方法.分享给大家供大家参考,具体如下: 做个记录(这里只是Java层的签名校验,java层容易被破解,我建议apk加固下) 获取md5值来进行Apk签名校验, 可以防止apk重新被打包. 下面我说说怎么获取apk签名的md5值(有三种方法) 1.用代码获取签名指纹的md5值 /** * MD5加密 * @param byteStr 需要加密的内容 * @return 返回 byteStr的md5值 */ public

  • Android编程实现webview将网页打包成apk的方法

    本文实例讲述了Android编程实现webview将网页打包成apk的方法.分享给大家供大家参考,具体如下: 功能非常简单,而且乍一看没什么特别大的用处,因为实际上就是浏览器而已...但如果说网页一开始就是针对手机开发的呢?是不是可以将android的开发转变为网页的开发了?有待研究,不过据说也可以用这种方法将html5打包哦,先记录一下可能以后也可以赶下潮流. public class MainActivity extends Activity { private WebView webvie

  • android WebView加载html5介绍

    Android设备多分辨率的问题 Android浏览器默认预览模式浏览 会缩小页面 WebView中则会以原始大小显示 Android浏览器和WebView默认为mdpi.hdpi相当于mdpi的1.5倍 ldpi相当于0.75倍 三种解决方式:1 viewport属性 2 CSS控制 3 JS控制 1 viewport属性放在HTML的<meta>中 Html代码 复制代码 代码如下: <SPANstyle="FONT-SIZE: x-small"> <

  • Android Studio打包.so库到apk中实例详解

    Android Studio打包.so库到apk中实例详解 由于在原来的ADT的Eclipse环境中,用ndk_build工具生成了相应的各个.so库文件之后,eclipse工具就会自动把这些库导入到apk中.而Android Studio目前为止(1.1.0版本)还无法做到那么自动,但是我们可以通过以下方式进行. 首先在Android Studio工程的app目录下创建整个jni目录,jni目录里写Android.mk.Application.mk以及各类C/C++和汇编源文件.然后跟原来一样

  • Android使用WebView播放flash的方法

    本文实例讲述了Android使用WebView播放flash及判断是否安装flash插件的方法.分享给大家供大家参考.具体实现方法如下: 一.问题: 最近帮一个同学做一个项目,断断续续的一些知识点记录一下.一个页面中有一个WebView,用来播放swf,如果系统中未安装flash插件,必须提示用户到market中安装. 二.解决方法: 下面做一个demo,效果图如下: 图1: 图2: 图3: 首先布局文件,很简单: 复制代码 代码如下: <RelativeLayout xmlns:android

  • Android 数据库打包随APK发布的实例代码

    其实很简单,就是把我们的数据库文件放到我们的手机里,所以不必局限在哪个地方写这个代码,在第一次创建数据库的时候可以,我觉得在软件起动页里效果更好一点,首先我们应该把事先写好的数据库文件比如 test.db放到res文件夹里的raw文件夹里,也可以放到assets里,因为这两个文件夹不会在生成APK的时候不会被压缩. 1,DataBaseUtil用于将raw中的db文件copy到手机中,代码如下 复制代码 代码如下: import java.io.File;import java.io.FileO

  • android中webview控件和javascript交互实例

    当我们要实现丰富的图文混排效果的时候,我们一般会使用webview,这是一个功能十分强大的的控件,来看看官方的解释: 复制代码 代码如下: A View that displays web pages. This class is the basis upon which you can roll your own web browser or simply display some online content within your Activity. It uses the WebKit

  • Android应用开发之将SQLite和APK一起打包的方法

    在 Eclipse 里新建好工程后,默认会有一个assets目录,在 Eclipse 中直接将准备好的 SQLite 数据库复制到该目录中,然后在主 Activity 里面编码: package com.test.db; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEn

  • Android开发apk反编译和二次打包教程

    作为Android开发者,工作中少不了要反编译别人的apk,当然主要目的还是为了学习到更多,取彼之长,补己之短.今天就来总结一下Android反编译和二次打包的一些知识.首先声明本文的目的是为了通过例子讲解反编译和二次打包的原理和方法,继而作为后续讲解防止二次打包和App安全的依据,并不是鼓励大家去重新打包别人的App,盗取他人劳动成果. 本文首先介绍几种Android反编译工具的使用,然后实现在不需要知道源代码的情况下,仅通过修改反编译得到的smali文件实现修改apk逻辑功能的目的. And

  • Android APK使用Debug签名重新打包 Eclipse更改默认Debug签名

    对已有的apk文件进行重新打包,前面 Android签名机制:生成keystore.签名.查看签名信息 已经介绍了.本文介绍另外两种需求. 使用默认的Debug签名打包 如果直接使用Eclipse开发新程序,默认就会被打上Debug的签名,这个是地球人皆知,但是如果你是想Repack别人并且想使用Debug签名该怎么办? 首先需要找到你本机的默认签名的,一般位于C:\Users\用户名\.android\debug.keystore下,拷出来,然后打包,打包命令: 复制代码 代码如下: jars

随机推荐