Test the Android embedding v2 (#42708)
* Test the Android embedding v2 * Update integration tests * Split into shards
This commit is contained in:
parent
3917e585c9
commit
08c645b3b2
82
.cirrus.yml
82
.cirrus.yml
@ -235,45 +235,41 @@ task:
|
||||
container:
|
||||
cpu: 4
|
||||
memory: 12G
|
||||
- name: integration_tests_gradle1-linux
|
||||
- name: gradle_tests-linux-shard-1
|
||||
env:
|
||||
SHARD: integration_tests
|
||||
SUBSHARD: gradle1
|
||||
test_script:
|
||||
# Unsetting CIRRUS_CHANGE_MESSAGE and CIRRUS_COMMIT_MESSAGE as they
|
||||
# might include non-ASCII characters which makes Gradle crash.
|
||||
# See: https://github.com/flutter/flutter/issues/24935
|
||||
# This is a temporary workaround until we figure how to properly configure
|
||||
# a UTF8 locale on Cirrus (or until the Gradle bug is fixed).
|
||||
# TODO(amirh): Set the locale to UTF8.
|
||||
- echo "$CIRRUS_CHANGE_MESSAGE" > /tmp/cirrus_change_message.txt
|
||||
- echo "$CIRRUS_COMMIT_MESSAGE" > /tmp/cirrus_commit_message.txt
|
||||
- export CIRRUS_CHANGE_MESSAGE=""
|
||||
- export CIRRUS_COMMIT_MESSAGE=""
|
||||
- dart --enable-asserts ./dev/bots/test.dart
|
||||
- export CIRRUS_CHANGE_MESSAGE=`cat /tmp/cirrus_change_message.txt`
|
||||
- export CIRRUS_COMMIT_MESSAGE=`cat /tmp/cirrus_commit_message.txt`
|
||||
container:
|
||||
cpu: 4
|
||||
memory: 12G
|
||||
- name: integration_tests_gradle2-linux
|
||||
- name: gradle_tests-linux-shard-2
|
||||
env:
|
||||
SHARD: integration_tests
|
||||
SUBSHARD: gradle2
|
||||
test_script:
|
||||
# Unsetting CIRRUS_CHANGE_MESSAGE and CIRRUS_COMMIT_MESSAGE as they
|
||||
# might include non-ASCII characters which makes Gradle crash.
|
||||
# See: https://github.com/flutter/flutter/issues/24935
|
||||
# This is a temporary workaround until we figure how to properly configure
|
||||
# a UTF8 locale on Cirrus (or until the Gradle bug is fixed).
|
||||
# TODO(amirh): Set the locale to UTF8.
|
||||
- echo "$CIRRUS_CHANGE_MESSAGE" > /tmp/cirrus_change_message.txt
|
||||
- echo "$CIRRUS_COMMIT_MESSAGE" > /tmp/cirrus_commit_message.txt
|
||||
- export CIRRUS_CHANGE_MESSAGE=""
|
||||
- export CIRRUS_COMMIT_MESSAGE=""
|
||||
- dart --enable-asserts ./dev/bots/test.dart
|
||||
- export CIRRUS_CHANGE_MESSAGE=`cat /tmp/cirrus_change_message.txt`
|
||||
- export CIRRUS_COMMIT_MESSAGE=`cat /tmp/cirrus_commit_message.txt`
|
||||
container:
|
||||
cpu: 4
|
||||
memory: 12G
|
||||
- name: gradle_embedding_v2_tests-linux-shard-1
|
||||
env:
|
||||
SHARD: integration_tests
|
||||
SUBSHARD: gradle1
|
||||
ENABLE_ANDROID_EMBEDDING_V2: 'true'
|
||||
test_script:
|
||||
- dart --enable-asserts ./dev/bots/test.dart
|
||||
container:
|
||||
cpu: 4
|
||||
memory: 12G
|
||||
- name: gradle_embedding_v2_tests-linux-shard-2
|
||||
env:
|
||||
SHARD: integration_tests
|
||||
SUBSHARD: gradle2
|
||||
ENABLE_ANDROID_EMBEDDING_V2: 'true'
|
||||
test_script:
|
||||
- dart --enable-asserts ./dev/bots/test.dart
|
||||
container:
|
||||
cpu: 4
|
||||
memory: 12G
|
||||
@ -433,7 +429,7 @@ task:
|
||||
- CMD /S /C "IF EXIST "bin\cache\pkg\tests\" RMDIR /S /Q bin\cache\pkg\tests"
|
||||
- git clone https://github.com/flutter/tests.git bin\cache\pkg\tests
|
||||
- dart --enable-asserts dev\customer_testing\run_tests.dart --skip-on-fetch-failure --skip-template bin/cache/pkg/tests/registry/*.test
|
||||
- name: integration_tests_gradle1-windows
|
||||
- name: gradle_tests-windows-shard-1
|
||||
env:
|
||||
SHARD: integration_tests
|
||||
SUBSHARD: gradle1
|
||||
@ -442,7 +438,7 @@ task:
|
||||
container:
|
||||
cpu: 4
|
||||
memory: 12G
|
||||
- name: integration_tests_gradle2-windows
|
||||
- name: gradle_tests-windows-shard-2
|
||||
env:
|
||||
SHARD: integration_tests
|
||||
SUBSHARD: gradle2
|
||||
@ -451,6 +447,26 @@ task:
|
||||
container:
|
||||
cpu: 4
|
||||
memory: 12G
|
||||
- name: gradle_embedding_v2_tests-windows-shard-1
|
||||
env:
|
||||
SHARD: integration_tests
|
||||
SUBSHARD: gradle1
|
||||
ENABLE_ANDROID_EMBEDDING_V2: 'true'
|
||||
test_script:
|
||||
- dart --enable-asserts dev\bots\test.dart
|
||||
container:
|
||||
cpu: 4
|
||||
memory: 12G
|
||||
- name: gradle_embedding_v2_tests-windows-shard-2
|
||||
env:
|
||||
SHARD: integration_tests
|
||||
SUBSHARD: gradle2
|
||||
ENABLE_ANDROID_EMBEDDING_V2: 'true'
|
||||
test_script:
|
||||
- dart --enable-asserts dev\bots\test.dart
|
||||
container:
|
||||
cpu: 4
|
||||
memory: 12G
|
||||
|
||||
task:
|
||||
use_compute_credits: $CIRRUS_USER_COLLABORATOR == 'true'
|
||||
@ -627,8 +643,14 @@ docker_builder:
|
||||
- tool_tests_integration-linux
|
||||
- build_tests-linux
|
||||
- integration_tests-linux
|
||||
- integration_tests_gradle1-linux
|
||||
- integration_tests_gradle2-linux
|
||||
- gradle_tests-linux-shard-1
|
||||
- gradle_tests-linux-shard-2
|
||||
- gradle_embedding_v2_tests-linux-shard-1
|
||||
- gradle_embedding_v2_tests-linux-shard-2
|
||||
- gradle_tests-windows-shard-1
|
||||
- gradle_tests-windows-shard-2
|
||||
- gradle_embedding_v2_tests-windows-shard-1
|
||||
- gradle_embedding_v2_tests-windows-shard-2
|
||||
- release_smoke_tests
|
||||
build_script: "$CIRRUS_WORKING_DIR/dev/ci/docker_linux/docker_build.sh"
|
||||
login_script: "$CIRRUS_WORKING_DIR/dev/ci/docker_linux/docker_login.sh"
|
||||
|
@ -8,7 +8,7 @@
|
||||
tests=(
|
||||
"dev/integration_tests/release_smoke_test"
|
||||
"dev/integration_tests/abstract_method_smoke_test"
|
||||
"dev/integration_tests/android_embedding_2"
|
||||
"dev/integration_tests/android_embedding_v2_smoke_test"
|
||||
)
|
||||
|
||||
# The devices where the tests are run.
|
||||
|
@ -925,8 +925,6 @@ Future<void> _runIntegrationTests() async {
|
||||
// TODO(jmagman): Re-enable once flakiness is resolved.
|
||||
// await _runDevicelabTest('module_test_ios');
|
||||
}
|
||||
// This does less work if the subshard isn't Android.
|
||||
await _androidPluginTest();
|
||||
}
|
||||
}
|
||||
|
||||
@ -949,44 +947,30 @@ String get androidSdkRoot {
|
||||
return androidSdkRoot;
|
||||
}
|
||||
|
||||
Future<void> _androidPluginTest() async {
|
||||
if (androidSdkRoot == null) {
|
||||
print('No Android SDK detected, skipping Android Plugin test.');
|
||||
return;
|
||||
}
|
||||
|
||||
final Map<String, String> env = <String, String> {
|
||||
'ANDROID_HOME': androidSdkRoot,
|
||||
'ANDROID_SDK_ROOT': androidSdkRoot,
|
||||
};
|
||||
|
||||
await _runDevicelabTest('plugin_test', env: env);
|
||||
}
|
||||
|
||||
Future<void> _androidGradleTests(String subShard) async {
|
||||
// TODO(dnfield): gradlew is crashing on the cirrus image and it's not clear why.
|
||||
if (androidSdkRoot == null || Platform.isWindows) {
|
||||
print('No Android SDK detected or on Windows, skipping Android gradle test.');
|
||||
return;
|
||||
}
|
||||
|
||||
final Map<String, String> env = <String, String> {
|
||||
final Map<String, String> defaultEnv = <String, String>{
|
||||
'ANDROID_HOME': androidSdkRoot,
|
||||
'ANDROID_SDK_ROOT': androidSdkRoot,
|
||||
'ENABLE_ANDROID_EMBEDDING_V2': Platform.environment['ENABLE_ANDROID_EMBEDDING_V2'] ?? '',
|
||||
};
|
||||
|
||||
if (subShard == 'gradle1') {
|
||||
await _runDevicelabTest('gradle_plugin_light_apk_test', env: env);
|
||||
await _runDevicelabTest('gradle_plugin_fat_apk_test', env: env);
|
||||
await _runDevicelabTest('gradle_r8_test', env: env);
|
||||
await _runDevicelabTest('gradle_non_android_plugin_test', env: env);
|
||||
await _runDevicelabTest('gradle_jetifier_test', env: env);
|
||||
await _runDevicelabTest('gradle_plugin_light_apk_test', env: defaultEnv);
|
||||
await _runDevicelabTest('gradle_plugin_fat_apk_test', env: defaultEnv);
|
||||
await _runDevicelabTest('gradle_r8_test', env: defaultEnv);
|
||||
await _runDevicelabTest('gradle_non_android_plugin_test', env: defaultEnv);
|
||||
await _runDevicelabTest('gradle_jetifier_test', env: defaultEnv);
|
||||
}
|
||||
if (subShard == 'gradle2') {
|
||||
await _runDevicelabTest('gradle_plugin_bundle_test', env: env);
|
||||
await _runDevicelabTest('module_test', env: env);
|
||||
await _runDevicelabTest('module_host_with_custom_build_test', env: env);
|
||||
await _runDevicelabTest('build_aar_module_test', env: env);
|
||||
await _runDevicelabTest('gradle_plugin_bundle_test', env: defaultEnv);
|
||||
await _runDevicelabTest('module_test', env: defaultEnv);
|
||||
await _runDevicelabTest('module_host_with_custom_build_test', env: defaultEnv);
|
||||
await _runDevicelabTest('build_aar_module_test', env: defaultEnv);
|
||||
await _runDevicelabTest('plugin_test', env: defaultEnv);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -13,6 +13,8 @@ import 'package:path/path.dart' as path;
|
||||
final String gradlew = Platform.isWindows ? 'gradlew.bat' : 'gradlew';
|
||||
final String gradlewExecutable = Platform.isWindows ? gradlew : './$gradlew';
|
||||
|
||||
final bool useAndroidEmbeddingV2 = Platform.environment['ENABLE_ANDROID_EMBEDDING_V2'] == 'true';
|
||||
|
||||
/// Tests that the Android app containing a Flutter module can be built when
|
||||
/// it has custom build types and flavors.
|
||||
Future<void> main() async {
|
||||
@ -53,7 +55,14 @@ Future<void> main() async {
|
||||
final Directory hostAppDir = Directory(path.join(tempDir.path, 'hello_host_app_with_custom_build'));
|
||||
mkdir(hostAppDir);
|
||||
recursiveCopy(
|
||||
Directory(path.join(flutterDirectory.path, 'dev', 'integration_tests', 'module_host_with_custom_build')),
|
||||
Directory(
|
||||
path.join(
|
||||
flutterDirectory.path,
|
||||
'dev',
|
||||
'integration_tests',
|
||||
useAndroidEmbeddingV2 ? 'module_host_with_custom_build_v2_embedding' : 'module_host_with_custom_build',
|
||||
),
|
||||
),
|
||||
hostAppDir,
|
||||
);
|
||||
copy(
|
||||
|
@ -13,9 +13,12 @@ import 'package:path/path.dart' as path;
|
||||
final String gradlew = Platform.isWindows ? 'gradlew.bat' : 'gradlew';
|
||||
final String gradlewExecutable = Platform.isWindows ? gradlew : './$gradlew';
|
||||
|
||||
final bool useAndroidEmbeddingV2 = Platform.environment['ENABLE_ANDROID_EMBEDDING_V2'] == 'true';
|
||||
|
||||
/// Tests that the Flutter module project template works and supports
|
||||
/// adding Flutter to an existing Android app.
|
||||
Future<void> main() async {
|
||||
print(useAndroidEmbeddingV2);
|
||||
await task(() async {
|
||||
|
||||
section('Find Java');
|
||||
@ -143,7 +146,14 @@ Future<void> main() async {
|
||||
final Directory hostApp = Directory(path.join(tempDir.path, 'hello_host_app'));
|
||||
mkdir(hostApp);
|
||||
recursiveCopy(
|
||||
Directory(path.join(flutterDirectory.path, 'dev', 'integration_tests', 'android_host_app')),
|
||||
Directory(
|
||||
path.join(
|
||||
flutterDirectory.path,
|
||||
'dev',
|
||||
'integration_tests',
|
||||
useAndroidEmbeddingV2 ? 'android_host_app_v2_embedding' : 'android_host_app',
|
||||
),
|
||||
),
|
||||
hostApp,
|
||||
);
|
||||
copy(
|
||||
|
@ -38,7 +38,7 @@ android {
|
||||
|
||||
defaultConfig {
|
||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
||||
applicationId "com.example.android_embedding_2"
|
||||
applicationId "com.example.android_embedding_v2_smoke_test"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 28
|
||||
versionCode flutterVersionCode.toInteger()
|
||||
|
@ -1,5 +1,5 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.example.android_embedding_2">
|
||||
package="com.example.android_embedding_v2_smoke_test">
|
||||
<!-- Flutter needs it to communicate with the running application
|
||||
to allow setting breakpoints, to provide hot reload, etc.
|
||||
-->
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.example.android_embedding_2
|
||||
package com.example.android_embedding_v2_smoke_test
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import dev.flutter.plugins.GeneratedPluginRegistrant
|
||||
|
@ -0,0 +1,67 @@
|
||||
def localProperties = new Properties()
|
||||
def localPropertiesFile = rootProject.file('local.properties')
|
||||
if (localPropertiesFile.exists()) {
|
||||
localPropertiesFile.withReader('UTF-8') { reader ->
|
||||
localProperties.load(reader)
|
||||
}
|
||||
}
|
||||
|
||||
def flutterRoot = localProperties.getProperty('flutter.sdk')
|
||||
if (flutterRoot == null) {
|
||||
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
|
||||
}
|
||||
|
||||
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
|
||||
if (flutterVersionCode == null) {
|
||||
flutterVersionCode = '1'
|
||||
}
|
||||
|
||||
def flutterVersionName = localProperties.getProperty('flutter.versionName')
|
||||
if (flutterVersionName == null) {
|
||||
flutterVersionName = '1.0'
|
||||
}
|
||||
|
||||
apply plugin: 'com.android.application'
|
||||
apply plugin: 'kotlin-android'
|
||||
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
|
||||
|
||||
android {
|
||||
compileSdkVersion 28
|
||||
|
||||
sourceSets {
|
||||
main.java.srcDirs += 'src/main/kotlin'
|
||||
}
|
||||
|
||||
lintOptions {
|
||||
disable 'InvalidPackage'
|
||||
}
|
||||
|
||||
defaultConfig {
|
||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
||||
applicationId "com.example.android_embedding_v2_smoke_test"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 28
|
||||
versionCode flutterVersionCode.toInteger()
|
||||
versionName flutterVersionName
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
release {
|
||||
// TODO: Add your own signing config for the release build.
|
||||
// Signing with the debug keys for now, so `flutter run --release` works.
|
||||
signingConfig signingConfigs.debug
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
flutter {
|
||||
source '../..'
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
||||
testImplementation 'junit:junit:4.12'
|
||||
androidTestImplementation 'androidx.test:runner:1.1.1'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.example.android_embedding_2">
|
||||
package="com.example.android_embedding_v2_smoke_test">
|
||||
<!-- Flutter needs it to communicate with the running application
|
||||
to allow setting breakpoints, to provide hot reload, etc.
|
||||
-->
|
@ -1,5 +1,5 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.example.android_embedding_2">
|
||||
package="com.example.android_embedding_v2_smoke_test">
|
||||
<!-- io.flutter.app.FlutterApplication is an android.app.Application that
|
||||
calls FlutterMain.startInitialization(this); in its onCreate method.
|
||||
In most cases you can leave this as-is, but you if you want to provide
|
||||
@ -7,7 +7,7 @@
|
||||
FlutterApplication and put your custom class here. -->
|
||||
<application
|
||||
android:name="io.flutter.app.FlutterApplication"
|
||||
android:label="android_embedding_2">
|
||||
android:label="android_embedding_v2_smoke_test">
|
||||
<activity
|
||||
android:name=".MainActivity"
|
||||
android:launchMode="singleTop"
|
@ -0,0 +1,12 @@
|
||||
package com.example.android_embedding_v2_smoke_test
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import dev.flutter.plugins.GeneratedPluginRegistrant
|
||||
import io.flutter.embedding.android.FlutterActivity
|
||||
import io.flutter.embedding.engine.FlutterEngine
|
||||
|
||||
class MainActivity: FlutterActivity() {
|
||||
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
|
||||
GeneratedPluginRegistrant.registerWith(flutterEngine);
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.example.android_embedding_v2_smoke_test">
|
||||
<!-- Flutter needs it to communicate with the running application
|
||||
to allow setting breakpoints, to provide hot reload, etc.
|
||||
-->
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
</manifest>
|
@ -1,4 +1,4 @@
|
||||
name: android_embedding_2
|
||||
name: android_embedding_v2_smoke_test
|
||||
description: A new Flutter project.
|
||||
|
||||
# The following defines the version and build number for your application.
|
@ -0,0 +1,8 @@
|
||||
# Android host app
|
||||
|
||||
Android host app for a Flutter module created using
|
||||
```
|
||||
$ flutter create -t module hello
|
||||
```
|
||||
and placed in a sibling folder to (a clone of) the host app.
|
||||
Used by the `module_test.dart` device lab test.
|
@ -0,0 +1,23 @@
|
||||
apply plugin: 'com.android.application'
|
||||
|
||||
android {
|
||||
compileSdkVersion 28
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility 1.8
|
||||
targetCompatibility 1.8
|
||||
}
|
||||
|
||||
defaultConfig {
|
||||
applicationId "io.flutter.add2app"
|
||||
minSdkVersion 16
|
||||
targetSdkVersion 28
|
||||
versionCode 1
|
||||
versionName "1.0"
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation project(':flutter')
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="io.flutter.add2app">
|
||||
|
||||
<application android:allowBackup="false"
|
||||
tools:ignore="GoogleAppIndexingWarning,MissingApplicationIcon">
|
||||
<activity android:name=".MainActivity" />
|
||||
</application>
|
||||
</manifest>
|
@ -0,0 +1,13 @@
|
||||
package io.flutter.add2app;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import dev.flutter.plugins.GeneratedPluginRegistrant;
|
||||
import io.flutter.embedding.android.FlutterActivity;
|
||||
import io.flutter.embedding.engine.FlutterEngine;
|
||||
|
||||
public class MainActivity extends FlutterActivity {
|
||||
@Override
|
||||
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
|
||||
GeneratedPluginRegistrant.registerWith(flutterEngine);
|
||||
}
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
buildscript {
|
||||
repositories {
|
||||
google()
|
||||
jcenter()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:3.5.0'
|
||||
}
|
||||
}
|
||||
|
||||
allprojects {
|
||||
repositories {
|
||||
google()
|
||||
jcenter()
|
||||
}
|
||||
}
|
||||
|
||||
task clean(type: Delete) {
|
||||
delete rootProject.buildDir
|
||||
}
|
@ -0,0 +1,3 @@
|
||||
org.gradle.jvmargs=-Xmx1536m
|
||||
android.useAndroidX=true
|
||||
android.enableJetifier=true
|
6
dev/integration_tests/android_host_app_v2_embedding/gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
6
dev/integration_tests/android_host_app_v2_embedding/gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
#Mon Jun 25 14:13:36 CEST 2018
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip
|
@ -0,0 +1,3 @@
|
||||
include ':app'
|
||||
setBinding(new Binding([gradle: this]))
|
||||
evaluate(new File(settingsDir.parentFile, 'hello/.android/include_flutter.groovy'))
|
@ -0,0 +1,13 @@
|
||||
package io.flutter.add2app;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import dev.flutter.plugins.GeneratedPluginRegistrant;
|
||||
import io.flutter.embedding.android.FlutterActivity;
|
||||
import io.flutter.embedding.engine.FlutterEngine;
|
||||
|
||||
public class MainActivity extends FlutterActivity {
|
||||
@Override
|
||||
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
|
||||
GeneratedPluginRegistrant.registerWith(flutterEngine);
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
# Android host app
|
||||
|
||||
Android host app for a Flutter module created using
|
||||
```
|
||||
$ flutter create -t module hello
|
||||
```
|
||||
and placed in a sibling folder to (a clone of) the host app.
|
||||
Used by the `module_host_with_custom_build_test.dart` device lab test.
|
@ -0,0 +1,42 @@
|
||||
apply plugin: 'com.android.application'
|
||||
|
||||
android {
|
||||
compileSdkVersion 28
|
||||
compileOptions {
|
||||
sourceCompatibility 1.8
|
||||
targetCompatibility 1.8
|
||||
}
|
||||
defaultConfig {
|
||||
applicationId "io.flutter.addtoapp"
|
||||
minSdkVersion 16
|
||||
targetSdkVersion 28
|
||||
versionCode 1
|
||||
versionName "1.0"
|
||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
// Test build types.
|
||||
buildTypes {
|
||||
staging {
|
||||
initWith debug
|
||||
// This is required because the `:flutter` project doesn't define this custom build type.
|
||||
// Without the fallback, the Android plugin will make Gradle exit with the following error:
|
||||
// `Unable to find a matching variant of project :flutter`
|
||||
matchingFallbacks = ['debug']
|
||||
}
|
||||
prod {
|
||||
initWith release
|
||||
matchingFallbacks = ['release']
|
||||
}
|
||||
}
|
||||
// Test flavors.
|
||||
flavorDimensions "version"
|
||||
productFlavors {
|
||||
demo {
|
||||
dimension "version"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation project(':flutter')
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="io.flutter.addtoapp">
|
||||
|
||||
<application android:allowBackup="false"
|
||||
tools:ignore="GoogleAppIndexingWarning,MissingApplicationIcon">
|
||||
<activity android:name=".MainActivity" />
|
||||
</application>
|
||||
</manifest>
|
@ -0,0 +1,13 @@
|
||||
package io.flutter.add2app;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import dev.flutter.plugins.GeneratedPluginRegistrant;
|
||||
import io.flutter.embedding.android.FlutterActivity;
|
||||
import io.flutter.embedding.engine.FlutterEngine;
|
||||
|
||||
public class MainActivity extends FlutterActivity {
|
||||
@Override
|
||||
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
|
||||
GeneratedPluginRegistrant.registerWith(flutterEngine);
|
||||
}
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
buildscript {
|
||||
repositories {
|
||||
google()
|
||||
jcenter()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:3.2.1'
|
||||
}
|
||||
}
|
||||
|
||||
allprojects {
|
||||
repositories {
|
||||
google()
|
||||
jcenter()
|
||||
}
|
||||
}
|
||||
|
||||
task clean(type: Delete) {
|
||||
delete rootProject.buildDir
|
||||
}
|
@ -0,0 +1,3 @@
|
||||
org.gradle.jvmargs=-Xmx1536m
|
||||
android.useAndroidX=true
|
||||
android.enableJetifier=true
|
@ -0,0 +1,6 @@
|
||||
#Mon Jun 25 14:13:36 CEST 2018
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip
|
@ -0,0 +1,3 @@
|
||||
include ':app'
|
||||
setBinding(new Binding([gradle: this]))
|
||||
evaluate(new File(settingsDir.parentFile, 'hello/.android/include_flutter.groovy'))
|
@ -623,7 +623,7 @@ To edit platform code in an IDE see https://flutter.dev/developing-packages/#edi
|
||||
'description': projectDescription,
|
||||
'dartSdk': '$flutterRoot/bin/cache/dart-sdk',
|
||||
'androidX': androidX,
|
||||
'useNewAndroidEmbedding': featureFlags.isNewAndroidEmbeddingEnabled,
|
||||
'useAndroidEmbeddingV2': featureFlags.isAndroidEmbeddingV2Enabled,
|
||||
'androidMinApiLevel': android.minApiLevel,
|
||||
'androidSdkVersion': android_sdk.minimumAndroidSdkVersion,
|
||||
'androidFlutterJar': '$flutterRoot/bin/cache/artifacts/engine/android-arm/flutter.jar',
|
||||
|
@ -36,8 +36,8 @@ class FeatureFlags {
|
||||
/// Whether flutter desktop for Windows is enabled.
|
||||
bool get isWindowsEnabled => isEnabled(flutterWindowsDesktopFeature);
|
||||
|
||||
/// Whether the new Android embedding is enabled.
|
||||
bool get isNewAndroidEmbeddingEnabled => isEnabled(flutterNewAndroidEmbeddingFeature);
|
||||
/// Whether the Android embedding V2 is enabled.
|
||||
bool get isAndroidEmbeddingV2Enabled => isEnabled(flutterAndroidEmbeddingV2Feature);
|
||||
|
||||
/// Whether a particular feature is enabled for the current channel.
|
||||
///
|
||||
@ -71,7 +71,7 @@ const List<Feature> allFeatures = <Feature>[
|
||||
flutterMacOSDesktopFeature,
|
||||
flutterWindowsDesktopFeature,
|
||||
flutterBuildPluginAsAarFeature,
|
||||
flutterNewAndroidEmbeddingFeature,
|
||||
flutterAndroidEmbeddingV2Feature,
|
||||
];
|
||||
|
||||
/// The [Feature] for flutter web.
|
||||
@ -133,9 +133,10 @@ const Feature flutterBuildPluginAsAarFeature = Feature(
|
||||
);
|
||||
|
||||
/// The [Feature] for generating projects using the new Android embedding.
|
||||
const Feature flutterNewAndroidEmbeddingFeature = Feature(
|
||||
name: 'flutter create generates projects using the new Android embedding',
|
||||
configSetting: 'enable-new-android-embedding',
|
||||
const Feature flutterAndroidEmbeddingV2Feature = Feature(
|
||||
name: 'flutter create generates projects using the Android embedding V2',
|
||||
environmentOverride: 'ENABLE_ANDROID_EMBEDDING_V2',
|
||||
configSetting: 'enable-android-embedding-v2',
|
||||
master: FeatureChannelSetting(
|
||||
available: true,
|
||||
enabledByDefault: false,
|
||||
|
@ -617,7 +617,7 @@ class AndroidProject {
|
||||
_overwriteFromTemplate(fs.path.join(
|
||||
'module',
|
||||
'android',
|
||||
featureFlags.isNewAndroidEmbeddingEnabled ? 'library_new_embedding' : 'library',
|
||||
featureFlags.isAndroidEmbeddingV2Enabled ? 'library_new_embedding' : 'library',
|
||||
), ephemeralDirectory);
|
||||
_overwriteFromTemplate(fs.path.join('module', 'android', 'gradle'), ephemeralDirectory);
|
||||
gradle.injectGradleWrapperIfNeeded(ephemeralDirectory);
|
||||
@ -631,7 +631,7 @@ class AndroidProject {
|
||||
'projectName': parent.manifest.appName,
|
||||
'androidIdentifier': parent.manifest.androidPackage,
|
||||
'androidX': usesAndroidX,
|
||||
'useNewAndroidEmbedding': featureFlags.isNewAndroidEmbeddingEnabled,
|
||||
'useAndroidEmbeddingV2': featureFlags.isAndroidEmbeddingV2Enabled,
|
||||
},
|
||||
printStatusWhenWriting: false,
|
||||
overwriteExisting: true,
|
||||
|
@ -1,6 +1,6 @@
|
||||
package {{androidIdentifier}};
|
||||
|
||||
{{#useNewAndroidEmbedding}}
|
||||
{{#useAndroidEmbeddingV2}}
|
||||
{{#androidX}}
|
||||
import androidx.annotation.NonNull;
|
||||
{{/androidX}}
|
||||
@ -17,8 +17,8 @@ public class MainActivity extends FlutterActivity {
|
||||
GeneratedPluginRegistrant.registerWith(flutterEngine);
|
||||
}
|
||||
}
|
||||
{{/useNewAndroidEmbedding}}
|
||||
{{^useNewAndroidEmbedding}}
|
||||
{{/useAndroidEmbeddingV2}}
|
||||
{{^useAndroidEmbeddingV2}}
|
||||
import android.os.Bundle;
|
||||
import io.flutter.app.FlutterActivity;
|
||||
import io.flutter.plugins.GeneratedPluginRegistrant;
|
||||
@ -30,4 +30,4 @@ public class MainActivity extends FlutterActivity {
|
||||
GeneratedPluginRegistrant.registerWith(this);
|
||||
}
|
||||
}
|
||||
{{/useNewAndroidEmbedding}}
|
||||
{{/useAndroidEmbeddingV2}}
|
||||
|
@ -1,6 +1,6 @@
|
||||
package {{androidIdentifier}}
|
||||
|
||||
{{#useNewAndroidEmbedding}}
|
||||
{{#useAndroidEmbeddingV2}}
|
||||
{{#androidX}}
|
||||
import androidx.annotation.NonNull;
|
||||
{{/androidX}}
|
||||
@ -16,8 +16,8 @@ class MainActivity: FlutterActivity() {
|
||||
GeneratedPluginRegistrant.registerWith(flutterEngine);
|
||||
}
|
||||
}
|
||||
{{/useNewAndroidEmbedding}}
|
||||
{{^useNewAndroidEmbedding}}
|
||||
{{/useAndroidEmbeddingV2}}
|
||||
{{^useAndroidEmbeddingV2}}
|
||||
import android.os.Bundle
|
||||
import io.flutter.app.FlutterActivity
|
||||
import io.flutter.plugins.GeneratedPluginRegistrant
|
||||
@ -28,4 +28,4 @@ class MainActivity: FlutterActivity() {
|
||||
GeneratedPluginRegistrant.registerWith(this)
|
||||
}
|
||||
}
|
||||
{{/useNewAndroidEmbedding}}
|
||||
{{/useAndroidEmbeddingV2}}
|
||||
|
@ -16,7 +16,7 @@
|
||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
||||
android:hardwareAccelerated="true"
|
||||
android:windowSoftInputMode="adjustResize">
|
||||
{{^useNewAndroidEmbedding}}
|
||||
{{^useAndroidEmbeddingV2}}
|
||||
<!-- This keeps the window background of the activity showing
|
||||
until Flutter renders its first frame. It can be removed if
|
||||
there is no splash screen (such as the default splash screen
|
||||
@ -24,18 +24,18 @@
|
||||
<meta-data
|
||||
android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
|
||||
android:value="true" />
|
||||
{{/useNewAndroidEmbedding}}
|
||||
{{/useAndroidEmbeddingV2}}
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
{{#useNewAndroidEmbedding}}
|
||||
{{#useAndroidEmbeddingV2}}
|
||||
<!-- Don't delete the meta-data below.
|
||||
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
|
||||
<meta-data
|
||||
android:name="flutterEmbedding"
|
||||
android:value="2" />
|
||||
{{/useNewAndroidEmbedding}}
|
||||
{{/useAndroidEmbeddingV2}}
|
||||
</application>
|
||||
</manifest>
|
||||
|
@ -36,12 +36,12 @@
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
{{#useNewAndroidEmbedding}}
|
||||
{{#useAndroidEmbeddingV2}}
|
||||
<!-- Don't delete the meta-data below.
|
||||
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
|
||||
<meta-data
|
||||
android:name="flutterEmbedding"
|
||||
android:value="2" />
|
||||
{{/useNewAndroidEmbedding}}
|
||||
{{/useAndroidEmbeddingV2}}
|
||||
</application>
|
||||
</manifest>
|
||||
|
@ -1,7 +1,7 @@
|
||||
package {{androidIdentifier}}.host;
|
||||
|
||||
import android.os.Bundle;
|
||||
{{#useNewAndroidEmbedding}}
|
||||
{{#useAndroidEmbeddingV2}}
|
||||
{{#androidX}}
|
||||
import androidx.annotation.NonNull;
|
||||
{{/androidX}}
|
||||
@ -18,8 +18,8 @@ public class MainActivity extends FlutterActivity {
|
||||
GeneratedPluginRegistrant.registerWith(flutterEngine);
|
||||
}
|
||||
}
|
||||
{{/useNewAndroidEmbedding}}
|
||||
{{^useNewAndroidEmbedding}}
|
||||
{{/useAndroidEmbeddingV2}}
|
||||
{{^useAndroidEmbeddingV2}}
|
||||
import io.flutter.app.FlutterActivity;
|
||||
import io.flutter.plugins.GeneratedPluginRegistrant;
|
||||
|
||||
@ -30,4 +30,4 @@ public class MainActivity extends FlutterActivity {
|
||||
GeneratedPluginRegistrant.registerWith(this);
|
||||
}
|
||||
}
|
||||
{{/useNewAndroidEmbedding}}
|
||||
{{/useAndroidEmbeddingV2}}
|
||||
|
@ -1,6 +1,6 @@
|
||||
package {{androidIdentifier}};
|
||||
|
||||
{{#useNewAndroidEmbedding}}
|
||||
{{#useAndroidEmbeddingV2}}
|
||||
{{#androidX}}
|
||||
import androidx.annotation.NonNull;
|
||||
{{/androidX}}
|
||||
@ -29,9 +29,13 @@ public class {{pluginClass}} implements FlutterPlugin, MethodCallHandler {
|
||||
result.notImplemented();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
|
||||
}
|
||||
}
|
||||
{{/useNewAndroidEmbedding}}
|
||||
{{^useNewAndroidEmbedding}}
|
||||
{{/useAndroidEmbeddingV2}}
|
||||
{{^useAndroidEmbeddingV2}}
|
||||
import io.flutter.plugin.common.MethodCall;
|
||||
import io.flutter.plugin.common.MethodChannel;
|
||||
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
|
||||
@ -55,4 +59,4 @@ public class {{pluginClass}} implements MethodCallHandler {
|
||||
}
|
||||
}
|
||||
}
|
||||
{{/useNewAndroidEmbedding}}
|
||||
{{/useAndroidEmbeddingV2}}
|
||||
|
@ -1,6 +1,6 @@
|
||||
package {{androidIdentifier}}
|
||||
|
||||
{{#useNewAndroidEmbedding}}
|
||||
{{#useAndroidEmbeddingV2}}
|
||||
{{#androidX}}
|
||||
import androidx.annotation.NonNull;
|
||||
{{/androidX}}
|
||||
@ -15,7 +15,7 @@ import io.flutter.plugin.common.MethodChannel.Result
|
||||
|
||||
/** {{pluginClass}} */
|
||||
public class {{pluginClass}}: FlutterPlugin, MethodCallHandler {
|
||||
override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPluginBinding) {
|
||||
override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
|
||||
val channel = MethodChannel(flutterPluginBinding.getFlutterEngine().getDartExecutor(), "{{projectName}}")
|
||||
channel.setMethodCallHandler({{pluginClass}}());
|
||||
}
|
||||
@ -27,9 +27,12 @@ public class {{pluginClass}}: FlutterPlugin, MethodCallHandler {
|
||||
result.notImplemented()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {
|
||||
}
|
||||
}
|
||||
{{/useNewAndroidEmbedding}}
|
||||
{{^useNewAndroidEmbedding}}
|
||||
{{/useAndroidEmbeddingV2}}
|
||||
{{^useAndroidEmbeddingV2}}
|
||||
import io.flutter.plugin.common.MethodCall
|
||||
import io.flutter.plugin.common.MethodChannel
|
||||
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
|
||||
@ -53,4 +56,4 @@ class {{pluginClass}}: MethodCallHandler {
|
||||
}
|
||||
}
|
||||
}
|
||||
{{/useNewAndroidEmbedding}}
|
||||
{{/useAndroidEmbeddingV2}}
|
||||
|
@ -699,7 +699,7 @@ class TestFeatureFlags implements FeatureFlags {
|
||||
this.isMacOSEnabled = false,
|
||||
this.isWebEnabled = false,
|
||||
this.isWindowsEnabled = false,
|
||||
this.isNewAndroidEmbeddingEnabled = false,
|
||||
this.isAndroidEmbeddingV2Enabled = false,
|
||||
});
|
||||
|
||||
@override
|
||||
@ -715,7 +715,7 @@ class TestFeatureFlags implements FeatureFlags {
|
||||
final bool isWindowsEnabled;
|
||||
|
||||
@override
|
||||
final bool isNewAndroidEmbeddingEnabled;
|
||||
final bool isAndroidEmbeddingV2Enabled;
|
||||
|
||||
@override
|
||||
bool isEnabled(Feature feature) {
|
||||
@ -728,8 +728,8 @@ class TestFeatureFlags implements FeatureFlags {
|
||||
return isMacOSEnabled;
|
||||
case flutterWindowsDesktopFeature:
|
||||
return isWindowsEnabled;
|
||||
case flutterNewAndroidEmbeddingFeature:
|
||||
return isNewAndroidEmbeddingEnabled;
|
||||
case flutterAndroidEmbeddingV2Feature:
|
||||
return isAndroidEmbeddingV2Enabled;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user