【问题标题】:Android apk does not compile well with gulpAndroid apk 不能用 gulp 很好地编译
【发布时间】:2017-08-25 13:53:01
【问题描述】:

您好,我正在尝试使用以下命令通过 gulp 编译我的 android 应用程序: gulp --prod -p android(prod 是配置文件之一)。

但是有一个问题,虽然没有错误。同事编译的时候,生成的apk重20mo,我的时候只有1.7mo。我们的app是在svn上的,所以之前我们有相同的代码,然后我们只运行一个npm install和bower install .

我真的不知道要添加什么来帮助您识别问题,但这里是 gulpfile.js

    'use strict';

var mainModuleName = 'ModuleName';  <--- Generic
var bootstrapModule = mainModuleName;

var gulp = require('gulp');
var plugins = require('gulp-load-plugins')();
var del = require('del');
var fs = require('fs');
var beep = require('beepbeep');
var express = require('express');
var path = require('path');
var open = require('open');
var stylish = require('jshint-stylish');
var connectLr = require('connect-livereload');
var streamqueue = require('streamqueue');
var runSequence = require('run-sequence');
var merge = require('merge-stream');
var ripple = require('ripple-emulator');
var karmaServer = require('karma').Server;
var replaceTask = require('gulp-replace-task');
var buildAndroid = require('gulp-cordova-build-android');
//var buildiOS = require('gulp-cordova-build-ios'); // Useless plugin for now (v1.0)
var wiredep = require('wiredep');

var runningPlatform = process.platform;
var isWindows = /^win/.test(runningPlatform);
var isMac = /darwin/.test(runningPlatform);

/**
 * Parse arguments
 */
var args = require('yargs')
    .alias('e', 'emulate')
    .alias('b', 'build')
    .alias('r', 'run')
    .alias('p', 'package')
    // remove all debug messages (console.logs, alerts etc) from release build
    .alias('release', 'strip-debug')
    .alias('m', 'mock')
    .default('build', false)
    .default('port', 9000)
    .default('strip-debug', false)
    .default('mock', false)
    .argv;

var build = !!(args.build || args.emulate || args.run || args['package']);
var emulate = args.emulate;
var run = args.run;
var packageArgs = args['package'];
var port = args.port;
var mock = args.mock;
var stripDebug = !!args.stripDebug;
var targetDir = path.resolve(build ? 'www' : '.tmp');

// Retrieve environment args
var dev = args.dev;
var qualif = args.qualif;
var recette = args.recette;
var prod = args.prod;

if (!dev && !qualif && !recette && !prod){
    dev = true;
}

if (mock){
  plugins.util.log("Mock mode enabled, fake data will be used");
  bootstrapModule += ".mock";
}

// if we just use emulate or run or package without specifying platform, we assume iOS
// in this case the value returned from yargs would just be true
if (emulate === true) {
    emulate = isMac ? 'ios' : 'android';
}
else if (emulate === 'windows') {
    emulate += " --emulator -- --phone";
}

if (run === true) {
    run = isMac ? 'ios' : 'android';;
}
else if (run === 'windows') {
    run += " --device -- --phone";
}

if (packageArgs === true) {
  packageArgs = isMac ? 'ios' : 'android';;
}


// global error handler
var errorHandler = function(error) {
  if (build) {
    throw error;
  } else {
    beep(2, 170);
    plugins.util.log(error);
  }
};

var arePlatformsAdded = function(){
  return fs.existsSync('platforms');   
}

var getEnvironment = function(){

  var environmentName = "development";
  if (dev && emulate){
    environmentName = "development_with_proxy";
  }
  else if (dev){
    environmentName = "development";
  }
  else if (qualif){
    environmentName = "qualification";
  }
  else if (recette){
    environmentName = "recette";
  }
  else if (prod){
    environmentName = "production";
  }

  return environmentName;
}

// no-op = empty function
gulp.task('noop', function() {});
gulp.task('noop2', function() {});

// clean target dir
gulp.task('clean', function(done) {
    try{
        del([targetDir], done);
    }
    catch(e){
        console.warn('err: ', err);
    }
});

