成都网站建设设计

将想法与焦点和您一起共享

android打包,android打包apk

Android打包流程

官方详细:

成都创新互联公司主营嫩江网站建设的网络公司,主营网站建设方案,app开发定制,嫩江h5微信小程序开发搭建,嫩江网站营销推广欢迎嫩江等地区企业咨询

ps:打包前做好config.xml配置如包名

一、添加android平台

添加之后,在项目目录的platforms下会生成一个android文件夹。

二、cordova编译应用

使用build命令编译应用的发布版本,这个过程需要你的android sdk和环境变量、java jdk和环境变量、android的gradle配置没有错误。

编译成功之后,在项目路径platforms/android/build/outputs/apk/android-release-unsigned.apk未签名文件,这个时候的apk还不能被安装到手机上。

三、生成签名文件

输入的密码要记住,其他姓名地区等信息随便填吧,最好还是记住,成功之后在主目录下就生成了 jhy-release-key.keystore 文件,命令中jhy-release-key.keystore是生成文件的名字, alias_jhy 是别名,随便起但是要记住,一会签名要用到,其他信息如加密、有效日期等就不说了,无需改动。

生成后会提示:

JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore jhy-release-key.jks -destkeystore jhy-release-key.jks -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

执行命令:

执行结果: Warning: 已将 "jhy-release-key.jks" 迁移到 Non JKS/JCEKS。将 JKS 密钥库作为 "jhy-release-key.jks.old" 进行了备份。

四、签名应用文件

把在第二步生成的android-release-unsigned.apk拷贝到与生成的jhy-release-key.jks同一目录下,也就是项目的主目录下,执行命令:

输入签名文件的密码,成功之后主目录下的android-release-unsigned.apk就被签名成功了,会比原来未被签名的apk文件大一点,能够安装到手机或android虚拟机上了。

签名完成后会提示没有时间戳,忽略即可

检测是否签名成功:

也可用以下命令签名并生成新apk文件

Android简单的打包配置

在android studio中的打包,通常使用以下两个选项之一,两个方式都可以构建出apk包

这两个有什么区别?

概括一句话:根据gradle中现有的签名配置进行自动签名打包

通常debug和dev环境是系统自行配置的debug-sing签名,不需要手动进行配置,但是release环境是对外发布的环境,必须要求手动在gradle中进行签名配置才可以打包(后边说)

所以在gradle配置好了签名的情况下,直接点击 Build APK(s) 就可以进行打包

一句话概括:通过手动选择签名文件进行签名打包

这种方式则不需要在gradle中进行配置,直接选择你已经创建好的签名文件,输入对应的密码等信息,就可以进行打包

然后就可以进行打包了

debug 和 dev 等测试/开发环境 因为系统自动配置了debug-sing 可以直接使用 Build APK(s) 进行打包。

但是release环境需要对外发布,所以需要手动在gradle中进行签名配置才可以使用 Build APK(s) ,或着自己选择 Generate Signed Bundle or APK 通过签名文件进行打包(效果和gradle中配置好了签名文件完全相同)

那么就有以下两个问题:

在 Generate Signed Bundle or APK 中选择 Create new ...

在module的gradle.android中输入:

然后在配置环境的buildTypes中,想使用 signingConfigs 签名配置的环境加上一句话: signingConfig signingConfigs.release

这样,就在gradle中配置好了签名,可以直接使用 Build APK(s) 进行打包

注意这里的 minifyEnabled true 也就是要使用混淆文件(一般测试环境为false 编译更快)。如果release环境打包,没有配置好混淆文件的话,会导致apk安装之后,秒退。(如果没有签名强行打包,则无法安装)

Android 打包流程

打包后的apk是一个压缩包,解压之后,内容如下:

详细可参考 apk签名原理

无论我们怎么配置gradle文件去自定义打包,但是都是要走上图所画的七个流程。七个深绿色的椭圆代表了七个不可或缺的打包步骤,并且每一个步骤都一个打包工具

所用到的工具:

zipalign 字节对齐:

为什么要以4字节整数倍为起始偏移?

在文件对齐后, 就可以使用mmap来直接读写apk文件

mmap映射

上面涉及到的Android打包流程是以gradle task链的形式串联起来的。

下面看一下常见的task

我可以想到的:

Transform API

android app 打包流程

App 打包

aapt是android中的资源打包工具,打包资源就用它。

打包大致流程:

aapt把resources目录下的资源生成R.java文件,并为AndroidManifest.xml生成Manifest.java类。

aidl把项目中自定义的aidl文件生成对应的java类。

JavaCompiler把所有的Java源文件编译成class文件,包括:aapt生成的、aidl生成的、项目中自有的java源文件

使用proguard混淆,并生成一个proguardMapping.xml文件(可选项:可以混淆也可以不混淆)

使用dex工具把所有的class文件生成.dex文件

使用aapt资源打包工具把resources、assets目录下的资源打包成一个_ap文件

使用apkbuilder把所有的dex、_ap文件、AndroidManifest.xml文件打包成一个未签名的apk

使用jarsinger生成一个签名过的apk包

使用zipalign工具对要发布的apk文件进行对齐操作,以便在运行时节约内存。

Android的编译打包流程详解

下图的是官网对于Android编译打包流程的介绍。

官方的介绍非常笼统,简而言之,其大致流程就是:

编译--DEX--打包--签名和对齐

(好像什么都没Get到,有一种意犹未尽的感觉……)

来一张外国大神的图片(注:这张图少了签名的步骤)

用文字解释一下上图的流程:

首先,我们整理一下编译的输入部分是什么(图中黄色部分):

接下来的步骤:

好了,编译打包的详细流程说完了,接下来我们看看是否能回答开篇的那些问题。

答:aapt工具对于每个资源文件生成了唯一的ID,这些ID保存在R.java文件中。如下是R.java文件的内容:

资源ID是一个4字节的无符号整数,在R.java文件中用16进制表示。其中,最高的1字节表示Package ID,次高1个字节表示Type ID,最低2字节表示Entry ID。

只有一个ID如何能引用到实际资源呢?实际上aapt工具还生成了一个文件resources.arsc,相当于一个资源索引表,或者你理解成一个map也行,map的key是资源ID,value是资源在apk文件中的路径。resources.arsc里面还有其他信息,这个就不多说了。

通过R.java文件和resources.arsc配合,就能引用到实际的资源文件。

答:第7步已经阐述了对齐所做的工作,为什么要进行对齐,这是为了加快资源的访问速度。如果每个资源的开始位置都是上一个资源之后的 4*n字节,那么访问下一个资源就不用遍历,直接跳到4*n字节处判断是不是一个新的资源即可。

如果举例子,那么对齐有点类似于资源数组化,数组的访问速度当然比链表快。

答:xml里面都是各种字符,不利于快速遍历。编译成二进制文件,用数字替换各种符号,一方面能快速访问,另一方面也能减少大小。


网站名称:android打包,android打包apk
本文链接:http://chengdu.cdxwcx.cn/article/pheecj.html