官方详细:
成都创新互联公司主营嫩江网站建设的网络公司,主营网站建设方案,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 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安装之后,秒退。(如果没有签名强行打包,则无法安装)
打包后的apk是一个压缩包,解压之后,内容如下:
详细可参考 apk签名原理
无论我们怎么配置gradle文件去自定义打包,但是都是要走上图所画的七个流程。七个深绿色的椭圆代表了七个不可或缺的打包步骤,并且每一个步骤都一个打包工具
所用到的工具:
zipalign 字节对齐:
为什么要以4字节整数倍为起始偏移?
在文件对齐后, 就可以使用mmap来直接读写apk文件
mmap映射
上面涉及到的Android打包流程是以gradle task链的形式串联起来的。
下面看一下常见的task
件
我可以想到的:
Transform API
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编译打包流程的介绍。
官方的介绍非常笼统,简而言之,其大致流程就是:
编译--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里面都是各种字符,不利于快速遍历。编译成二进制文件,用数字替换各种符号,一方面能快速访问,另一方面也能减少大小。