/*
 * Test task, run test once and exit
 */
gulp.task('test', /*['build'],*/ function(done) {

  var vendorFiles = wiredep().js;

  // list of files / patterns to load in the browser
  var files = [
    './app/**/*.js'
  ];

  new karmaServer({
    configFile: __dirname + '/karma.conf.js',
    singleRun: true,
    files: vendorFiles.concat(files)
  }, done).start();
});

// precompile .scss and concat with ionic.css
gulp.task('styles', function() {

  var options = build ? { style: 'compressed' } : { style: 'expanded' };

  var sassStream = gulp.src('app/styles/main.scss')
    .pipe(plugins.sass(options))
    .on('error', function(err) {
      console.log('err: ', err);
      beep();
    });

//  var widgetSassStream = gulp.src('app/scripts/widgets/widgets.scss')
//    .pipe(plugins.sass(options))
//    .on('error', function(err) {
//      console.log('err: ', err);
//      beep();
//    });

  // build ionic css dynamically to support custom themes
  var ionicStream = gulp.src('bower_components/ionic/scss/ionic.scss')
    .pipe(plugins.cached('ionic-styles'))
    .pipe(plugins.sass(options))
    // cache and remember ionic .scss in order to cut down re-compile time
    .pipe(plugins.remember('ionic-styles'))
    .on('error', function(err) {
        console.log('err: ', err);
        beep();
      });

    // ionicStream is not used for now - ionic scss is imported on main.scss to support overrididing

  return streamqueue({ objectMode: true }, sassStream/*, widgetSassStream, ionicStream*/)
    .pipe(plugins.autoprefixer('last 1 Chrome version', 'last 3 iOS versions', 'last 3 Android versions'))
    .pipe(plugins.concat('main.css'))
    .pipe(plugins.if(build, plugins.stripCssComments()))
    .pipe(plugins.if(build && !emulate, plugins.rev()))
    .pipe(gulp.dest(path.join(targetDir, 'styles')))
    .on('error', errorHandler);
});


// build templatecache, copy scripts.
// if build: concat, minsafe, uglify and versionize
gulp.task('scripts', function() {
  var dest = path.join(targetDir, 'scripts');

  /*var buildInDebug = false;
  if (build === true && (getEnvironment() === "development" || getEnvironment() === "qualification")) {
      buildInDebug = true;
  }*/
  build = false;

  var minifyConfig = {
    collapseWhitespace: true,
    collapseBooleanAttributes: true,
    removeAttributeQuotes: true,
    removeComments: true
  };

  // prepare angular template cache from html templates
  // (remember to change mainModuleName var to desired module name)
  var templateStream = gulp
    .src('**/*.html', { cwd: 'app'})
    .pipe(plugins.angularTemplatecache('templates.js', {
      root: 'templates/',
      module: mainModuleName,
      htmlmin: build /*&& !buildInDebug*/ && minifyConfig
    }));

  // Manager environment configuration
  var envConfigFile = gulp.src('EnvironmentConfig.json')
    .pipe(plugins.ngConfig(mainModuleName, {
      createModule: false,
      environment: getEnvironment()
    }))
    //.pipe(gulp.dest(path.join(dest, 'config')))
    .on('error', errorHandler);

  var scriptStream = gulp
    .src([
        'templates.js', 
        'app.js', 
        '**/*Module.js',
        '**/*.js',
        '!**/*_test.js'
    ], { cwd: 'app/scripts' })
    .pipe(plugins.if(!build, plugins.changed(dest))
  );

  return streamqueue({ objectMode: true }, scriptStream, envConfigFile, templateStream)
    .pipe(plugins.if(build/* && !buildInDebug*/, plugins.ngAnnotate()))
    .pipe(plugins.if(stripDebug, plugins.stripDebug()))
    .pipe(plugins.if(build/* && !buildInDebug*/, plugins.concat('app.js')))
    .pipe(plugins.if(build/* && !buildInDebug*/, plugins.uglify()))
    .pipe(plugins.if(build/* && !buildInDebug*/ && !emulate, plugins.rev()))

    .pipe(gulp.dest(dest))

    .on('error', errorHandler);
});

