1. 编译打包安卓APK
ionic cordova build android --release --prod
2. 生成签名 keystore
keytool -genkey -v -keystore app.keystore -alias app.keystore -keyalg RSA -validity 36500
之后按照提示,一步一步输入姓名、公司、省市等信息。
3. 使用 jarsigner 给第一步生成好的 apk 进行签名
jarsigner -verbose -keystore app.keystore -signedjar E:\myapp.apk E:\test\platforms\android\build\outputs\apk\myapp-release-unsigned.apk app.keystore
至此,APK打包签名完毕。
为了方便起见,可以写个批处理脚本,方便下次直接打包(第2步需要手动执行,只需要做一次就行了)
@echo off
echo packaging apk......
rd /s /q www
@call ionic cordova build android --prod --release
echo signing apk......
@call jarsigner -verbose -keystore app.keystore -storepass mypassword -signedjar www/app-release-signed.apk platforms/android/build/outputs/apk/android-release-unsigned.apk app.keystore
echo signed apk stored in www/app-release-signed.apk
pause
Ionic4 每次编译时自动更新版本号
需求:版本号定义为 x.x.x.x,第四位为编译版本号,每次编译时取当前时间。
Ionic4 中实现这个功能相对比较简单,就是写一个 hook 函数,来完成这件事情即可。
首先在 ionic.config.json 文件中声明 hook:"build:before": "./config/build-before.js"
{
"name": "app",
"integrations": {
"cordova": {}
},
"type": "angular",
"hooks": {
"build:before": "./config/build-before.js"
}
}
然后相应的编写 build-before.js 代码,即 nodejs 的代码文件
const fs = require('fs');
module.exports = (ctx) => {
if (ctx.build && ctx.build.configuration && ctx.build.configuration === "production") {
console.log("production build: performing version bump...");
// update package.json:
let packageJSON = JSON.parse(fs.readFileSync('package.json', 'utf-8').toString());
let versionArray = packageJSON.version.split(".");
let now = new Date();
let year = now.getFullYear().toString().substr(2, 2);
let month = (now.getMonth() + 1).toString();
if (month.length === 1) {
month = '0' + month;
}
let day = now.getDate().toString();
if (day.length === 1) {
day = '0' + day;
}
let hour = now.getHours().toString();
if (hour.length === 1) {
hour = '0' + hour;
}
let minute = now.getMinutes().toString();
if (minute.length === 1) {
minute = '0' + minute;
}
let lastVersion = year + month + day + hour + minute;
versionArray[3] = lastVersion;
packageJSON.version = versionArray.join('.');
fs.writeFileSync('package.json', JSON.stringify(packageJSON, null, "\t"), 'utf-8');
console.log("package.json app version updated");
let configXmlData = fs.readFileSync('config.xml', 'utf-8');
configXmlData = configXmlData.replace(/id="com.ankon.app" version=".*"/, `id="com.ankon.app" version="${packageJSON.version}"`);
fs.writeFileSync('config.xml', configXmlData,'utf-8');
console.log("config.xml app version updated");
};
};
注意:
1. 这里限制了只有 build prod 的时候才做第四位版本号自动更新的事情。
2. 修改 config.xml 中的版本号的时候,正则表达式注意修改成你自己的 appId。