diff --git a/packages/flutter_tools/lib/src/commands/build.dart b/packages/flutter_tools/lib/src/commands/build.dart index 609bd92e35c5d02acc9f99071cea0277aa28c1b7..35d00a4fbb564327e6e72ff8d242a64b9211f171 100644 --- a/packages/flutter_tools/lib/src/commands/build.dart +++ b/packages/flutter_tools/lib/src/commands/build.dart @@ -16,6 +16,7 @@ import '../commands/build_windows.dart'; import '../runner/flutter_command.dart'; import 'build_aar.dart'; import 'build_apk.dart'; +import 'build_app.dart'; import 'build_appbundle.dart'; import 'build_bundle.dart'; import 'build_hap.dart'; @@ -73,6 +74,7 @@ class BuildCommand extends FlutterCommand { _addSubcommand(BuildHapCommand(logger: logger, verboseHelp: verboseHelp)); _addSubcommand(BuildHarCommand(logger: logger, verboseHelp: verboseHelp)); _addSubcommand(BuildHspCommand(logger: logger, verboseHelp: verboseHelp)); + _addSubcommand(BuildAppCommand(logger: logger, verboseHelp: verboseHelp)); } void _addSubcommand(BuildSubCommand command) { diff --git a/packages/flutter_tools/lib/src/commands/build_app.dart b/packages/flutter_tools/lib/src/commands/build_app.dart new file mode 100644 index 0000000000000000000000000000000000000000..163f5d37902a10a15b653203c48d8373167f0fdf --- /dev/null +++ b/packages/flutter_tools/lib/src/commands/build_app.dart @@ -0,0 +1,60 @@ +/* +* Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd. +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import '../build_info.dart'; +import '../globals.dart' as globals; +import '../ohos/ohos_builder.dart'; +import '../project.dart'; +import '../runner/flutter_command.dart'; +import 'build.dart'; + +class BuildAppCommand extends BuildSubCommand { + BuildAppCommand({required super.logger, bool verboseHelp = false}) + : super(verboseHelp: verboseHelp) { + const String defaultTargetPlatform = 'ohos-arm64'; + usesTargetOption(); + addDartObfuscationOption(); + addSplitDebugInfoOption(); + usesExtraDartFlagOptions(verboseHelp: verboseHelp); + argParser.addOption( + 'target-platform', + defaultsTo: defaultTargetPlatform, + allowed: ['ohos-arm64', 'ohos-arm', 'ohos-x86'], + help: 'The target platform for which the app is compiled.', + ); + addBuildModeFlags(verboseHelp: verboseHelp); + } + + @override + final String description = 'Build an Ohos App file from your app.\n\n'; + + @override + String get name => 'app'; + + @override + Future runCommand() async { + final BuildInfo buildInfo = await getBuildInfo(); + final TargetPlatform targetPlatform = + getTargetPlatformForName(stringArgDeprecated('target-platform')!); + await ohosBuilder?.buildApp( + FlutterProject.current(), + buildInfo, + targetPlatform: targetPlatform, + logger: globals.logger, + target: targetFile, + ); + return FlutterCommandResult.success(); + } +} diff --git a/packages/flutter_tools/lib/src/ohos/hvigor.dart b/packages/flutter_tools/lib/src/ohos/hvigor.dart index c5730cedb78b9c5c446449531930e9d1ca64786f..6893fd0b5548bcef922a788a84e73b6448d38944 100644 --- a/packages/flutter_tools/lib/src/ohos/hvigor.dart +++ b/packages/flutter_tools/lib/src/ohos/hvigor.dart @@ -344,6 +344,28 @@ Future assembleHap( logger: logger); } +Future assembleApp( + {required ProcessManager processManager, + required String ohosRootPath, + required String hvigorwPath, + Logger? logger}) async { + + await checkFillLocalPropertiesIfNeed(ohosRootPath, logger); + + final List command = [ + hvigorwPath, + 'clean', + 'assembleApp', + '--no-daemon', + ]; + return hvigorwTask(command, + processManager: processManager, + workPath: ohosRootPath, + hvigorwPath: hvigorwPath, + logger: logger); +} + + Future assembleHar( {required ProcessManager processManager, required String workPath, @@ -702,53 +724,8 @@ class OhosHvigorBuilder implements OhosBuilder { Logger? logger}) async { logger?.printStatus('start hap build...'); - if (!flutterProject.ohos.ohosBuildData.modeInfo.hasEntryModule) { - throwToolExit( - "this ohos project don't have a entry module , can't build to a hap file."); - } - - parseData(flutterProject, logger); - - /// 检查plugin的har构建 - await checkPluginsHarUpdate(flutterProject, buildInfo, ohosBuildData); - - await flutterBuildPre(flutterProject, buildInfo, target, - targetPlatform: targetPlatform, logger: logger); - - if (ohosProject.isRunWithModuleHar) { - final String hvigorwPath = - getHvigorwPath(ohosProject.ephemeralDirectory.path, checkMod: true); - final int errorCode0 = await assembleHar( - processManager: globals.processManager, - workPath: ohosProject.ephemeralDirectory.path, - moduleName: ohosProject.flutterModuleName, - hvigorwPath: hvigorwPath, - logger: logger); - if (errorCode0 != 0) { - throwToolExit('assembleHar error! please check log.'); - } + await buildApplicationPipeLine(flutterProject, buildInfo, target: target, targetPlatform: targetPlatform, logger: logger); - final File originHar = ohosProject.flutterModuleDirectory - .childDirectory('build') - .childDirectory('default') - .childDirectory('outputs') - .childDirectory('default') - .childFile('${ohosProject.flutterModuleName}.har'); - if (!originHar.existsSync()) { - throwToolExit('can not found module assemble har out file !'); - } - final String desPath = globals.fs.path - .join(ohosRootPath, 'har', '${ohosProject.flutterModuleName}.har'); - ensureParentExists(desPath); - originHar.copySync(desPath); - - /// har文件拷贝后,需要重新install - ohosProject.deleteOhModulesCache(); - await ohpmInstall( - processManager: globals.processManager, - entryPath: ohosProject.mainModuleDirectory.path, - logger: logger); - } final String hvigorwPath = getHvigorwPath(ohosRootPath, checkMod: true); /// invoke hvigow task generate hap file. @@ -761,12 +738,6 @@ class OhosHvigorBuilder implements OhosBuilder { throwToolExit('assembleHap error! please check log.'); } - final String desSignedFile = globals.fs.path.join( - ohosRootPath, - ohosProject.mainModuleName, - 'build/default/outputs/default', - 'entry-default-signed.hap'); - final File buildProfile = flutterProject.ohos.getBuildProfileFile(); final String buildProfileConfig = buildProfile.readAsStringSync(); final dynamic obj = JSON5.parse(buildProfileConfig); @@ -775,12 +746,6 @@ class OhosHvigorBuilder implements OhosBuilder { logger?.printError('请通过DevEco Studio打开ohos工程后配置调试签名(File -> Project Structure -> Signing Configs 勾选Automatically generate signature)'); return; } - if (signingConfigs is List && signingConfigs.isNotEmpty) { - final File signedFile = globals.localFileSystem.file(desSignedFile); - if (signedFile.existsSync()) { - return; - } - } } Future flutterBuildPre( @@ -864,4 +829,73 @@ class OhosHvigorBuilder implements OhosBuilder { // TODO: implement buildHsp throw UnimplementedError(); } + + @override + Future buildApp(FlutterProject flutterProject, BuildInfo buildInfo, + {required String target, required TargetPlatform targetPlatform, Logger? logger}) async { + + await buildApplicationPipeLine(flutterProject, buildInfo, target: target, targetPlatform: targetPlatform, logger: logger); + + final String hvigorwPath = getHvigorwPath(ohosRootPath, checkMod: true); + + /// invoke hvigow task generate hap file. + final int errorCode1 = await assembleApp( + processManager: globals.processManager, + ohosRootPath: ohosRootPath, + hvigorwPath: hvigorwPath, + logger: logger); + if (errorCode1 != 0) { + throwToolExit('assembleHap error! please check log.'); + } + } + + Future buildApplicationPipeLine(FlutterProject flutterProject, BuildInfo buildInfo, {required String target, required TargetPlatform targetPlatform, Logger? logger}) async { + if (!flutterProject.ohos.ohosBuildData.modeInfo.hasEntryModule) { + throwToolExit( + "this ohos project don't have a entry module , can't build to a application."); + } + + parseData(flutterProject, logger); + + /// 检查plugin的har构建 + await checkPluginsHarUpdate(flutterProject, buildInfo, ohosBuildData); + + await flutterBuildPre(flutterProject, buildInfo, target, + targetPlatform: targetPlatform, logger: logger); + + if (ohosProject.isRunWithModuleHar) { + final String hvigorwPath = + getHvigorwPath(ohosProject.ephemeralDirectory.path, checkMod: true); + final int errorCode0 = await assembleHar( + processManager: globals.processManager, + workPath: ohosProject.ephemeralDirectory.path, + moduleName: ohosProject.flutterModuleName, + hvigorwPath: hvigorwPath, + logger: logger); + if (errorCode0 != 0) { + throwToolExit('assemble error! please check log.'); + } + + final File originHar = ohosProject.flutterModuleDirectory + .childDirectory('build') + .childDirectory('default') + .childDirectory('outputs') + .childDirectory('default') + .childFile('${ohosProject.flutterModuleName}.har'); + if (!originHar.existsSync()) { + throwToolExit('can not found module assemble har out file !'); + } + final String desPath = globals.fs.path + .join(ohosRootPath, 'har', '${ohosProject.flutterModuleName}.har'); + ensureParentExists(desPath); + originHar.copySync(desPath); + + /// har文件拷贝后,需要重新install + ohosProject.deleteOhModulesCache(); + await ohpmInstall( + processManager: globals.processManager, + entryPath: ohosProject.mainModuleDirectory.path, + logger: logger); + } + } } diff --git a/packages/flutter_tools/lib/src/ohos/ohos_builder.dart b/packages/flutter_tools/lib/src/ohos/ohos_builder.dart index cdc6d63f52c23274d7c38e861fbda60563ab3ae3..1a4d894316990132ee21e38a73115cff01a7937a 100644 --- a/packages/flutter_tools/lib/src/ohos/ohos_builder.dart +++ b/packages/flutter_tools/lib/src/ohos/ohos_builder.dart @@ -38,6 +38,12 @@ abstract class OhosBuilder { required TargetPlatform targetPlatform, Logger? logger}); + /// build app + Future buildApp(FlutterProject flutterProject, BuildInfo buildInfo, + {required String target, + required TargetPlatform targetPlatform, + Logger? logger}); + /// build hsp Future buildHsp(FlutterProject flutterProject, BuildInfo buildInfo, {required String target,