// copy fonts
gulp.task('fonts', function() {

    var vendorFontFiles = []
    var fontExts = ['eot', 'svg', 'ttf', 'woff', 'woff2'];
    var deps = wiredep().packages;
    for (var i in deps) {
        for(var k in deps[i].main) {
            var f = deps[i].main[k];
            if(~fontExts.indexOf(f.split('.').pop())) {
                vendorFontFiles.push(f);
            }
        }
    }

    return gulp
        .src(vendorFontFiles.concat(['app/fonts/*.*']))
        .pipe(gulp.dest(path.join(targetDir, 'fonts')))
        .on('error', errorHandler);
});


// copy templates
gulp.task('templates', function() {
  return gulp.src(['app/templates/**/*.*', 'app/scripts/widgets/**/*.html'])
    .pipe(gulp.dest(path.join(targetDir, 'templates')))

    .on('error', errorHandler);
});

// generate iconfont
gulp.task('iconfont', function(){
  return gulp.src('app/icons/*.svg', {
        buffer: false
    })
    .pipe(plugins.iconfontCss({
      fontName: 'ownIconFont',
      path: 'app/icons/own-icons-template.css',
      targetPath: '../styles/own-icons.css',
      fontPath: '../fonts/'
    }))
    .pipe(plugins.iconfont({
        fontName: 'ownIconFont'
    }))
    .pipe(gulp.dest(path.join(targetDir, 'fonts')))
    .on('error', errorHandler);
});

// copy images
gulp.task('images', function() {
  return gulp.src(['app/images/**/*.*', 'app/scripts/widgets/**/*.png'])
    .pipe(gulp.dest(path.join(targetDir, 'images')))

    .on('error', errorHandler);
});

// copy videos
gulp.task('videos', function() {
  return gulp.src(['app/videos/**/*.*', 'app/scripts/widgets/**/*.mp4'])
    .pipe(gulp.dest(path.join(targetDir, 'videos')))

    .on('error', errorHandler);
});

// copy mock data
gulp.task('mockData', function() {
  return gulp.src(['app/scripts/mock/data/**/*.*'])
    .pipe(gulp.dest(path.join(targetDir, 'mock/data')))

    .on('error', errorHandler);
});

// lint js sources based on .jshintrc ruleset
gulp.task('jsHint', function(done) {
  return gulp
    .src('app/scripts/**/*.js')
    .pipe(plugins.jshint())
    .pipe(plugins.jshint.reporter(stylish))
    .pipe(plugins.jshint.reporter('fail'))

    .on('error', errorHandler);
    done();
});

// check js sources code style with jscs based on .jshintrc ruleset
gulp.task('jscs', function(done) {
  return gulp
    .src('app/scripts/**/*.js')
    .pipe(plugins.jscs())
    .pipe(plugins.jscs.reporter())
    .pipe(plugins.jscs.reporter('fail'))

    .on('error', errorHandler);
    done();
});

// concatenate and minify vendor sources
gulp.task('vendor', function() {

    var vendorFiles = wiredep().js;

    return gulp.src(vendorFiles)
        .pipe(plugins.concat('vendor.js'))
        .pipe(gulp.dest(targetDir))
        .on('error', errorHandler);
});


// inject the files in index.html
gulp.task('index', ['jsHint', 'jscs', 'scripts'], function() {

  // build has a '-versionnumber' suffix
  var cssNaming = 'styles/main*';

  // injects 'src' into index.html at position 'tag'
  var _inject = function(src, tag) {
    return plugins.inject(src, {
      starttag: '<!-- inject:' + tag + ':{{ext}} -->',
      read: false,
      addRootSlash: false
    });
  };

  // get all our javascript sources
  // in development mode, it's better to add each file seperately.
  // it makes debugging easier.
  var _getAllScriptSources = function() {

    // Inject modules first
    var scriptStream = gulp.src([
        'scripts/app.js', 
        'scripts/**/*Module.js', 
        'scripts/**/*.js',
        '!scripts/**/*_test.js'
    ], { cwd: targetDir });
    return streamqueue({ objectMode: true }, scriptStream);
  };

  return gulp.src('app/index.html')
    // inject module name
    .pipe(replaceTask({patterns: [{match: 'moduleName', replacement: bootstrapModule}]}))
    // inject css
    .pipe(_inject(gulp.src(cssNaming, { cwd: targetDir }), 'app-styles'))
    // inject vendor.js
    .pipe(_inject(gulp.src('vendor*.js', { cwd: targetDir }), 'vendor'))
    // inject app.js (build) or all js files indivually (dev)
    .pipe(plugins.if(build,
      _inject(gulp.src('scripts/app*.js', { cwd: targetDir }), 'app'),
      _inject(_getAllScriptSources(), 'app')
    ))

    .pipe(gulp.dest(targetDir))
    .on('error', errorHandler);
});

