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。