diff --git a/engine/src/build/config/android/config.gni b/engine/src/build/config/android/config.gni index 7051d9c398d36..0cf362de747cf 100644 --- a/engine/src/build/config/android/config.gni +++ b/engine/src/build/config/android/config.gni @@ -67,7 +67,9 @@ if (is_android) { zipalign_path = "$android_sdk_build_tools/zipalign" - if (current_cpu != "x64" && current_cpu != "arm64") { + if (current_cpu == "riscv64") { + android_api_level = 35 + } else if (current_cpu != "x64" && current_cpu != "arm64") { android_api_level = 21 } @@ -101,6 +103,9 @@ if (is_android) { } else if (current_cpu == "arm64") { android_app_abi = "arm64-v8a" _android_lib_dir = "aarch64-linux-android" + } else if (current_cpu == "riscv64") { + android_app_abi = "riscv64" + _android_lib_dir = "riscv64-linux-android" } else { assert(false, "Unknown Android ABI: " + current_cpu) } diff --git a/engine/src/build/config/compiler/BUILD.gn b/engine/src/build/config/compiler/BUILD.gn index 425716418bc0b..e91cc53e335b9 100644 --- a/engine/src/build/config/compiler/BUILD.gn +++ b/engine/src/build/config/compiler/BUILD.gn @@ -33,7 +33,8 @@ declare_args() { # By default, API calls to deprecated methods are errors. While prototyping, # this flag may be set to allow such calls. - allow_deprecated_api_calls = false + # riscv64: https://github.com/flutter/flutter/issues/173656 + allow_deprecated_api_calls = target_cpu == "riscv64" # This flag is deprecated and will be removed. The value will be ignored. use_fstack_protector = false @@ -464,6 +465,9 @@ config("compiler") { } else if (current_cpu == "x64") { cflags += [ "--target=x86_64-linux-androideabi${android_api_level}" ] ldflags += [ "--target=x86_64-linux-androideabi${android_api_level}" ] + } else if (current_cpu == "riscv64") { + cflags += [ "--target=riscv64-linux-androideabi${android_api_level}" ] + ldflags += [ "--target=riscv64-linux-androideabi${android_api_level}" ] } } diff --git a/engine/src/build/toolchain/android/BUILD.gn b/engine/src/build/toolchain/android/BUILD.gn index bbce14bdc6719..18815092ca100 100644 --- a/engine/src/build/toolchain/android/BUILD.gn +++ b/engine/src/build/toolchain/android/BUILD.gn @@ -152,3 +152,7 @@ android_toolchains_helper("arm64_apilevel26") { android_api_level = 26 } } + +android_toolchains_helper("riscv64") { + toolchain_cpu = "riscv64" +} diff --git a/engine/src/flutter/assets/native_assets.cc b/engine/src/flutter/assets/native_assets.cc index afdf7ad86f549..36a56d6dbb677 100644 --- a/engine/src/flutter/assets/native_assets.cc +++ b/engine/src/flutter/assets/native_assets.cc @@ -17,6 +17,10 @@ namespace flutter { #define kTargetArchitectureName "ia32" #elif defined(FML_ARCH_CPU_X86_64) #define kTargetArchitectureName "x64" +#elif defined(FML_ARCH_CPU_RISCV32) +#define kTargetArchitectureName "riscv32" +#elif defined(FML_ARCH_CPU_RISCV64) +#define kTargetArchitectureName "riscv64" #else #error Target architecture detection failed. #endif diff --git a/engine/src/flutter/ci/builders/linux_android_aot_engine.json b/engine/src/flutter/ci/builders/linux_android_aot_engine.json index b4078a6f131df..fd8f4729b3d28 100644 --- a/engine/src/flutter/ci/builders/linux_android_aot_engine.json +++ b/engine/src/flutter/ci/builders/linux_android_aot_engine.json @@ -299,6 +299,98 @@ "flutter/shell/platform/android:analyze_snapshot" ] } + }, + { + "archives": [ + { + "name": "ci/android_profile_riscv64", + "type": "gcs", + "base_path": "out/ci/android_profile_riscv64/zip_archives/", + "include_paths": [ + "out/ci/android_profile_riscv64/zip_archives/android-riscv64-profile/artifacts.zip", + "out/ci/android_profile_riscv64/zip_archives/android-riscv64-profile/linux-x64.zip", + "out/ci/android_profile_riscv64/zip_archives/android-riscv64-profile/symbols.zip", + "out/ci/android_profile_riscv64/zip_archives/android-riscv64-profile/analyze-snapshot-linux-x64.zip", + "out/ci/android_profile_riscv64/zip_archives/download.flutter.io" + ], + "realm": "production" + } + ], + "drone_dimensions": [ + "device_type=none", + "os=Linux" + ], + "gclient_variables": { + "use_rbe": true + }, + "gn": [ + "--target-dir", + "ci/android_profile_riscv64", + "--runtime-mode", + "profile", + "--android", + "--android-cpu", + "riscv64", + "--rbe", + "--no-goma" + ], + "name": "ci/android_profile_riscv64", + "description": "Produces profile mode artifacts to target riscv64 Android from a Linux host.", + "ninja": { + "config": "ci/android_profile_riscv64", + "targets": [ + "default", + "clang_x64/gen_snapshot", + "flutter/shell/platform/android:abi_jars", + "flutter/shell/platform/android:analyze_snapshot" + ] + } + }, + { + "archives": [ + { + "name": "ci/android_release_riscv64", + "type": "gcs", + "base_path": "out/ci/android_release_riscv64/zip_archives/", + "include_paths": [ + "out/ci/android_release_riscv64/zip_archives/android-riscv64-release/artifacts.zip", + "out/ci/android_release_riscv64/zip_archives/android-riscv64-release/linux-x64.zip", + "out/ci/android_release_riscv64/zip_archives/android-riscv64-release/symbols.zip", + "out/ci/android_release_riscv64/zip_archives/android-riscv64-release/analyze-snapshot-linux-x64.zip", + "out/ci/android_release_riscv64/zip_archives/download.flutter.io" + ], + "realm": "production" + } + ], + "drone_dimensions": [ + "device_type=none", + "os=Linux" + ], + "gclient_variables": { + "use_rbe": true + }, + "gn": [ + "--target-dir", + "ci/android_release_riscv64", + "--runtime-mode", + "release", + "--android", + "--android-cpu", + "riscv64", + "--rbe", + "--no-goma" + ], + "name": "ci/android_release_riscv64", + "description": "Produces release mode artifacts to target riscv64 Android from a Linux host.", + "ninja": { + "config": "ci/android_release_riscv64", + "targets": [ + "default", + "clang_x64/gen_snapshot", + "flutter/shell/platform/android:abi_jars", + "flutter/shell/platform/android:analyze_snapshot" + ] + } } ], "generators": { diff --git a/engine/src/flutter/ci/builders/linux_android_debug_engine.json b/engine/src/flutter/ci/builders/linux_android_debug_engine.json index 0cc52f088b2c2..f0632b4578a57 100644 --- a/engine/src/flutter/ci/builders/linux_android_debug_engine.json +++ b/engine/src/flutter/ci/builders/linux_android_debug_engine.json @@ -192,6 +192,50 @@ "flutter/impeller/toolkit/interop:sdk" ] } + }, + { + "archives": [ + { + "name": "ci/android_debug_riscv64", + "type": "gcs", + "base_path": "out/ci/android_debug_riscv64/zip_archives/", + "include_paths": [ + "out/ci/android_debug_riscv64/zip_archives/android-riscv64/artifacts.zip", + "out/ci/android_debug_riscv64/zip_archives/android-riscv64/android-riscv64-embedder.zip", + "out/ci/android_debug_riscv64/zip_archives/android-riscv64/impeller_sdk.zip", + "out/ci/android_debug_riscv64/zip_archives/android-riscv64/symbols.zip", + "out/ci/android_debug_riscv64/zip_archives/download.flutter.io" + ], + "realm": "production" + } + ], + "drone_dimensions": [ + "device_type=none", + "os=Linux" + ], + "gclient_variables": { + "use_rbe": true + }, + "gn": [ + "--target-dir", + "ci/android_debug_riscv64", + "--android", + "--android-cpu=riscv64", + "--no-lto", + "--rbe", + "--no-goma" + ], + "name": "ci/android_debug_riscv64", + "description": "Produces debug mode artifacts to target riscv64 Android from a Linux host.", + "ninja": { + "config": "ci/android_debug_riscv64", + "targets": [ + "flutter", + "flutter/shell/platform/android:abi_jars", + "flutter/shell/platform/embedder:embedder-archive", + "flutter/impeller/toolkit/interop:sdk" + ] + } } ], "generators": { diff --git a/engine/src/flutter/ci/builders/local_engine.json b/engine/src/flutter/ci/builders/local_engine.json index eb13020cff644..51ff9ac8f0329 100644 --- a/engine/src/flutter/ci/builders/local_engine.json +++ b/engine/src/flutter/ci/builders/local_engine.json @@ -261,6 +261,32 @@ "targets": [] } }, + { + "cas_archive": false, + "drone_dimensions": [ + "os=Linux", + "device_type=none" + ], + "gclient_variables": { + "use_rbe": true + }, + "gn": [ + "--runtime-mode", + "debug", + "--android", + "--android-cpu=riscv64", + "--no-stripped", + "--no-lto", + "--rbe", + "--no-goma" + ], + "name": "linux/android_debug_riscv64", + "description": "Builds a debug mode engine that targets riscv64 Android from a Linux host.", + "ninja": { + "config": "android_debug_riscv64", + "targets": [] + } + }, { "cas_archive": false, "drone_dimensions": [ diff --git a/engine/src/flutter/fml/build_config.h b/engine/src/flutter/fml/build_config.h index d42a88e5bbce0..3fa17dae0b120 100644 --- a/engine/src/flutter/fml/build_config.h +++ b/engine/src/flutter/fml/build_config.h @@ -93,6 +93,16 @@ #define FML_ARCH_CPU_ARM64 1 #define FML_ARCH_CPU_64_BITS 1 #define FML_ARCH_CPU_LITTLE_ENDIAN 1 +#elif defined(__riscv) && __SIZEOF_POINTER__ == 4 +#define FML_ARCH_CPU_RISCV_FAMILY 1 +#define FML_ARCH_CPU_RISCV32 1 +#define FML_ARCH_CPU_32_BITS 1 +#define FML_ARCH_CPU_LITTLE_ENDIAN 1 +#elif defined(__riscv) && __SIZEOF_POINTER__ == 8 +#define FML_ARCH_CPU_RISCV_FAMILY 1 +#define FML_ARCH_CPU_RISCV64 1 +#define FML_ARCH_CPU_64_BITS 1 +#define FML_ARCH_CPU_LITTLE_ENDIAN 1 #elif defined(__pnacl__) #define FML_ARCH_CPU_32_BITS 1 #define FML_ARCH_CPU_LITTLE_ENDIAN 1 diff --git a/engine/src/flutter/lib/snapshot/BUILD.gn b/engine/src/flutter/lib/snapshot/BUILD.gn index 5a6d65480195e..e4b52cac21985 100644 --- a/engine/src/flutter/lib/snapshot/BUILD.gn +++ b/engine/src/flutter/lib/snapshot/BUILD.gn @@ -41,13 +41,14 @@ group("generate_snapshot_bins") { # For iOS, Android target builds: all AOT target CPUs are arm/arm64. public_deps += [ ":create_arm_gen_snapshot" ] } else if (target_cpu == "arm" || target_cpu == "arm64" || - target_cpu == "x64") { + target_cpu == "x64" || target_cpu == "riscv64") { # For other host OSes, build gen_snapshot directly. public_deps = [ "$dart_src/runtime/bin:gen_snapshot($host_toolchain)" ] } # Build analyze_snapshot for 64-bit target CPUs. - if (host_os == "linux" && (target_cpu == "x64" || target_cpu == "arm64")) { + if (host_os == "linux" && (target_cpu == "x64" || target_cpu == "arm64" || + target_cpu == "riscv64")) { public_deps += [ "$dart_src/runtime/bin:analyze_snapshot($host_toolchain)" ] } } diff --git a/engine/src/flutter/shell/platform/android/BUILD.gn b/engine/src/flutter/shell/platform/android/BUILD.gn index 704f01fe1436d..26ce21b303c77 100644 --- a/engine/src/flutter/shell/platform/android/BUILD.gn +++ b/engine/src/flutter/shell/platform/android/BUILD.gn @@ -796,7 +796,8 @@ if (target_cpu != "x86") { } } -if (host_os == "linux" && (target_cpu == "x64" || target_cpu == "arm64")) { +if (host_os == "linux" && + (target_cpu == "x64" || target_cpu == "arm64" || target_cpu == "riscv64")) { zip_bundle("analyze_snapshot") { deps = [ "$dart_src/runtime/bin:analyze_snapshot($host_toolchain)" ] diff --git a/engine/src/flutter/third_party/tonic/common/build_config.h b/engine/src/flutter/third_party/tonic/common/build_config.h index 365808a1a78ed..7174b618165aa 100644 --- a/engine/src/flutter/third_party/tonic/common/build_config.h +++ b/engine/src/flutter/third_party/tonic/common/build_config.h @@ -88,6 +88,16 @@ #define ARCH_CPU_ARM64 1 #define ARCH_CPU_64_BITS 1 #define ARCH_CPU_LITTLE_ENDIAN 1 +#elif defined(__riscv) && __SIZEOF_POINTER__ == 4 +#define ARCH_CPU_RISCV_FAMILY 1 +#define ARCH_CPU_RISCV32 1 +#define ARCH_CPU_32_BITS 1 +#define ARCH_CPU_LITTLE_ENDIAN 1 +#elif defined(__riscv) && __SIZEOF_POINTER__ == 8 +#define ARCH_CPU_RISCV_FAMILY 1 +#define ARCH_CPU_RISCV64 1 +#define ARCH_CPU_64_BITS 1 +#define ARCH_CPU_LITTLE_ENDIAN 1 #elif defined(__pnacl__) #define ARCH_CPU_32_BITS 1 #define ARCH_CPU_LITTLE_ENDIAN 1 diff --git a/engine/src/flutter/tools/engine_tool/lib/src/commands/run_command.dart b/engine/src/flutter/tools/engine_tool/lib/src/commands/run_command.dart index c47fcd8695113..95db79113e574 100644 --- a/engine/src/flutter/tools/engine_tool/lib/src/commands/run_command.dart +++ b/engine/src/flutter/tools/engine_tool/lib/src/commands/run_command.dart @@ -234,6 +234,7 @@ final class RunTarget { TargetPlatform.androidX86 => 'android_${mode}_x86', TargetPlatform.androidX64 => 'android_${mode}_x64', TargetPlatform.androidArm64 => 'android_${mode}_arm64', + TargetPlatform.androidRiscv64 => 'android_${mode}_riscv64', // DESKTOP (MacOS, Linux, Windows) // We do not support cross-builds, so implicitly assume the host platform. @@ -291,6 +292,7 @@ final class RunTarget { TargetPlatform.androidUnspecified || TargetPlatform.androidX86 || TargetPlatform.androidX64 || + TargetPlatform.androidRiscv64 || TargetPlatform.androidArm64 => [ Label.parseGn('//flutter/shell/platform/android:android_jar'), ], diff --git a/engine/src/flutter/tools/engine_tool/lib/src/flutter_tool_interop/target_platform.dart b/engine/src/flutter/tools/engine_tool/lib/src/flutter_tool_interop/target_platform.dart index 7306f31e990c9..73918c8080744 100644 --- a/engine/src/flutter/tools/engine_tool/lib/src/flutter_tool_interop/target_platform.dart +++ b/engine/src/flutter/tools/engine_tool/lib/src/flutter_tool_interop/target_platform.dart @@ -23,6 +23,9 @@ final class TargetPlatform { /// Android ARM64. static const androidArm64 = TargetPlatform._('android-arm64'); + /// Android RISCV64. + static const androidRiscv64 = TargetPlatform._('android-riscv64'); + /// Android x64. static const androidX64 = TargetPlatform._('android-x64'); @@ -87,6 +90,7 @@ final class TargetPlatform { androidUnspecified, androidArm, androidArm64, + androidRiscv64, androidX64, androidX86, linuxArm64, diff --git a/engine/src/flutter/tools/engine_tool/test/run_target_test.dart b/engine/src/flutter/tools/engine_tool/test/run_target_test.dart index 861adda06b508..4480d6a27ed0b 100644 --- a/engine/src/flutter/tools/engine_tool/test/run_target_test.dart +++ b/engine/src/flutter/tools/engine_tool/test/run_target_test.dart @@ -63,6 +63,7 @@ void main() { TargetPlatform.androidX86: 'android_debug_x86', TargetPlatform.androidX64: 'android_debug_x64', TargetPlatform.androidArm64: 'android_debug_arm64', + TargetPlatform.androidRiscv64: 'android_debug_riscv64', TargetPlatform.darwinUnspecified: 'host_debug', TargetPlatform.darwinX64: 'host_debug', TargetPlatform.darwinArm64: 'host_debug_arm64', @@ -100,6 +101,9 @@ void main() { TargetPlatform.androidX86: [Label.parseGn('//flutter/shell/platform/android:android_jar')], TargetPlatform.androidX64: [Label.parseGn('//flutter/shell/platform/android:android_jar')], TargetPlatform.androidArm64: [Label.parseGn('//flutter/shell/platform/android:android_jar')], + TargetPlatform.androidRiscv64: [ + Label.parseGn('//flutter/shell/platform/android:android_jar'), + ], TargetPlatform.iOSUnspecified: [ Label.parseGn('//flutter/shell/platform/darwin/ios:flutter_framework'), ], diff --git a/engine/src/flutter/tools/gn b/engine/src/flutter/tools/gn index c9352aea16603..f5830300f0099 100755 --- a/engine/src/flutter/tools/gn +++ b/engine/src/flutter/tools/gn @@ -947,7 +947,7 @@ def parse_args(args): ) parser.add_argument('--android', dest='target_os', action='store_const', const='android') parser.add_argument( - '--android-cpu', type=str, choices=['arm', 'x64', 'x86', 'arm64'], default='arm' + '--android-cpu', type=str, choices=['arm', 'x64', 'x86', 'arm64', 'riscv64'], default='arm' ) parser.add_argument('--ios', dest='target_os', action='store_const', const='ios') parser.add_argument('--mac', dest='target_os', action='store_const', const='mac')