// start local express server
gulp.task('serve', function() {
  express()
    .use(!build ? connectLr() : function(){})
    .use(express.static(targetDir))
    .listen(port);
  open('http://localhost:' + port + '/');
});

// ionic emulate wrapper
gulp.task('addPlatforms', function(done) {
  runSequence(
    'ionic:addAndroid',
    isMac ? 'ionic:addiOS' : 'noop',
    isWindows ? 'ionic:addWP' : 'noop2',
    done
  );
});

// ionic add platform android wrapper
gulp.task('ionic:addAndroid', plugins.shell.task([
  'ionic platform add android@4.1.1'
]));

// ionic add platform ios wrapper
gulp.task('ionic:addiOS', plugins.shell.task([
  'ionic platform add ios'
]));

// ionic add platform Windows Phone 8.1 wrapper
gulp.task('ionic:addWP', plugins.shell.task([
  'ionic platform add windows'
]));

// ionic emulate wrapper
gulp.task('ionic:emulate', plugins.shell.task([
  'ionic emulate ' + emulate + ' --livereload --consolelogs'
]));

// ionic run wrapper
gulp.task('ionic:run', plugins.shell.task([
  'ionic run ' + run
]));

// ionic resources wrapper
gulp.task('icon', plugins.shell.task([
  'ionic resources --icon'
]));
gulp.task('splash', plugins.shell.task([
  'ionic resources --splash'
]));
gulp.task('resources', plugins.shell.task([
  'ionic resources'
]));

// select emulator device
gulp.task('select', plugins.shell.task([
  './helpers/emulateios'
]));

// ripple emulator
gulp.task('ripple', ['scripts', 'styles', 'watchers'], function() {

  var options = {
    keepAlive: false,
    open: true,
    port: 4400
  };

  // Start the ripple server
  ripple.emulate.start(options);

  open('http://localhost:' + options.port + '?enableripple=true');
});

// start watchers
gulp.task('watchers', function() {
  plugins.livereload.listen();
  gulp.watch('app/styles/**/*.scss', ['styles']);
  gulp.watch('app/scripts/widgets/**/*.scss', ['styles']);
  gulp.watch('app/fonts/**', ['fonts']);
  gulp.watch('app/icons/**', ['iconfont']);
  gulp.watch('app/images/**', ['images']);
  gulp.watch('app/videos/**', ['videos']);
  gulp.watch('app/scripts/mock/data/**', ['mockData']);
  gulp.watch('app/scripts/widgets/**/*.png', ['images']);
  gulp.watch('app/scripts/widgets/**/*.mp4', ['videos']);
  gulp.watch('app/scripts/**/*.js', ['index']);
  gulp.watch('./vendor.json', ['vendor']);
  gulp.watch('app/templates/**/*.html', ['index', 'templates']);
  gulp.watch('app/scripts/widgets/**/*.html', ['index', 'templates']);
  gulp.watch('app/index.html', ['index']);
  gulp.watch(targetDir + '/**')
    .on('change', plugins.livereload.changed)
    .on('error', errorHandler);
});

gulp.task('package:ios', plugins.shell.task([
  'cordova build ios --device',
  'cd platforms/ios/build/device',
  '/usr/bin/xcrun -sdk iphoneos PackageApplication "$(pwd)/$PROJECT_NAME.app" -o "$(pwd)/$PROJECT_NAME.ipa"'
]));

