From 30333a5646377627c2b927f113f6be72d870aa6c Mon Sep 17 00:00:00 2001 From: Luca Micieli Date: Sun, 5 Mar 2023 11:07:39 +0100 Subject: [PATCH] feat: add release build --- src/application/androidUtils.ts | 9 +++++---- src/application/buildAndroid.ts | 36 +++++++++++++++++---------------- src/commands/build.ts | 32 ++++++++++++++--------------- 3 files changed, 39 insertions(+), 38 deletions(-) diff --git a/src/application/androidUtils.ts b/src/application/androidUtils.ts index f74cce5..c0c7ca4 100644 --- a/src/application/androidUtils.ts +++ b/src/application/androidUtils.ts @@ -1,7 +1,8 @@ -import {getAppName, getRootDestinationFolder} from './utils' +import {getRootDestinationFolder} from './utils' -export function getAppBuildFolder(buildType?: string) { - // todo add debug - const appPath = `${getRootDestinationFolder()}/android/${buildType ? `${buildType}/` : ''}debug` +export function getAppBuildFolder(flavorName?: string, release?: boolean) { + const buildType = release ? 'release' : 'debug' + + const appPath = `${getRootDestinationFolder()}/android/${flavorName ? `${flavorName}/` : ''}${buildType}` return appPath } diff --git a/src/application/buildAndroid.ts b/src/application/buildAndroid.ts index 60b397c..6561bc0 100644 --- a/src/application/buildAndroid.ts +++ b/src/application/buildAndroid.ts @@ -1,8 +1,8 @@ import path from 'path' import { - executeCommand, executeCommandAsync, + executeCommand, + executeCommandAsync, getApkToolExecutable, - getAppName, getProjectRootDir, getRootDestinationFolder, getUberSignJava, @@ -10,11 +10,9 @@ import { import {getAndroidFlavors} from './config' import {getAppBuildFolder} from './androidUtils' import fs from 'fs' -import {findBestApkInFolder} from './runAndroid' -import {channelAWSDir} from 'oclif/lib/upload-util' function capitalize(str: string) { - return str + return str; } async function rebuildIncrementallyTheApk(apkPath: string, bundleOutput: string, resOutput: string, tempAssetBundle: string) { @@ -77,11 +75,10 @@ async function rebuildIncrementally(buildType: string | undefined) { --dev false \ --entry-file index.js \ --bundle-output ${bundleOutput} \ - --assets-dest ${resOutput}`, {cwd: getProjectRootDir()}); - + --assets-dest ${resOutput}`, {cwd: getProjectRootDir()}) await Promise.all(fs.readdirSync(getAppBuildFolder(buildType)).filter(f => f.endsWith('.apk')).map(async apkFileName => { - console.log(`rebuilding ${apkFileName}`); + console.log(`rebuilding ${apkFileName}`) if (apkFileName.endsWith('.apk')) { const apkPath = path.join(getAppBuildFolder(buildType), apkFileName) @@ -91,33 +88,38 @@ async function rebuildIncrementally(buildType: string | undefined) { } -export async function buildAndroid(buildType?: string, incrementalBuild: boolean = false) { - // todo improve flavor management with debug and release and no flavor usage - const buildFlavor = getAndroidFlavors(buildType) +function getBuildTask(gradleFlavor: string | undefined, release: boolean) { + const buildType = release ? 'Release' : 'Debug' + const gradleBuildTask = (gradleFlavor && gradleFlavor !== 'debug') ? `assemble${capitalize(gradleFlavor)}${buildType}` : `assemble${buildType}` + return gradleBuildTask +} + +export async function buildAndroid(flavorName: string | undefined, incrementalBuild: boolean = false, release: boolean = false) { + const buildFlavor = getAndroidFlavors(flavorName) if (!buildFlavor) { - throw new Error(`No android flavor found for ${buildType}`) + throw new Error(`No android flavor found for ${flavorName}`) } const {gradleFlavor} = buildFlavor const androidFolder = path.join(getProjectRootDir(), 'android') - // todo handle Debug/release if (incrementalBuild) { // todo check previous build existance // create a temp directory - await rebuildIncrementally(buildType) + await rebuildIncrementally(flavorName) } else { - const gradleBuildTask = (gradleFlavor && gradleFlavor !== 'debug') ? `install${capitalize(gradleFlavor)}Debug` : 'installDebug' + const gradleBuildTask = getBuildTask(gradleFlavor, release) executeCommand(`${androidFolder}/gradlew \ -Duser.dir=${androidFolder} \ app:${gradleBuildTask} \ `, {stdio: 'inherit'}) - const destinationDir = getAppBuildFolder(buildType) + const destinationDir = getAppBuildFolder(flavorName, release) + const buildType = release ? 'release' : 'debug' executeCommand(`rm -rf ${destinationDir} && mkdir -p ${destinationDir}`) - const destinationFlavorFolder = (gradleFlavor && gradleFlavor !== 'debug') ? `${gradleFlavor}/debug` : 'debug' + const destinationFlavorFolder = (gradleFlavor && gradleFlavor !== 'debug') ? `${gradleFlavor}/${buildType}` : buildType const gradleOutputDir = `${androidFolder}/app/build/outputs/apk/${destinationFlavorFolder}/` executeCommand(`cp -R ${gradleOutputDir} ${destinationDir}`) } diff --git a/src/commands/build.ts b/src/commands/build.ts index 7e1c25a..d531280 100644 --- a/src/commands/build.ts +++ b/src/commands/build.ts @@ -1,8 +1,8 @@ -import {Args, Command, Flags} from '@oclif/core' +import {Command, Flags} from '@oclif/core' import {buildIos} from '../application/buildIos' import {buildAndroid} from '../application/buildAndroid' -import {getAppName} from '../application/utils' import {iosBuildPlatforms} from '../application/iosUtils' +import logger from '../application/logger' export default class Build extends Command { static description = 'Create native builds for android and ios' @@ -10,40 +10,38 @@ export default class Build extends Command { static examples = [ '<%= config.bin %> <%= command.id %> -i -f=dev', '<%= config.bin %> <%= command.id %> -a -f=prod', - '<%= config.bin %> <%= command.id %> -all', + '<%= config.bin %> <%= command.id %> -a -f=prod --release', + '<%= config.bin %> <%= command.id %> -a --release', + '<%= config.bin %> <%= command.id %> -a --incremental', ] static flags = { ios: Flags.boolean({char: 'i', description: 'Generate ios native build'}), android: Flags.boolean({char: 'a', description: 'Generate android native build'}), - all: Flags.boolean({description: 'Generate both ios and android native build'}), flavor: Flags.string({char: 'f', description: 'Specify flavor to build'}), + release: Flags.boolean({description: 'Optimized release build'}), incremental: Flags.boolean({char: 'I', description: 'Incremental build', default: false}), } - static args = { - file: Args.string({description: 'file to read'}), - } - public async run(): Promise { - const {args, flags} = await this.parse(Build) + const {flags} = await this.parse(Build) - const shouldBuildAndroid = flags.android ?? flags.all - const shouldBuildIos = flags.ios ?? flags.all + const shouldBuildAndroid = flags.android; + const shouldBuildIos = flags.ios; const buildFlavor = flags.flavor + const release = flags.release; + const incremental = flags.incremental; - this.log('Build app', getAppName()) const start = performance.now(); if (shouldBuildIos) { - this.log('Build ios') + logger.info('Building ios app') buildIos(buildFlavor, iosBuildPlatforms.simulator) } if (shouldBuildAndroid) { - this.log('Building android') - // build release and debug? - await buildAndroid(buildFlavor, flags.incremental) + logger.info('Building android') + await buildAndroid(buildFlavor, incremental, release) } - this.log('Build finished in', (performance.now() - start) / 1000, 'seconds'); + logger.info(`Build finished in ${(performance.now() - start) / 1000} seconds`); } }