diff --git a/build/zip.py b/build/zip.py new file mode 100755 index 0000000000000000000000000000000000000000..b257a7ad3c53ccf003267ae2ff019a5e5622e55b --- /dev/null +++ b/build/zip.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python +# Copyright 2013 The Flutter Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import argparse +import zipfile +import os +import sys + + +def _zip_dir(path, zip_file, prefix): + path = path.rstrip('/\\') + for root, dirs, files in os.walk(path): + for file in files: + zip_file.write(os.path.join(root, file), os.path.join( + root.replace(path, prefix), file)) + + +def main(args): + zip_file = zipfile.ZipFile(args.output, 'w', zipfile.ZIP_DEFLATED) + for path, archive_name in args.input_pairs: + if os.path.isdir(path): + _zip_dir(path, zip_file, archive_name) + else: + zip_file.write(path, archive_name) + zip_file.close() + + +if __name__ == '__main__': + parser = argparse.ArgumentParser( + description='This script creates zip files.') + parser.add_argument('-o', dest='output', action='store', + help='The name of the output zip file.') + parser.add_argument('-i', dest='input_pairs', nargs=2, action='append', + help='The input file and its destination location in the zip archive.') + sys.exit(main(parser.parse_args())) diff --git a/build/zip_bundle.gni b/build/zip_bundle.gni new file mode 100644 index 0000000000000000000000000000000000000000..b1830de9978a9ab1ed54b728b597504e66cc1213 --- /dev/null +++ b/build/zip_bundle.gni @@ -0,0 +1,54 @@ +# Copyright 2013 The Flutter Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//flutter/common/config.gni") + +if (flutter_runtime_mode == "jit_release") { + android_zip_archive_dir = "android-$target_cpu-jit-release" +} else { + android_zip_archive_dir = "android-$target_cpu" +} + +# Creates a zip file in the $root_build_dir/zip_archives folder. +# +# The output variable specifies the name of the zip file to create. +# The files variable is an array of scopes that specify a source file or +# directory and a destination path in the archive to create. +# +# For example, to create a zip file named archive.zip with all files in the +# root directory of the archive: +# +# zip_bundle("sample") { +# output = "archive.zip" +# files = [ +# { +# source = "$root_build_dir/some/path/to/lib.so" +# destination = "lib.so" +# }, +# { +# source = "$root_build_dir/some/other/path/with/files" +# destination = "other_files" +# }, +# ] +# } +template("zip_bundle") { + assert(defined(invoker.output), "output must be defined") + assert(defined(invoker.files), "files must be defined as a list of scopes") + action(target_name) { + script = "//flutter/build/zip.py" + outputs = [ "$root_build_dir/zip_archives/${invoker.output}" ] + inputs = [] + deps = invoker.deps + + args = [ "-o", rebase_path(outputs[0]) ] + foreach(input, invoker.files) { + args += [ + "-i", + rebase_path(input.source), + rebase_path(input.destination), + ] + inputs += [ input.source ] + } + } +} diff --git a/shell/platform/android/BUILD.gn b/shell/platform/android/BUILD.gn index f2627ebcd112abb6ea4d1022f18315618270a482..cd57506e623b676a08e0d59635edb44557060ec3 100644 --- a/shell/platform/android/BUILD.gn +++ b/shell/platform/android/BUILD.gn @@ -3,6 +3,7 @@ # found in the LICENSE file. import("//build/config/android/config.gni") +import("//flutter/build/zip_bundle.gni") import("$flutter_root/common/config.gni") import("$flutter_root/shell/config.gni") import("$flutter_root/shell/gpu/gpu.gni") @@ -115,6 +116,125 @@ embedding_jar_path = "$root_out_dir/$embedding_jar_filename" embedding_sources_jar_filename = "$embedding_artifact_id-sources.jar" embedding_source_jar_path = "$root_out_dir/$embedding_sources_jar_filename" +android_java_sources = [ + "io/flutter/Log.java", + "io/flutter/app/FlutterActivity.java", + "io/flutter/app/FlutterActivityDelegate.java", + "io/flutter/app/FlutterActivityEvents.java", + "io/flutter/app/FlutterApplication.java", + "io/flutter/app/FlutterFragmentActivity.java", + "io/flutter/app/FlutterPluginRegistry.java", + "io/flutter/embedding/android/AndroidKeyProcessor.java", + "io/flutter/embedding/android/AndroidTouchProcessor.java", + "io/flutter/embedding/android/DrawableSplashScreen.java", + "io/flutter/embedding/android/FlutterActivity.java", + "io/flutter/embedding/android/FlutterActivityAndFragmentDelegate.java", + "io/flutter/embedding/android/FlutterActivityLaunchConfigs.java", + "io/flutter/embedding/android/FlutterEngineConfigurator.java", + "io/flutter/embedding/android/FlutterEngineProvider.java", + "io/flutter/embedding/android/FlutterFragment.java", + "io/flutter/embedding/android/FlutterFragmentActivity.java", + "io/flutter/embedding/android/FlutterSplashView.java", + "io/flutter/embedding/android/FlutterSurfaceView.java", + "io/flutter/embedding/android/FlutterTextureView.java", + "io/flutter/embedding/android/FlutterView.java", + "io/flutter/embedding/android/SplashScreen.java", + "io/flutter/embedding/android/SplashScreenProvider.java", + "io/flutter/embedding/engine/FlutterEngine.java", + "io/flutter/embedding/engine/FlutterEngineAndroidLifecycle.java", + "io/flutter/embedding/engine/FlutterEngineCache.java", + "io/flutter/embedding/engine/FlutterEnginePluginRegistry.java", + "io/flutter/embedding/engine/FlutterJNI.java", + "io/flutter/embedding/engine/FlutterShellArgs.java", + "io/flutter/embedding/engine/dart/DartExecutor.java", + "io/flutter/embedding/engine/dart/DartMessenger.java", + "io/flutter/embedding/engine/dart/PlatformMessageHandler.java", + "io/flutter/embedding/engine/plugins/FlutterPlugin.java", + "io/flutter/embedding/engine/plugins/PluginRegistry.java", + "io/flutter/embedding/engine/plugins/activity/ActivityAware.java", + "io/flutter/embedding/engine/plugins/activity/ActivityControlSurface.java", + "io/flutter/embedding/engine/plugins/activity/ActivityPluginBinding.java", + "io/flutter/embedding/engine/plugins/broadcastreceiver/BroadcastReceiverAware.java", + "io/flutter/embedding/engine/plugins/broadcastreceiver/BroadcastReceiverControlSurface.java", + "io/flutter/embedding/engine/plugins/broadcastreceiver/BroadcastReceiverPluginBinding.java", + "io/flutter/embedding/engine/plugins/contentprovider/ContentProviderAware.java", + "io/flutter/embedding/engine/plugins/contentprovider/ContentProviderControlSurface.java", + "io/flutter/embedding/engine/plugins/contentprovider/ContentProviderPluginBinding.java", + "io/flutter/embedding/engine/plugins/service/ServiceAware.java", + "io/flutter/embedding/engine/plugins/service/ServiceControlSurface.java", + "io/flutter/embedding/engine/plugins/service/ServicePluginBinding.java", + "io/flutter/embedding/engine/plugins/shim/ShimPluginRegistry.java", + "io/flutter/embedding/engine/plugins/shim/ShimRegistrar.java", + "io/flutter/embedding/engine/renderer/FlutterRenderer.java", + "io/flutter/embedding/engine/renderer/FlutterUiDisplayListener.java", + "io/flutter/embedding/engine/renderer/RenderSurface.java", + "io/flutter/embedding/engine/systemchannels/AccessibilityChannel.java", + "io/flutter/embedding/engine/systemchannels/KeyEventChannel.java", + "io/flutter/embedding/engine/systemchannels/LifecycleChannel.java", + "io/flutter/embedding/engine/systemchannels/LocalizationChannel.java", + "io/flutter/embedding/engine/systemchannels/NavigationChannel.java", + "io/flutter/embedding/engine/systemchannels/PlatformChannel.java", + "io/flutter/embedding/engine/systemchannels/PlatformViewsChannel.java", + "io/flutter/embedding/engine/systemchannels/SettingsChannel.java", + "io/flutter/embedding/engine/systemchannels/SystemChannel.java", + "io/flutter/embedding/engine/systemchannels/TextInputChannel.java", + "io/flutter/plugin/common/ActivityLifecycleListener.java", + "io/flutter/plugin/common/BasicMessageChannel.java", + "io/flutter/plugin/common/BinaryCodec.java", + "io/flutter/plugin/common/BinaryMessenger.java", + "io/flutter/plugin/common/ErrorLogResult.java", + "io/flutter/plugin/common/EventChannel.java", + "io/flutter/plugin/common/FlutterException.java", + "io/flutter/plugin/common/JSONMessageCodec.java", + "io/flutter/plugin/common/JSONMethodCodec.java", + "io/flutter/plugin/common/JSONUtil.java", + "io/flutter/plugin/common/MessageCodec.java", + "io/flutter/plugin/common/MethodCall.java", + "io/flutter/plugin/common/MethodChannel.java", + "io/flutter/plugin/common/MethodCodec.java", + "io/flutter/plugin/common/PluginRegistry.java", + "io/flutter/plugin/common/StandardMessageCodec.java", + "io/flutter/plugin/common/StandardMethodCodec.java", + "io/flutter/plugin/common/StringCodec.java", + "io/flutter/plugin/editing/InputConnectionAdaptor.java", + "io/flutter/plugin/editing/TextInputPlugin.java", + "io/flutter/plugin/platform/AccessibilityEventsDelegate.java", + "io/flutter/plugin/platform/PlatformPlugin.java", + "io/flutter/plugin/platform/PlatformView.java", + "io/flutter/plugin/platform/PlatformViewFactory.java", + "io/flutter/plugin/platform/PlatformViewRegistry.java", + "io/flutter/plugin/platform/PlatformViewRegistryImpl.java", + "io/flutter/plugin/platform/PlatformViewsAccessibilityDelegate.java", + "io/flutter/plugin/platform/PlatformViewsController.java", + "io/flutter/plugin/platform/SingleViewPresentation.java", + "io/flutter/plugin/platform/VirtualDisplayController.java", + "io/flutter/util/PathUtils.java", + "io/flutter/util/Preconditions.java", + "io/flutter/util/Predicate.java", + "io/flutter/view/AccessibilityBridge.java", + "io/flutter/view/AccessibilityViewEmbedder.java", + "io/flutter/view/FlutterCallbackInformation.java", + "io/flutter/view/FlutterMain.java", + "io/flutter/view/FlutterNativeView.java", + "io/flutter/view/FlutterRunArguments.java", + "io/flutter/view/FlutterView.java", + "io/flutter/view/ResourceCleaner.java", + "io/flutter/view/ResourceExtractor.java", + "io/flutter/view/ResourcePaths.java", + "io/flutter/view/TextureRegistry.java", + "io/flutter/view/VsyncWaiter.java", +] + +android_support_jars = [ + "//third_party/android_support/android_support_compat.jar", + "//third_party/android_support/android_support_annotations.jar", + "//third_party/android_support/android_support_fragment.jar", + "//third_party/android_support/android_arch_lifecycle_common.jar", + "//third_party/android_support/android_arch_lifecycle_common_java8.jar", + "//third_party/android_support/android_arch_lifecycle_runtime.jar", + "//third_party/android_support/android_arch_lifecycle_viewmodel.jar", +] + action("flutter_shell_java") { script = "//build/android/gyp/javac.py" depfile = "$target_gen_dir/$target_name.d" @@ -122,127 +242,10 @@ action("flutter_shell_java") { jar_path = embedding_jar_path source_jar_path = embedding_source_jar_path - sources = [ - "io/flutter/Log.java", - "io/flutter/app/FlutterActivity.java", - "io/flutter/app/FlutterActivityDelegate.java", - "io/flutter/app/FlutterActivityEvents.java", - "io/flutter/app/FlutterApplication.java", - "io/flutter/app/FlutterFragmentActivity.java", - "io/flutter/app/FlutterPluginRegistry.java", - "io/flutter/embedding/android/AndroidKeyProcessor.java", - "io/flutter/embedding/android/AndroidTouchProcessor.java", - "io/flutter/embedding/android/DrawableSplashScreen.java", - "io/flutter/embedding/android/FlutterActivity.java", - "io/flutter/embedding/android/FlutterActivityAndFragmentDelegate.java", - "io/flutter/embedding/android/FlutterActivityLaunchConfigs.java", - "io/flutter/embedding/android/FlutterEngineConfigurator.java", - "io/flutter/embedding/android/FlutterEngineProvider.java", - "io/flutter/embedding/android/FlutterFragment.java", - "io/flutter/embedding/android/FlutterFragmentActivity.java", - "io/flutter/embedding/android/FlutterSplashView.java", - "io/flutter/embedding/android/FlutterSurfaceView.java", - "io/flutter/embedding/android/FlutterTextureView.java", - "io/flutter/embedding/android/FlutterView.java", - "io/flutter/embedding/android/SplashScreen.java", - "io/flutter/embedding/android/SplashScreenProvider.java", - "io/flutter/embedding/engine/FlutterEngine.java", - "io/flutter/embedding/engine/FlutterEngineAndroidLifecycle.java", - "io/flutter/embedding/engine/FlutterEngineCache.java", - "io/flutter/embedding/engine/FlutterEnginePluginRegistry.java", - "io/flutter/embedding/engine/FlutterJNI.java", - "io/flutter/embedding/engine/FlutterShellArgs.java", - "io/flutter/embedding/engine/dart/DartExecutor.java", - "io/flutter/embedding/engine/dart/DartMessenger.java", - "io/flutter/embedding/engine/dart/PlatformMessageHandler.java", - "io/flutter/embedding/engine/plugins/FlutterPlugin.java", - "io/flutter/embedding/engine/plugins/PluginRegistry.java", - "io/flutter/embedding/engine/plugins/activity/ActivityAware.java", - "io/flutter/embedding/engine/plugins/activity/ActivityControlSurface.java", - "io/flutter/embedding/engine/plugins/activity/ActivityPluginBinding.java", - "io/flutter/embedding/engine/plugins/broadcastreceiver/BroadcastReceiverAware.java", - "io/flutter/embedding/engine/plugins/broadcastreceiver/BroadcastReceiverControlSurface.java", - "io/flutter/embedding/engine/plugins/broadcastreceiver/BroadcastReceiverPluginBinding.java", - "io/flutter/embedding/engine/plugins/contentprovider/ContentProviderAware.java", - "io/flutter/embedding/engine/plugins/contentprovider/ContentProviderControlSurface.java", - "io/flutter/embedding/engine/plugins/contentprovider/ContentProviderPluginBinding.java", - "io/flutter/embedding/engine/plugins/service/ServiceAware.java", - "io/flutter/embedding/engine/plugins/service/ServiceControlSurface.java", - "io/flutter/embedding/engine/plugins/service/ServicePluginBinding.java", - "io/flutter/embedding/engine/plugins/shim/ShimPluginRegistry.java", - "io/flutter/embedding/engine/plugins/shim/ShimRegistrar.java", - "io/flutter/embedding/engine/renderer/FlutterRenderer.java", - "io/flutter/embedding/engine/renderer/FlutterUiDisplayListener.java", - "io/flutter/embedding/engine/renderer/RenderSurface.java", - "io/flutter/embedding/engine/systemchannels/AccessibilityChannel.java", - "io/flutter/embedding/engine/systemchannels/KeyEventChannel.java", - "io/flutter/embedding/engine/systemchannels/LifecycleChannel.java", - "io/flutter/embedding/engine/systemchannels/LocalizationChannel.java", - "io/flutter/embedding/engine/systemchannels/NavigationChannel.java", - "io/flutter/embedding/engine/systemchannels/PlatformChannel.java", - "io/flutter/embedding/engine/systemchannels/PlatformViewsChannel.java", - "io/flutter/embedding/engine/systemchannels/SettingsChannel.java", - "io/flutter/embedding/engine/systemchannels/SystemChannel.java", - "io/flutter/embedding/engine/systemchannels/TextInputChannel.java", - "io/flutter/plugin/common/ActivityLifecycleListener.java", - "io/flutter/plugin/common/BasicMessageChannel.java", - "io/flutter/plugin/common/BinaryCodec.java", - "io/flutter/plugin/common/BinaryMessenger.java", - "io/flutter/plugin/common/ErrorLogResult.java", - "io/flutter/plugin/common/EventChannel.java", - "io/flutter/plugin/common/FlutterException.java", - "io/flutter/plugin/common/JSONMessageCodec.java", - "io/flutter/plugin/common/JSONMethodCodec.java", - "io/flutter/plugin/common/JSONUtil.java", - "io/flutter/plugin/common/MessageCodec.java", - "io/flutter/plugin/common/MethodCall.java", - "io/flutter/plugin/common/MethodChannel.java", - "io/flutter/plugin/common/MethodCodec.java", - "io/flutter/plugin/common/PluginRegistry.java", - "io/flutter/plugin/common/StandardMessageCodec.java", - "io/flutter/plugin/common/StandardMethodCodec.java", - "io/flutter/plugin/common/StringCodec.java", - "io/flutter/plugin/editing/InputConnectionAdaptor.java", - "io/flutter/plugin/editing/TextInputPlugin.java", - "io/flutter/plugin/platform/AccessibilityEventsDelegate.java", - "io/flutter/plugin/platform/PlatformPlugin.java", - "io/flutter/plugin/platform/PlatformView.java", - "io/flutter/plugin/platform/PlatformViewFactory.java", - "io/flutter/plugin/platform/PlatformViewRegistry.java", - "io/flutter/plugin/platform/PlatformViewRegistryImpl.java", - "io/flutter/plugin/platform/PlatformViewsAccessibilityDelegate.java", - "io/flutter/plugin/platform/PlatformViewsController.java", - "io/flutter/plugin/platform/SingleViewPresentation.java", - "io/flutter/plugin/platform/VirtualDisplayController.java", - "io/flutter/util/PathUtils.java", - "io/flutter/util/Preconditions.java", - "io/flutter/util/Predicate.java", - "io/flutter/view/AccessibilityBridge.java", - "io/flutter/view/AccessibilityViewEmbedder.java", - "io/flutter/view/FlutterCallbackInformation.java", - "io/flutter/view/FlutterMain.java", - "io/flutter/view/FlutterNativeView.java", - "io/flutter/view/FlutterRunArguments.java", - "io/flutter/view/FlutterView.java", - "io/flutter/view/ResourceCleaner.java", - "io/flutter/view/ResourceExtractor.java", - "io/flutter/view/ResourcePaths.java", - "io/flutter/view/TextureRegistry.java", - "io/flutter/view/VsyncWaiter.java", - ] + sources = android_java_sources sources += get_target_outputs(":gen_android_build_config_java") - android_support_jars = [ - "//third_party/android_support/android_support_compat.jar", - "//third_party/android_support/android_support_annotations.jar", - "//third_party/android_support/android_support_fragment.jar", - "//third_party/android_support/android_arch_lifecycle_common.jar", - "//third_party/android_support/android_arch_lifecycle_common_java8.jar", - "//third_party/android_support/android_arch_lifecycle_runtime.jar", - "//third_party/android_support/android_arch_lifecycle_viewmodel.jar", - ] - outputs = [ depfile, jar_path, @@ -305,7 +308,7 @@ action("icudtl_object") { ] } -action("android") { +action("android_jar") { script = "//build/android/gyp/create_flutter_jar.py" if (stripped_symbols) { @@ -468,3 +471,78 @@ action("robolectric_tests") { ":flutter_shell_java", ] } + +zip_bundle("android_symbols") { + output = "$android_zip_archive_dir/symbols.zip" + files = [ + { + source = "$root_build_dir/libflutter.so" + destination = "libflutter.so" + }, + ] + + deps = [ + ":flutter_shell_native", + ] +} + +zip_bundle("android") { + output = "$android_zip_archive_dir/artifacts.zip" + files = [ + { + source = "$root_build_dir/flutter.jar" + destination = "flutter.jar" + }, + ] + + deps = [ + ":android_jar", + ":android_symbols", + ] + + if (current_cpu == "x86" || current_cpu == "x64") { + files += [ + { + source = "$root_build_dir/lib.stripped/libflutter.so" + destination = "libflutter.so" + }, + ] + deps += [ ":flutter_shell_native" ] + } +} + +# TODO(dnfield): make these targets pass. +# https://github.com/flutter/flutter/issues/42400 +action("gen_android_javadoc") { + script = "//flutter/tools/gen_javadoc.py" + sources = android_java_sources + android_support_jars + + outputs = [ + "$target_gen_dir/javadocs", + ] + args = [ + "--out-dir", + rebase_path(outputs[0]), + "--android-source-root", + rebase_path("."), + "--build-config-path", + rebase_path(target_gen_dir), + "--third-party", + rebase_path("//third_party"), + ] +} + +zip_bundle("android_javadoc") { + output = "android-javadoc.zip" + javadoc_dir = get_target_outputs(":gen_android_javadoc") + + files = [ + { + source = javadoc_dir[0] + destination = "/" + }, + ] + deps = [ + ":gen_android_javadoc", + ] +} diff --git a/sky/dist/BUILD.gn b/sky/dist/BUILD.gn index c1b564a03ecce124dc17d66b2dafdb3c8628d241..0fa2681aa8d72787e56ada22d5723f45dc54d983 100644 --- a/sky/dist/BUILD.gn +++ b/sky/dist/BUILD.gn @@ -2,6 +2,8 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//flutter/build/zip_bundle.gni") + if (is_android) { action("flutter_services") { script = "$flutter_root/sky/tools/dist_dart_pkg.py" @@ -78,10 +80,23 @@ if (is_android) { "$flutter_root/sky/packages/sky_services:sky_services_pkg_helper", ] } -} -group("dist") { - if (is_android) { + zip_bundle("zip") { + output = "$android_zip_archive_dir/sky_engine.zip" + files = [ + { + source = "$root_build_dir/dist/packages/flutter_services" + destination = "flutter_services" + }, + { + source = "$root_build_dir/dist/packages/sky_engine" + destination = "sky_engine" + }, + { + source = "$root_build_dir/dist/packages/sky_services" + destination = "sky_services" + }, + ] deps = [ ":flutter_services", ":sky_engine", @@ -89,3 +104,11 @@ group("dist") { ] } } + +group("dist") { + if (is_android) { + deps = [ + ":zip", + ] + } +} diff --git a/tools/gen_javadoc.py b/tools/gen_javadoc.py index 6268e29e6c989f55109af17e52ace1d692a9ec50..0e5da15bc7a23d6038cd7c18b534daa498c5bebb 100755 --- a/tools/gen_javadoc.py +++ b/tools/gen_javadoc.py @@ -12,28 +12,35 @@ ANDROID_SRC_ROOT = 'flutter/shell/platform/android' def main(): - if not os.path.exists(ANDROID_SRC_ROOT): - print 'This script must be run at the root of the Flutter source tree' - return 1 - parser = argparse.ArgumentParser(description='Runs javadoc on Flutter Android libraries') parser.add_argument('--out-dir', type=str, required=True) + parser.add_argument('--android-source-root', type=str, default=ANDROID_SRC_ROOT) + parser.add_argument('--build-config-path', type=str) + parser.add_argument('--third-party', type=str, default='third_party') args = parser.parse_args() + if not os.path.exists(args.android_source_root): + print('This script must be run at the root of the Flutter source tree, or ' + 'the --android-source-root must be set.') + return 1 + if not os.path.exists(args.out_dir): os.makedirs(args.out_dir) classpath = [ - ANDROID_SRC_ROOT, - 'third_party/android_support/android_arch_lifecycle_common.jar', - 'third_party/android_support/android_arch_lifecycle_viewmodel.jar', - 'third_party/android_support/android_support_annotations.jar', - 'third_party/android_support/android_support_compat.jar', - 'third_party/android_support/android_support_fragment.jar', - 'third_party/android_tools/sdk/platforms/android-29/android.jar', - 'base/android/java/src', - 'third_party/jsr-305/src/ri/src/main/java', + args.android_source_root, + args.third_party + '/android_support/android_support_compat.jar', + args.third_party + '/android_support/android_support_annotations.jar', + args.third_party + '/android_support/android_support_fragment.jar', + args.third_party + '/android_support/android_arch_lifecycle_common.jar', + args.third_party + '/android_support/android_arch_lifecycle_common_java8.jar', + args.third_party + '/android_support/android_arch_lifecycle_runtime.jar', + args.third_party + '/android_support/android_arch_lifecycle_viewmodel.jar', + args.third_party + '/android_tools/sdk/platforms/android-29/android.jar', ] + if args.build_config_path: + classpath.append(args.build_config_path) + packages = [ 'io.flutter.app', 'io.flutter.embedding.android',