// Package binary file to distribute
gulp.task('package', function() {

  switch (packageArgs){
    case 'ios':
      return runSequence('package:ios');
      break;
    case 'android':
      return gulp.src('platforms/android')
        .pipe(buildAndroid({
          storeFile: '../../debug.keystore', 
          storePassword: 'android',
          keyAlias: 'androiddebugkey', 
          keyPassword: 'android'
        }))
      ;
      break;
    default:
      console.error("Unable to package - no platform specified or unknown platform");
      break;
  }
});

gulp.task('build', function(done) {

  build = true;
  targetDir = path.resolve('www');
  runSequence('default', done);
});

// our main sequence, with some conditional jobs depending on params
gulp.task('default', function(done) {
  runSequence(
    'clean',
    'iconfont',
    [
      arePlatformsAdded() ? 'resources' : 'noop',
      'fonts',
      'templates',
      'styles',
      'images',
      'videos',
      mock ? 'mockData' : 'noop2',
      'vendor'
    ],
    'index',
    build ? 'noop' : 'watchers',
    build ? 'noop' : 'serve',
    emulate ? ['ionic:emulate', 'watchers'] : 'noop',
    run ? 'ionic:run' : 'noop',
    packageArgs ? 'package' : 'noop',
    done);
});

还有 package.json :

{
  "name": "myApp",
  "version": "1.0.0",
  "author": "Me",
  "description": "",
  "dependencies": {
    "angular-animate": "1.5.3",
    "angular-touch": "^1.5.7"
  },
  "devDependencies": {
    "beepbeep": "^1.2.0",
    "bower": "1.7.9",
    "connect-livereload": "^0.5.2",
    "cordova": "5.3.3",
    "del": "^1.1.1",
    "express": "^4.11.1",
    "glob": "^4.3.5",
    "gulp": "3.9.1",
    "gulp-angular-templatecache": "^1.5.0",
    "gulp-autoprefixer": "^2.1.0",
    "gulp-cached": "^1.1.0",
    "gulp-changed": "^1.1.1",
    "gulp-concat": "^2.4.3",
    "gulp-cordova-build-android": "^1.5.1",
    "gulp-cordova-build-ios": "^1.0.0",
    "gulp-iconfont": "^1.0.0",
    "gulp-iconfont-css": "0.0.9",
    "gulp-if": "^1.2.5",
    "gulp-inject": "^1.1.1",
    "gulp-jscs": "^3.0.1",
    "gulp-jshint": "^1.9.0",
    "gulp-livereload": "^3.7.0",
    "gulp-load-plugins": "^0.8.0",
    "gulp-ng-annotate": "^0.5.0",
    "gulp-ng-config": "1.2.1",
    "gulp-remember": "^0.3.0",
    "gulp-replace-task": "0.11.0",
    "gulp-rev": "^3.0.0",
    "gulp-sass": "^2.0.1",
    "gulp-shell": "^0.2.11",
    "gulp-strip-css-comments": "^1.1.0",
    "gulp-strip-debug": "^1.0.2",
    "gulp-uglify": "^1.1.0",
    "gulp-util": "^2.2.14",
    "ionic": "1.7.15",
    "jasmine-core": "2.4.1",
    "jshint-stylish": "^1.0.0",
    "karma": "0.13.22",
    "karma-coverage": "1.0.0",
    "karma-jasmine": "1.0.2",
    "karma-junit-reporter": "1.0.0",
    "karma-phantomjs-launcher": "1.0.0",
    "lodash": "^3.9.3",
    "lodash._basecopy": "latest",
    "merge-stream": "^0.1.7",
    "node-sass": "^3.0.0",
    "open": "0.0.5",
    "phantomjs": "2.1.7",
    "ripple-emulator": "^0.9.28",
    "run-sequence": "^1.0.2",
    "shelljs": "^0.3.0",
    "streamqueue": "^0.1.1",
    "wiredep": "^3.0.0",
    "yargs": "^1.3.3"
  },
  "optionalDependencies": {
    "ios-sim": "^5.0.2",
    "ios-deploy": "^1.8.3"
  },
  "scripts": {
    "gulp": "./node_modules/.bin/gulp",
    "bower": "./node_modules/.bin/bower",
    "cordova": "./node_modules/.bin/cordova",
    "ionic": "./node_modules/.bin/ionic",
    "phantomjs": "./node_modules/.bin/phantomjs",
    "postinstall": "bower install && gulp -b"
  },
  "cordovaPlugins": [
    "cordova-plugin-whitelist",
    "cordova-plugin-crosswalk-webview@1.5.0",
    "cordova-plugin-splashscreen@2.0.0",
    "cordova-plugin-device@1.1.0",
    "cordova-plugin-app-version@0.1.8",
    "cordova-plugin-file@3.0.0",
    "ionic-plugin-keyboard@2.0.1",
    "cordova-plugin-screen-orientation",
    "cordova-plugin-screen-orientation@~1.4.2",
    "cordova-plugin-geolocation@~2.2.0",
    "cordova-plugin-camera@~2.2.0"
  ],
  "cordovaPlatforms": [
    "ios",
    {
      "platform": "android",
      "version": "4.1.1",
      "locator": "android@4.1.1"
    }
  ]
}

