Skip to content

Commit 5f63990

Browse files
committed
Added build for Android Play store bundle.
1 parent 1fc2703 commit 5f63990

File tree

12 files changed

+1164
-332
lines changed

12 files changed

+1164
-332
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ debug/
1414
release/
1515
testresults/
1616
.eslintcache
17+
cordova/bundle.keystore
1718

1819
# OSX
1920
.DS_store

azure-pipelines.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ stages:
8686
displayName: 'Install Node.js 10.16.3'
8787
- script: yarn install
8888
displayName: 'Run yarn install'
89-
- script: yarn gulp release --android
89+
- script: yarn gulp debug-release --android
9090
displayName: 'Run yarn release for android'
9191
- task: PublishPipelineArtifact@1
9292
displayName: 'Publish Android release'

cordova/build.json

Lines changed: 0 additions & 10 deletions
This file was deleted.

cordova/build_template.json

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"android": {
3+
"debug": {
4+
"keystore": "debug.keystore",
5+
"storePassword": "betaflight_debug",
6+
"alias": "betaflight_debug",
7+
"password": "password",
8+
"packageType": "apk"
9+
},
10+
"release": {
11+
"keystore": "bundle.keystore",
12+
"storePassword": "[INJECTED_BY_GULPFILE]",
13+
"alias": "betaflight",
14+
"password": "password",
15+
"packageType": "bundle"
16+
}
17+
}
18+
}

cordova/config_template.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
<preference name="SplashMaintainAspectRatio" value="true"/>
3838
<preference name="SplashShowOnlyFirstTime" value="true"/>
3939
<preference name="android-minSdkVersion" value="19"/>
40+
<preference name="android-targetSdkVersion" value="30" />
4041
<config-file parent="/manifest/application/activity" target="AndroidManifest.xml">
4142
<intent-filter>
4243
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"/>

cordova/debug.keystore

2.4 KB
Binary file not shown.

cordova/release.keystore

-2.19 KB
Binary file not shown.

gulpfile.js

Lines changed: 73 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,9 @@ function processPackageDebug(done) {
104104

105105
// dist_yarn MUST be done after dist_src
106106

107-
const distBuild = gulp.series(processPackageRelease, dist_src, dist_changelog, dist_yarn, dist_locale, dist_libraries, dist_resources, dist_rollup, gulp.series(cordova_dist(true)));
107+
const distBuild = gulp.series(processPackageRelease, dist_src, dist_changelog, dist_yarn, dist_locale, dist_libraries, dist_resources, dist_rollup, gulp.series(cordova_dist()));
108108

109-
const debugDistBuild = gulp.series(processPackageDebug, dist_src, dist_changelog, dist_yarn, dist_locale, dist_libraries, dist_resources, dist_rollup, gulp.series(cordova_dist(false)));
109+
const debugDistBuild = gulp.series(processPackageDebug, dist_src, dist_changelog, dist_yarn, dist_locale, dist_libraries, dist_resources, dist_rollup, gulp.series(cordova_dist()));
110110

111111
const distRebuild = gulp.series(clean_dist, distBuild);
112112
gulp.task('dist', distRebuild);
@@ -293,21 +293,48 @@ function processPackage(done, gitRevision, isReleaseBuild) {
293293
metadata.packageId = pkg.name;
294294
}
295295

296-
const packageJson = new stream.Readable;
297-
packageJson.push(JSON.stringify(pkg, undefined, 2));
298-
packageJson.push(null);
296+
function version_prompt() {
297+
return gulp.src('.')
298+
.pipe(prompt.prompt([{
299+
type: 'input',
300+
name: 'version',
301+
message: `Bundle version (default: ${pkg.version}):`,
302+
}, {
303+
type: 'input',
304+
name: 'storeVersion',
305+
message: 'Google Play store version (<x.y.z>, default: package version):',
306+
}], function(res) {
307+
if (res.version) {
308+
pkg.version = res.version;
309+
}
310+
if (res.storeVersion) {
311+
metadata.storeVersion = res.storeVersion;
312+
}
313+
}));
314+
};
299315

300-
Object.keys(pkg)
301-
.filter(key => metadataKeys.includes(key))
302-
.forEach((key) => {
303-
metadata[key] = pkg[key];
304-
});
316+
function write_package_file() {
317+
Object.keys(pkg)
318+
.filter(key => metadataKeys.includes(key))
319+
.forEach((key) => {
320+
metadata[key] = pkg[key];
321+
});
305322

306-
packageJson
307-
.pipe(source('package.json'))
308-
.pipe(gulp.dest(DIST_DIR));
323+
const packageJson = new stream.Readable;
324+
packageJson.push(JSON.stringify(pkg, undefined, 2));
325+
packageJson.push(null);
309326

310-
done();
327+
return packageJson
328+
.pipe(source('package.json'))
329+
.pipe(gulp.dest(DIST_DIR));
330+
};
331+
332+
const platforms = getPlatforms();
333+
if (platforms.indexOf('android') !== -1 && isReleaseBuild) {
334+
gulp.series(version_prompt, write_package_file)(done);
335+
} else {
336+
gulp.series(write_package_file)(done);
337+
}
311338
}
312339

