Cordova android打包升级更新流程
Android app 的打包流程大致分为 build , align , sign 三部分。
build
build 是构建 APK 的过程,分为 debug 和 release 两种。release 是发布到应用商店的版本。
- debug:
cordova build android
如果成功的话,你可以在你项目下的 platforms/android/app/build/outputs/apk/debug 目录下看到一个app-debug.apk的文件。
- release:
cordova build android --release
如果成功,你可以在你项目下的 platforms/android/app/build/outputs/apk/release/ 目录下看到一个 android-release-unsigned.apk 的文件。
align
我们可以使用zipalign工具对安装包进行对齐优化,这样能够让应用程序和整个系统运行得更快。 zipalign使用了4字节的边界对齐方式来影射内存,通过空间换时间的方式提高执行效率。
- 对apk对齐优化 将签名的apk放到zipalign.exe所在的文件夹(找不到的话可以电脑搜索一下)
执行命令:
zipalign -f -v 4 app-release-unsigned.apk sunfoundercontroller-align.apk
| 参数 | 作用 |
|---|---|
| -f | 代表覆盖存在的输出文件 |
| -v | 代表详细输出 |
| 4 | 代表对齐为4个字节 |
| app-release-unsigned.apk | 需要优化的APK |
| sunfoundercontroller-align.apk | 优化后的APK |
- 检查apk有没有zipalign对齐 执行命令:
zipalign -c -v 4 被检查的apk文件
注意:zipalign可以在V1签名后执行,但zipalign不能在V2签名后执行,只能在V2签名之前执行!!!
sign
签名之前你得有一个数字签名文件( .keystore),打包升级要用回之前发布的秘钥,之后借助签名工具jarsigner或apksigner签名。
jarsigner
jarsigner是JDK提供的针对jar包签名的通用工具,位于JDK/bin/jarsigner.exe
- 对apk签名:
jarsigner -verbose -keystore D:\stjc\sunfounderControllerPrivatekey\mydemo.keystore -signedjar D:\stjc\sunfounderControllerPrivatekey\apk\sunfoundercontroller-release.apk D:\stjc\sunfounderControllerPrivatekey\apk\app-release-unsigned.apk mydemo.keystore
| 参数 | 作用 |
|---|---|
| -verbose[:suboptions] | 签名/验证时输出详细信息。子选项可以是 all, grouped 或 summary |
| -keystore | 密钥库位置 |
| -signedjar | 已签名的 JAR 文件的名称 |
- 验证签名是否成功
jarsigner -verify my_application_signed.apk
apksigner
apksigner是Google官方提供的针对Android apk签名及验证的专用工具,位于Android SDK/build-tools/SDK版本/apksigner.bat
从Android 7.0开始, 谷歌增加新签名方案 V2 Scheme (APK Signature);但Android 7.0以下版本, 只能用旧签名方案 V1 scheme (JAR signing)。
- V1和V2签名的区别:
V1签名:来自JDK(jarsigner), 对zip压缩包的每个文件进行验证, 签名后还能对压缩包修改(移动/重新压缩文件),对V1签名的apk/jar解压,在META-INF存放签名文件(MANIFEST.MF, CERT.SF, CERT.RSA), 其中MANIFEST.MF文件保存所有文件的SHA1指纹(除了META-INF文件), 由此可知: V1签名是对压缩包中单个文件签名验证。
V2签名:来自Google(apksigner), 对zip压缩包的整个文件验证, 签名后不能修改压缩包(包括zipalign),对V2签名的apk解压,没有发现签名文件,重新压缩后V2签名就失效, 由此可知: V2签名是对整个APK签名验证。
V2签名优点很明显:
①签名更安全(不能修改压缩包)
②签名验证时间更短(不需要解压验证),因而安装速度加快
注意: apksigner工具默认同时使用V1和V2签名,以兼容Android 7.0以下版本
- 对apk签名:
apksigner sign --ks mydemo.keystore --ks-key-alias mydemo.keystore --v1-signing-enabled true --v2-signing-enabled true sunfoundercontroller-align.apk
| 参数 | 作用 |
|---|---|
| --ks filename | 签名者的私钥和证书链包含在给定的基于 Java 的密钥库文件中。如果文件名设为 "NONE",则包含密钥和证书的密钥库不需要指定文件,某些 PKCS#11 密钥库就是这种情况。 |
| --ks-key-alias alias | 表示签名者在密钥库中的私钥和证书数据的别名的名称。如果与签名者关联的密钥库包含多个密钥,则必须指定此选项。 |
| --v1-signing-enabled true/false | 表示签名者在密钥库中的私钥和证书数据的别名的名称。如果与签名者关联的密钥库包含多个密钥,则必须指定此选项。 |
| --v2-signing-enabled true/false | 确定 apksigner 是否会使用 APK 签名方案 v2 为给定的 APK 软件包签名。默认情况下,该工具会使用 --min-sdk-version 和 --max-sdk-version 的值来决定何时采用此签名方案。 |
更多参数请参考:developer.android.com/studio/comm…
一些错误
解析包时出现错误
(1)安卓apk程序解析包出现问题的话,可能是由于你下载的apk程序本身就有问题,程序的压缩包可能在下载过程中被损坏了,建议请重新下载一次。
(2)如果重新下载也解决不了安卓解析包出现问题的话,很大一个可能就是在于你的手机的配置参数不支持这款软件,举个例子吧,如果一款apk程序的系统版本要求在安卓2.2以上,而你的手机则是安卓2.1系统,就会出现“解析包时出现问题”这样的解析错误。
(3)apk版本不兼容。一般情况下当从网上下载的apk程序版本比当前设备的版本高时,就会在安装程序时出现“解析包时出现错误”的警告。
(4)apk程序不完整。有些设备自带的下载工具不具有断点续传功能,因而下载的程序可能发生下载不完全、程序部分先失等情况。对于这类问题,建议重新下载正版完整的安装包文件。
(5)当前设备不支持中文名称或路径,不支持长文件名。解决办法是将文件重命名,名称只包含英文字母(但要注意".apk"的后辍名是要保留的),如更名为“abc.apk”等,更改完成后再次运动安装程序。
如果是apk版本太高的话,修改一下platforms/android/build.gradle文件下的defaultMinSdkVersion