最后是编译日志:

[15:49:52] Using gulpfile D:\Profiles\bgouygou\Workspaces\Eclipse_IDE_for_Java_EE_Developers_442\B0001\gulpfile.js
[15:49:52] Starting 'default'...
[15:49:52] Starting 'clean'...
[15:49:52] Finished 'clean' after 132 ms
[15:49:52] Starting 'iconfont'...
[15:49:53] Finished 'iconfont' after 800 ms
[15:49:53] Starting 'resources'...
[15:49:53] Starting 'fonts'...
[15:49:54] Starting 'templates'...
[15:49:54] Starting 'styles'...
[15:49:55] Starting 'images'...
[15:49:55] Starting 'videos'...
[15:49:55] Starting 'noop2'...
[15:49:55] Finished 'noop2' after 15 μs
[15:49:55] Starting 'vendor'...
Ionic icon and splash screen resources generator
 uploading icon.png...
 uploading splash.png...
[15:49:55] Finished 'videos' after 102 ms
[15:49:55] Finished 'templates' after 1.9 s
[15:49:56] Finished 'fonts' after 2.06 s
[15:49:56] Finished 'vendor' after 449 ms
[15:49:56] Finished 'images' after 633 ms
[15:49:57] Finished 'styles' after 3.63 s
[15:50:16] Finished 'resources' after 23 s
[15:50:16] Starting 'jsHint'...
[15:50:17] Starting 'jscs'...
[15:50:19] Starting 'scripts'...
[15:50:21] Finished 'jsHint' after 5.03 s
[15:50:21] Finished 'jscs' after 4.61 s
[15:50:21] Finished 'scripts' after 2.03 s
[15:50:21] Starting 'index'...
[15:50:21] gulp-inject 1 files into index.html.
[15:50:21] gulp-inject 1 files into index.html.
[15:50:21] gulp-inject 30 files into index.html.
[15:50:21] Finished 'index' after 169 ms
[15:50:21] Starting 'noop'...
[15:50:21] Finished 'noop' after 4.92 μs
[15:50:21] Starting 'noop'...
[15:50:21] Finished 'noop' after 2.87 μs
[15:50:21] Starting 'noop'...
[15:50:21] Finished 'noop' after 2.46 μs
[15:50:21] Starting 'noop'...
[15:50:21] Finished 'noop' after 2.05 μs
[15:50:21] Starting 'package'...
add to body class: platform-android
ANDROID_HOME=D:\Android\android-sdk
JAVA_HOME=C:\Program Files\Java\jdk1.8.0_131
Subproject Path: CordovaLib
Starting a new Gradle Daemon for this build (subsequent builds will be faster).
Incremental java compilation is an incubating feature.
:preBuild UP-TO-DATE
:preReleaseBuild UP-TO-DATE
:checkReleaseManifest
:CordovaLib:preBuild UP-TO-DATE
:CordovaLib:preReleaseBuild UP-TO-DATE
:CordovaLib:checkReleaseManifest
:CordovaLib:prepareReleaseDependencies
:CordovaLib:compileReleaseAidl UP-TO-DATE
:CordovaLib:compileReleaseNdk UP-TO-DATE
:CordovaLib:compileLint UP-TO-DATE
:CordovaLib:copyReleaseLint UP-TO-DATE
:CordovaLib:mergeReleaseShaders UP-TO-DATE
:CordovaLib:compileReleaseShaders UP-TO-DATE
:CordovaLib:generateReleaseAssets UP-TO-DATE
:CordovaLib:mergeReleaseAssets UP-TO-DATE
:CordovaLib:mergeReleaseProguardFiles UP-TO-DATE
:CordovaLib:packageReleaseRenderscript UP-TO-DATE
:CordovaLib:compileReleaseRenderscript UP-TO-DATE
:CordovaLib:generateReleaseResValues UP-TO-DATE
:CordovaLib:generateReleaseResources UP-TO-DATE
:CordovaLib:packageReleaseResources UP-TO-DATE
:CordovaLib:processReleaseManifest UP-TO-DATE
:CordovaLib:generateReleaseBuildConfig UP-TO-DATE
:CordovaLib:processReleaseResources UP-TO-DATE
:CordovaLib:generateReleaseSources UP-TO-DATE
:CordovaLib:incrementalReleaseJavaCompilationSafeguard UP-TO-DATE
:CordovaLib:compileReleaseJavaWithJavac UP-TO-DATE
:CordovaLib:processReleaseJavaRes UP-TO-DATE
:CordovaLib:transformResourcesWithMergeJavaResForRelease UP-TO-DATE
:CordovaLib:transformClassesAndResourcesWithSyncLibJarsForRelease UP-TO-DATE
:CordovaLib:mergeReleaseJniLibFolders UP-TO-DATE
:CordovaLib:transformNative_libsWithMergeJniLibsForRelease UP-TO-DATE
:CordovaLib:transformNative_libsWithSyncJniLibsForRelease UP-TO-DATE
:CordovaLib:bundleRelease UP-TO-DATE
:prepareAndroidCordovaLibUnspecifiedReleaseLibrary UP-TO-DATE
:prepareReleaseDependencies
:compileReleaseAidl UP-TO-DATE
:compileReleaseRenderscript UP-TO-DATE
:generateReleaseBuildConfig UP-TO-DATE
:generateReleaseResValues UP-TO-DATE
:generateReleaseResources UP-TO-DATE
:mergeReleaseResources UP-TO-DATE
:processReleaseManifest UP-TO-DATE
:processReleaseResources UP-TO-DATE
:generateReleaseSources UP-TO-DATE
:incrementalReleaseJavaCompilationSafeguard UP-TO-DATE
:compileReleaseJavaWithJavac UP-TO-DATE
:compileReleaseNdk UP-TO-DATE
:compileReleaseSources UP-TO-DATE
:lintVitalRelease
:mergeReleaseShaders UP-TO-DATE
:compileReleaseShaders UP-TO-DATE
:generateReleaseAssets UP-TO-DATE
:mergeReleaseAssets
:transformClassesWithDexForRelease UP-TO-DATE
:mergeReleaseJniLibFolders UP-TO-DATE
:transformNative_libsWithMergeJniLibsForRelease UP-TO-DATE
:processReleaseJavaRes UP-TO-DATE
:transformResourcesWithMergeJavaResForRelease UP-TO-DATE
:validateSigningRelease
:packageRelease
:assembleRelease
:cdvBuildRelease

BUILD SUCCESSFUL

Total time: 17.387 secs
[15:50:43] Finished 'package' after 21 s
[15:50:43] Finished 'default' after 51 s

就是这样,如果您需要更多信息来确定问题,请告诉我。

【问题讨论】:

    标签: javascript android angularjs gulp


    【解决方案1】:

    我也在寻找类似的东西。 希望这个链接可以帮助你。 Gulp-Android

    【讨论】:

      猜你喜欢
      • 2012-07-27
      • 2013-12-22
      • 1970-01-01
      • 2017-11-09
      • 2015-09-19
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      相关资源
      最近更新 更多