如何使用 gulp 为离子应用程序设置 APK 自动打包

How to set up automated packaging of APK for ionic application using gulp

我将 gulp 与我的离子应用程序一起用于自动化。我已经设置了一个 gulp 进程来缩小我的 JS、CSS、HTML 文件并创建一个构建目录。所以基本上我需要创建 android APK 但为此我必须做以下事情

  1. 使用 gulp 命令创建构建文件夹 www
  2. 执行命令创建发布版本:ionic cordova build --release android
  3. 使用 jarsigner 命令对 APK 进行签名:jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore HelloWorld-release-unsigned.apk alias_name

我的 APK 终于准备就绪,我通过使用附加版本参数更新它的名称,将它复制到今天的日期文件夹中的某个位置。 当我们需要更频繁地构建以交付 QA 时,这非常耗时。

我现在关心的是如何仅使用 gulp 过程一次性创建部署就绪的签名 APK?

我开发了一个很棒的解决方案,可以利用可用的方法和 google.

的一些不错的链接来动态创建已签名的 APK。

一步步来

步骤 1.

准备好 gulp 过程,该过程缩小并复制构建目录中的所有 CSS、JS、HTML 文件,即 www 和验证 android 平台已添加到项目中。

步骤 2.

使用以下命令生成 keystore 应用程序

keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048

将此 keystore 复制到您的项目根目录。

步骤 3.

在项目的根目录中创建名为 build.json 的新文件,并在其中添加以下行。设置您在创建 keystore

时输入的 keystore 名称和密码详细信息
{
    "android": {
        "debug": {
            "keystore": "AnyName.keystore",
            "storePassword": "password",
            "alias": "AnyAliasName",
            "password" : "password",
            "keystoreType": ""
        },
        "release": {
            "keystore": "AnyName.keystore",
            "storePassword": "password",
            "alias": "AnyAliasName",
            "password" : "password",
            "keystoreType": ""
        }
    }
}

步骤 4.

gulpfile.js

中添加代码之前安装以下 gulp 插件
npm install --save-dev gulp-cheerio  
npm install --save-dev gulp-util 
npm install --save-dev gulp-if  
npm install --save-dev run-sequence 
npm install --save-dev gulp-rename
npm install --save-dev yargs

步骤 5.

gulpfile.js中添加以下代码用于创建APK并将其复制到今天的日期目录并重命名。添加以下代码后,请将 build_app & release_task gulp 任务添加到默认 gulp 过程。

    var if = require('gulp-if');
    var runSequence = require('run-sequence');
    var rename = require('gulp-rename');

    // This plugin used to read XML file
    var cheerio = require('gulp-cheerio');

    // This is gulp utility plugin
    var util = require("gulp-util");

    // Used for executing any command line command
    var exec = require('child_process').exec;

    /**
     * Command line options - defines whether this is a dev or release build
     * e.g gulp -r or gulp -d. (gulp --release or gulp --develop)
     * By default, just running 'gulp' is the same as running 'gulp -d'
     */
    var args = require('yargs')
      .alias('r', 'release')
      .alias('d', 'develop')
      .default('release', false)
      .argv;

    var release = args.release;
    // Used to create directory with today's date
    var releaseDirName = util.date('dd-mmm-yyyy');

    // Default path where signed apk is created
    APK_PATH = './platforms/android/build/outputs/apk/android-release.apk'

    APK_NAME = "<YOUR_APP_NAME>";

    // The following popup is used to give popup notification in windows when APK is ready
    var WINDOWS_POPUP = "msg * MESSAGE";

    // This command creates the signed APK using configuration in build.json
    var ANDROID_SIGNED_APK_COMMAND = 'cordova build android --release --buildConfig';

    /**
     * Create signed APK
     */
    gulp.task('build_app', function (cb) {
        if(args.signedAPK){
            console.log('Building signed apk...');
            exec(ANDROID_SIGNED_APK_COMMAND,
            {
                cwd : './',
                maxBuffer: 1024 * 1024
            },
             function (err, stdout, stderr) {
                console.log(stdout);
                console.log(stderr);
                cb(err);
            });
        }
    }


    /**
     * Common function for executing commands
     * @param cmd
     * @param cb
     * @returns
     */
    function execCMD(cmd, cb){
        exec(cmd,
        {
            cwd : './',
            maxBuffer: 1024 * 1024
        },
         function (err, stdout, stderr) {
            console.log(stdout);
            console.log(stderr);
            if(err){
                cb(err);
            }else{
                cb();
            }
        });
    }

    /**
     * Reads XML file for getting version
     */
    gulp.task('config_xml', function () {
      return gulp.src('./config.xml')
        .pipe(cheerio({
          run: function ($) {

            // set app version number
            APK_NAME += '_' + $('widget').attr('version');
          },
          parserOptions: {
            xmlMode: true
          }
        }))
        .pipe(gulp.dest('./'));
    });

    /**
     * release task
     */
    gulp.task('releaseTask',function(callback) {
        if(args.signedAPK){
            runSequence(
                'copyAPK',
                 callback
            )
        }
    });

    /**
     * Rename android apk
     */
    gulp.task('copyAPK',function(callback) {
        return gulp.src(APK_PATH)
            .pipe(if(args.signedAPK,rename(APK_NAME)))
            .pipe(gulp.dest(releaseDirName + '/Android/'))
            .on('end', function(){
                util.log(util.colors.green('Good Job! Your APK is ready at following location : ') + util.colors.cyan(releaseDirName + '/Android/' + APK_NAME))
                execCMD(WINDOWS_POPUP.replace('MESSAGE','Good Job! Your APK is ready at following location : ' + releaseDirName + '/Android/' + APK_NAME), function(err){})
            });
    });

步骤 6.

创建一个任意名称的bat 文件。我用 Signed APK <My Project Name>.bat 创建了它 将以下代码放入 bat 文件中。

cd /d %~dp0
gulp --release --signedAPK
cmd.exe

将这个bat文件保存在项目的根目录下。

cd /d %~dp0 

以上代码跳转至bat文件所在目录

gulp --release --signedAPK

上面的创建 签名的 APK of android.

步骤 7.

不要等待...请转到项目并双击 bat 文件,就这样...签名的 APK 将在项目中今天的日期文件夹中等着您。