313340
function dist_src() {
@@ -466,7 +493,7 @@ function debug(done) {
466493
buildNWAppsWrapper(platforms, 'sdk', DEBUG_DIR, done);
467494
}
468495

469-
function injectARMCache(flavor, callback) {
496+
function injectARMCache(flavor, done) {
470497
const flavorPostfix = `-${flavor}`;
471498
const flavorDownloadPostfix = flavor !== 'normal' ? `-${flavor}` : '';
472499
clean_cache().then(function() {
@@ -529,7 +556,7 @@ function injectARMCache(flavor, callback) {
529556
clean_debug();
530557
process.exit(1);
531558
}
532-
callback();
559+
done();
533560
}
534561
);
535562
}
@@ -593,10 +620,10 @@ function buildNWApps(platforms, flavor, dir, done) {
593620

594621
function getGitRevision(done, callback, isReleaseBuild) {
595622
let gitRevision = 'norevision';
596-
git.diff([ '--shortstat' ], function (err, diff) {
597-
if (!err && !diff) {
598-
git.log([ '-1', '--pretty=format:%h' ], function (err, rev) {
599-
if (!err) {
623+
git.diff([ '--shortstat' ], function (err1, diff) {
624+
if (!err1 && !diff) {
625+
git.log([ '-1', '--pretty=format:%h' ], function (err2, rev) {
626+
if (!err2) {
600627
gitRevision = rev.latest.hash;
601628
}
602629

@@ -881,7 +908,7 @@ function listReleaseTasks(isReleaseBuild, appDirectory) {
881908
}
882909

883910
// Cordova
884-
function cordova_dist(isReleaseBuild) {
911+
function cordova_dist() {
885912
const distTasks = [];
886913
const platforms = getPlatforms();
887914
if (platforms.indexOf('android') !== -1) {
@@ -893,11 +920,7 @@ function cordova_dist(isReleaseBuild) {
893920
distTasks.push(cordova_rename_src_config);
894921
distTasks.push(cordova_rename_src_package);
895922
distTasks.push(cordova_packagejson);
896-
if (isReleaseBuild) {
897-
distTasks.push(cordova_configxml);
898-
} else {
899-
distTasks.push(cordova_debug_configxml);
900-
}
923+
distTasks.push(cordova_configxml);
901924
distTasks.push(cordova_rename_build_json);
902925
distTasks.push(cordova_browserify);
903926
distTasks.push(cordova_depedencies);
@@ -989,8 +1012,8 @@ function cordova_packagejson() {
9891012
.pipe(gulp.dest(CORDOVA_DIST_DIR));
9901013
}
9911014

992-
function cordova_configxml_internal() {
993-
let androidName = metadata.packageId.replace(NAME_REGEX, '_');
1015+
function cordova_configxml() {
1016+
const androidName = metadata.packageId.replace(NAME_REGEX, '_');
9941017

9951018
return gulp.src([`${CORDOVA_DIST_DIR}config.xml`])
9961019
.pipe(xmlTransformer([
@@ -1000,37 +1023,18 @@ function cordova_configxml_internal() {
10001023
], 'http://www.w3.org/ns/widgets'))
10011024
.pipe(xmlTransformer([
10021025
{ path: '.', attr: { 'id': `com.betaflight.${androidName}` } },
1003-
{ path: '.', attr: { 'version': metadata.version } },
1026+
{ path: '.', attr: { 'version': metadata.storeVersion ? metadata.storeVersion : metadata.version } },
10041027
]))
10051028
.pipe(gulp.dest(CORDOVA_DIST_DIR));
10061029
}
10071030

1008-
function cordova_debug_configxml() {
1009-
return cordova_configxml_internal();
1010-
}
1011-
1012-
function cordova_configxml(callback) {
1013-
return gulp.series(function version_prompt() {
1014-
return gulp.src('.')
1015-
.pipe(prompt.prompt({
1016-
type: 'input',
1017-
name: 'version',
1018-
message: `Bundle version (default: ${metadata.version}):`,
1019-
}, function(res) {
1020-
if (res.version) {
1021-
metadata.version = res.version;
1022-
}
1023-
}));
1024-
}, cordova_configxml_internal)(callback);
1025-
}
1026-
10271031
function cordova_rename_build_json() {
10281032
return gulp.src(`${CORDOVA_DIR}build_template.json`)
10291033
.pipe(rename('build.json'))
10301034
.pipe(gulp.dest(CORDOVA_DIST_DIR));
10311035
}
10321036

1033-
function cordova_browserify(callback) {
1037+
function cordova_browserify(done) {
10341038
const readFile = function(file) {
10351039
return new Promise(function(resolve) {
10361040
if (!file.includes("node_modules")) {
@@ -1048,7 +1052,7 @@ function cordova_browserify(callback) {
10481052
glob(`${CORDOVA_DIST_DIR}www/**/*.js`, {}, function (err, files) {
10491053
const readLoop = function() {
10501054
if (files.length === 0) {
1051-
callback();
1055+
done();
10521056
} else {
10531057
const file = files.pop();
10541058
readFile(file).then(function() {
@@ -1087,7 +1091,7 @@ function cordova_debug() {
10871091
cordova.run();
10881092
}
10891093

1090-
function cordova_debug_build(cb) {
1094+
function cordova_debug_build(done) {
10911095
cordova.build({
10921096
'platforms': ['android'],
10931097
'options': {
@@ -1096,13 +1100,14 @@ function cordova_debug_build(cb) {
10961100
},
10971101
}).then(function() {
10981102
process.chdir('../');
1099-
cb();
1100-
});
11011103

1102-
console.log('APK will be generated at dist_cordova/platforms/android/app/build/outputs/apk/release/app-release.apk');
1104+
console.log('APK has been generated at dist_cordova/platforms/android/app/build/outputs/apk/release/app-release.apk');
1105+
1106+
done();
1107+
});
11031108
}
11041109

1105-
function cordova_build(callback) {
1110+
function cordova_build(done) {
11061111
let storePassword = '';
11071112
return gulp.series(function password_prompt() {
11081113
return gulp.src('.')
@@ -1119,11 +1124,11 @@ function cordova_build(callback) {
11191124
'android': {
11201125
'release' : {
11211126
'storePassword': storePassword,
1122-
}
1123-
}
1127+
},
1128+
},
11241129
}))
11251130
.pipe(gulp.dest('./'));
1126-
}, function build(cb) {
1131+
}, function build(done) {
11271132
return cordova.build({
11281133
'platforms': ['android'],
11291134
'options': {
@@ -1134,24 +1139,28 @@ function cordova_build(callback) {
11341139
// Delete the file containing the store password
11351140
del(['build.json'], { force: true });
11361141
process.chdir('../');
1137-
cb();
1138-
});
1139-
})(callback);
11401142

1141-
console.log('AAB will be generated at dist_cordova/platforms/android/app/build/outputs/bundle/release/app.aab');
1143+
console.log('AAB has been generated at dist_cordova/platforms/android/app/build/outputs/bundle/release/app.aab');
1144+
done();
1145+
});
1146+
})(done);
11421147
}
11431148

11441149
async function cordova_debug_release() {
1145-
const filename = await getReleaseFilename('android', 'apk');
1150+
const filename = getReleaseFilename('android', 'apk');
1151+
11461152
console.log(`Release APK : release/${filename}`);
1153+
11471154
return gulp.src(`${CORDOVA_DIST_DIR}platforms/android/app/build/outputs/apk/debug/app-debug.apk`)
11481155
.pipe(rename(filename))
11491156
.pipe(gulp.dest(RELEASE_DIR));
11501157
}
11511158

11521159
async function cordova_release() {
1153-
const filename = await getReleaseFilename('android', 'aab');
1160+
const filename = getReleaseFilename('android', 'aab');
1161+
11541162
console.log(`Release AAB : release/${filename}`);
1163+
11551164
return gulp.src(`${CORDOVA_DIST_DIR}platforms/android/app/build/outputs/bundle/release/app.aab`)
11561165
.pipe(rename(filename))
11571166
.pipe(gulp.dest(RELEASE_DIR));

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@
8383
"browserify": "^17.0.0",
8484
"chai": "^4.2.0",
8585
"command-exists": "^1.2.8",
86-
"cordova-lib": "^9.0.1",
86+
"cordova-lib": "^10.0.0",
8787
"del": "^5.0.0",
8888
"eslint": "^7.16.0",
8989
"eslint-plugin-vue": "^7.3.0",
@@ -94,6 +94,7 @@
9494
"gulp-concat": "~2.6.1",
9595
"gulp-debian": "~0.1.8",
9696
"gulp-json-editor": "^2.5.4",
97+
"gulp-prompt": "^1.2.0",
9798
"gulp-rename": "^2.0.0",
9899
"gulp-replace": "^1.0.0",
99100
"gulp-xml-transformer": "^3.0.0",

src/js/backup_restore.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
function configuration_backup(callback) {
66
let activeProfile = null;
77

8-
let version = CONFIGURATOR.getConfiguratorVersion();
8+
let version = CONFIGURATOR.version;
99

1010
if (version.indexOf(".") === -1) {
1111
version = version + ".0.0";

0 commit comments

Comments
 (0)