diff --git a/README.en.md b/README.en.md index 0485324f3399fcf23730327d493c1fcd9a605346..9e0e552dcfa5e97f3067268760a52265a0757e3b 100644 --- a/README.en.md +++ b/README.en.md @@ -30,6 +30,8 @@ This warehouse is based on the compatible extension of flutter sdk for OpenHarmo export OHOS_SDK_HOME=/home//env/sdk export HDC_HOME=/home//env/sdk/10/toolchains export PATH=$PATH:$HDC_HOME + # for HarmonyOS sdk + export HOS_SDK_HOME=/home//env/{HarmonyOS sdk} ``` ``` @@ -147,6 +149,8 @@ export PATH=/home//ohos/oh-command-line-tools/sdkmanager/bin:$PATH export OHOS_SDK_HOME=/home//env/sdk export HDC_HOME=/home//env/sdk/10/toolchains export PATH=$PATH:$HDC_HOME +# for HarmonyOS sdk +export HOS_SDK_HOME=/home//env/{HarmonyOS sdk} # Signature tool export SIGN_TOOL_HOME=/home//ohos/developtools_hapsigner/autosign diff --git a/README.md b/README.md index f39a73c8062b03783c0770b674dd48a93224c415..47a8cde401a7165f67d4f84e49e8c849e2c5c8f4 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,9 @@ Flutter SDK 仓库 export OHOS_SDK_HOME=/home//env/sdk export HDC_HOME=/home//env/sdk/10/toolchains export PATH=$PATH:$HDC_HOME + + # 配置HarmonyOS sdk + export HOS_SDK_HOME=/home//env/{HarmonyOS sdk} ``` ``` @@ -148,6 +151,8 @@ export PATH=/home//ohos/oh-command-line-tools/sdkmanager/bin:$PATH export OHOS_SDK_HOME=/home//env/sdk export HDC_HOME=/home//env/sdk/10/toolchains export PATH=$PATH:$HDC_HOME +# 配置HarmonyOS sdk +export HOS_SDK_HOME=/home//env/{HarmonyOS sdk} # 签名工具 export SIGN_TOOL_HOME=/home//ohos/developtools_hapsigner/autosign diff --git a/packages/flutter_tools/lib/src/artifacts.dart b/packages/flutter_tools/lib/src/artifacts.dart index 004be979fbb24bcbe36e0365412db7e1c1d1e13c..5b14b630afd0f5fa1668f32f2fc592147bf06e81 100644 --- a/packages/flutter_tools/lib/src/artifacts.dart +++ b/packages/flutter_tools/lib/src/artifacts.dart @@ -454,12 +454,13 @@ class CachedArtifacts implements Artifacts { case TargetPlatform.fuchsia_arm64: case TargetPlatform.fuchsia_x64: return _getFuchsiaArtifactPath(artifact, platform!, mode!); - case TargetPlatform.tester: - case TargetPlatform.web_javascript: case TargetPlatform.ohos: case TargetPlatform.ohos_arm: case TargetPlatform.ohos_arm64: case TargetPlatform.ohos_x64: + return _getOhosArtifactPath(artifact, platform ?? _currentHostPlatform(_platform, _operatingSystemUtils), mode!); + case TargetPlatform.tester: + case TargetPlatform.web_javascript: case null: return _getHostArtifactPath(artifact, platform ?? _currentHostPlatform(_platform, _operatingSystemUtils), mode); } @@ -590,6 +591,35 @@ class CachedArtifacts implements Artifacts { } } + String _getOhosArtifactPath(Artifact artifact, TargetPlatform platform, BuildMode mode) { + final String engineDir = _getEngineArtifactsPath(platform, mode)!; + switch (artifact) { + case Artifact.genSnapshot: + case Artifact.frontendServerSnapshotForEngineDartSdk: + case Artifact.constFinder: + case Artifact.flutterFramework: + case Artifact.flutterMacOSFramework: + case Artifact.flutterPatchedSdkPath: + case Artifact.flutterTester: + case Artifact.flutterXcframework: + case Artifact.fontSubset: + case Artifact.fuchsiaFlutterRunner: + case Artifact.fuchsiaKernelCompiler: + case Artifact.icuData: + case Artifact.isolateSnapshotData: + case Artifact.linuxDesktopPath: + case Artifact.linuxHeaders: + case Artifact.platformKernelDill: + case Artifact.platformLibrariesJson: + case Artifact.skyEnginePath: + case Artifact.vmSnapshotData: + case Artifact.windowsCppClientWrapper: + case Artifact.windowsDesktopPath: + case Artifact.flutterEngineSo: + return _getHostArtifactPath(artifact, platform, mode); + } + } + String _getFlutterPatchedSdkPath(BuildMode? mode) { final String engineArtifactsPath = _cache.getArtifactDirectory('engine').path; return _fileSystem.path.join(engineArtifactsPath, 'common', diff --git a/packages/flutter_tools/lib/src/commands/screenshot.dart b/packages/flutter_tools/lib/src/commands/screenshot.dart index dbc0d9a3d6ad3ca34600c26ca9503ccfd42d4a8f..165345319c2b3df692304491883e3e20c442fcf2 100644 --- a/packages/flutter_tools/lib/src/commands/screenshot.dart +++ b/packages/flutter_tools/lib/src/commands/screenshot.dart @@ -70,7 +70,6 @@ class ScreenshotCommand extends FlutterCommand { Device? device; Future _validateOptions(String? screenshotType, String? observatoryUrl) async { - throwToolExit('It will be supported later.', exitCode: 1); switch (screenshotType) { case _kDeviceType: if (observatoryUrl != null) { diff --git a/packages/flutter_tools/lib/src/ohos/build_hap.dart b/packages/flutter_tools/lib/src/ohos/build_hap.dart index 12b4006b8ad8b61d9940aab7bc2cdbb27ae7008c..63b60d81c6248beb3817edb33079697680270d15 100644 --- a/packages/flutter_tools/lib/src/ohos/build_hap.dart +++ b/packages/flutter_tools/lib/src/ohos/build_hap.dart @@ -50,6 +50,8 @@ const String HAR_FILE_NAME = 'flutter_embedding.har'; const String HVIGORW_FILE = 'hvigorw'; +final bool isWindows = globals.platform.isWindows; + void checkPlatformEnvironment(String environment, Logger? logger) { final String? environmentConfig = Platform.environment[environment]; if (environmentConfig == null) { @@ -233,19 +235,7 @@ Future buildHap(FlutterProject flutterProject, BuildInfo buildInfo, final String copyDes = getDatPath(ohosRootPath); ohosDta.copySync(copyDes); - //copy ohos engine so - final String? flutterEngineSoPath = - globals.artifacts?.getArtifactPath(Artifact.flutterEngineSo); - if (flutterEngineSoPath == null) { - throwToolExit("flutter engine runtime file 'libflutter.so' no found"); - } - final File flutterEngineSoFile = localFileSystem.file(flutterEngineSoPath); - final String enginCopyDes = getEngineSoPath(ohosRootPath, targetPlatform); - final Directory directory = localFileSystem.file(enginCopyDes).parent; - if (!directory.existsSync()) { - directory.createSync(recursive: true); - } - flutterEngineSoFile.copySync(enginCopyDes); + final String desAppSoPath = getAppSoPath(ohosRootPath, targetPlatform); if (buildInfo.isRelease) { @@ -266,9 +256,9 @@ Future buildHap(FlutterProject flutterProject, BuildInfo buildInfo, OhosBuildData.parseOhosBuildData(ohosProject, logger); final int apiVersion = ohosBuildData.apiVersion; - //copy har final String suffix = '${buildInfo.isDebug ? 'debug' : 'release'}.$apiVersion'; + //copy har final String originHarPath = globals.fs.path.join(ohosRootPath, 'har', '$HAR_FILE_NAME.$suffix'); final String desHarPath = @@ -276,6 +266,31 @@ Future buildHap(FlutterProject flutterProject, BuildInfo buildInfo, final File originHarFile = localFileSystem.file(originHarPath); originHarFile.copySync(desHarPath); + //copy ohos engine so + if (isWindows) { + final String originEnginePath = + globals.fs.path.join(ohosRootPath, 'har', '$FLUTTER_ENGINE_SO.$suffix'); + final String desEnginePath = + globals.fs.path.join(ohosRootPath, 'entry/libs/arm64-v8a', FLUTTER_ENGINE_SO); + final File flutterEngineSoFile = localFileSystem.file(originEnginePath); + flutterEngineSoFile.copySync(desEnginePath); + } else { + final String? flutterEngineSoPath = + globals.artifacts?.getArtifactPath(Artifact.flutterEngineSo); + if (flutterEngineSoPath == null) { + throwToolExit("flutter engine runtime file 'libflutter.so' no found"); + } + logger?.printStatus("flutterEngineSoPath:" + flutterEngineSoPath.toString()); + final File flutterEngineSoFile = localFileSystem.file(flutterEngineSoPath); + + final String enginCopyDes = getEngineSoPath(ohosRootPath, targetPlatform); + final Directory directory = localFileSystem.file(enginCopyDes).parent; + if (!directory.existsSync()) { + directory.createSync(recursive: true); + } + flutterEngineSoFile.copySync(enginCopyDes); + } + logger?.printStatus('copy flutter assets to project end'); /// ohpm install @@ -330,6 +345,7 @@ Future signHap(LocalFileSystem localFileSystem, String unsignedFile, const String PROFILE_TEMPLATE = 'profile_tmp_template.json'; const String PROFILE_TARGET = 'profile_tmp.json'; const String BUNDLE_NAME_KEY = '{{ohosId}}'; + logger?.printWarning("ohosId bundleName: $bundleName"); //修改HarmonyAppProvision配置文件 final String provisionTemplatePath = globals.fs.path.join(signToolHome, PROFILE_TEMPLATE); @@ -375,7 +391,8 @@ Future signHap(LocalFileSystem localFileSystem, String unsignedFile, } final String signtool = - globals.fs.path.join(signToolHome, 'create_appcert_sign_profile.sh'); + globals.fs.path.join(signToolHome, isWindows ? + 'create_appcert_sign_profile.bat' : 'create_appcert_sign_profile.sh'); final List command = [signtool]; await invokeCmd( command: command, @@ -383,7 +400,8 @@ Future signHap(LocalFileSystem localFileSystem, String unsignedFile, processManager: globals.processManager, logger: logger); - final String signtool2 = globals.fs.path.join(signToolHome, 'sign_hap.sh'); + final String signtool2 = globals.fs.path.join(signToolHome, isWindows ? + 'sign_hap.bat' : 'sign_hap.sh'); final List command2 = [signtool2]; await invokeCmd( command: command2, diff --git a/packages/flutter_tools/lib/src/ohos/ohos_device.dart b/packages/flutter_tools/lib/src/ohos/ohos_device.dart index 28e70d5077308bc10b3fceeb3a3b8ca5113611e3..a7371934fdda707af6b9024449bea5d0fcd4fac3 100644 --- a/packages/flutter_tools/lib/src/ohos/ohos_device.dart +++ b/packages/flutter_tools/lib/src/ohos/ohos_device.dart @@ -108,6 +108,20 @@ class OhosDevice extends Device { } } + @override + bool get supportsScreenshot => true; + + @override + Future takeScreenshot(File outputFile) async { + const String remotePath = '/data/local/tmp/flutter_screenshot.jpeg'; + await runHdcCheckedAsync(['shell', 'snapshot_display', '-f', remotePath]); + await _processUtils.run( + hdcCommandForDevice(['file recv', remotePath, outputFile.path]), + throwOnError: true, + ); + await runHdcCheckedAsync(['shell', 'rm', remotePath]); + } + @override Future installApp(covariant ApplicationPackage app, {String? userIdentifier}) async { diff --git a/packages/flutter_tools/lib/src/ohos/ohos_doctor.dart b/packages/flutter_tools/lib/src/ohos/ohos_doctor.dart index ee70794bd4e1760cf2bd0af6f17510b6d2e04b0a..dbb31b2fe913bd0a1d1abbd43e851b0d35ece0eb 100644 --- a/packages/flutter_tools/lib/src/ohos/ohos_doctor.dart +++ b/packages/flutter_tools/lib/src/ohos/ohos_doctor.dart @@ -24,6 +24,7 @@ import '../base/platform.dart'; import '../base/user_messages.dart'; import '../base/version.dart'; import '../doctor_validator.dart'; +import '../globals.dart' as globals; import 'ohos_sdk.dart'; OhosValidator? get ohosValidator => context.get(); @@ -78,8 +79,7 @@ class OhosValidator extends DoctorValidator { final ProcessManager _processManager; final UserMessages _userMessages; - static const String ohpmBinary = 'ohpm'; - static const String hdcBinary = 'hdc'; + final bool isWindows = globals.platform.isWindows; @override Future validate() async { @@ -91,7 +91,7 @@ class OhosValidator extends DoctorValidator { messages.add(ValidationMessage(_userMessages.ohosSdkVersion(_ohosSdk!))); /// check hdc - final _VersionInfo? hdcVersion = await _getBinaryVersion(hdcBinary); + final _VersionInfo? hdcVersion = await _getBinaryVersion(isWindows ? 'hdc.exe' : 'hdc'); if (hdcVersion == null) { validationType = ValidationType.missing; messages.add(ValidationMessage.error(_userMessages.hdcMissing())); @@ -113,7 +113,7 @@ class OhosValidator extends DoctorValidator { final Ohpm? ohpm = Ohpm.local(); String? ohpmVersionString; if (ohpm != null && ohpm.getOhpmBinPath() != null) { - final String ohpmPath = ohpm.getOhpmBinPath() ?? ohpmBinary; + final String ohpmPath = ohpm.getOhpmBinPath() ?? (isWindows ? 'ohpm.bat' : 'ohpm'); final _VersionInfo? ohpmVersion = await _getBinaryVersion(ohpmPath); if (ohpmVersion != null) { ohpmVersionString = ohpmVersion.number.toString(); diff --git a/packages/flutter_tools/lib/src/ohos/ohos_sdk.dart b/packages/flutter_tools/lib/src/ohos/ohos_sdk.dart index 452be17b84bbbd065c45cd12b20f249290003e2b..f8e0ce65542c96fcc7ce3bbabacd804dae563622 100644 --- a/packages/flutter_tools/lib/src/ohos/ohos_sdk.dart +++ b/packages/flutter_tools/lib/src/ohos/ohos_sdk.dart @@ -76,8 +76,9 @@ class OhosSdk { static String? getHdcPath(String sdkPath) { for (final String folder in supportSdkVersion) { + final bool isWindows = globals.platform.isWindows; final File file = globals.fs - .file(globals.fs.path.join(sdkPath, folder, 'toolchains', 'hdc')); + .file(globals.fs.path.join(sdkPath, folder, 'toolchains', isWindows ? 'hdc.exe' : 'hdc')); if (file.existsSync()) { return file.path; } diff --git a/packages/flutter_tools/templates/app_shared/ohos.tmpl/har/libflutter.so.debug.10 b/packages/flutter_tools/templates/app_shared/ohos.tmpl/har/libflutter.so.debug.10 new file mode 100644 index 0000000000000000000000000000000000000000..8ff0d04141a776e448478791df1e2a1c3aa7c5c4 Binary files /dev/null and b/packages/flutter_tools/templates/app_shared/ohos.tmpl/har/libflutter.so.debug.10 differ diff --git a/packages/flutter_tools/templates/app_shared/ohos.tmpl/har/libflutter.so.release.10 b/packages/flutter_tools/templates/app_shared/ohos.tmpl/har/libflutter.so.release.10 new file mode 100644 index 0000000000000000000000000000000000000000..7cdf26180489e807496f02cd4736425b4ad42845 Binary files /dev/null and b/packages/flutter_tools/templates/app_shared/ohos.tmpl/har/libflutter.so.release.10 differ diff --git a/packages/flutter_tools/templates/template_manifest.json b/packages/flutter_tools/templates/template_manifest.json index aa594d2932f7dfb6fcf51ca4537d01d23ac89046..96492ec09e732ad2ed2c28ecf5bf4c28157ed75b 100644 --- a/packages/flutter_tools/templates/template_manifest.json +++ b/packages/flutter_tools/templates/template_manifest.json @@ -178,6 +178,8 @@ "templates/app_shared/ohos.tmpl/har/flutter_embedding.har.release.9", "templates/app_shared/ohos.tmpl/har/flutter_embedding.har.debug.10", "templates/app_shared/ohos.tmpl/har/flutter_embedding.har.release.10", + "templates/app_shared/ohos.tmpl/har/libflutter.so.debug.10", + "templates/app_shared/ohos.tmpl/har/libflutter.so.release.10", "templates/app_shared/ohos.tmpl/local.properties.tmpl", "templates/app_shared/ohos.tmpl/dta/icudtl.dat", "templates/app_shared/ohos.tmpl/entry/libs/arm64-v8a/libc++_shared.so",