通过MS AppCenter使用flavors发布构建Fatter android APK

通过MS AppCenter使用flavors发布构建Fatter android APK,android,flutter,gradle,visual-studio-app-center,Android,Flutter,Gradle,Visual Studio App Center,我一直在关注一系列文章,试图使用flavors在MS Appcenter上构建颤振应用程序,以实现应用程序环境(即dev/test/live) 为了实现这一点,我使用了单独的main-.dartentry文件方法,如中所示,然后配置Appcenter 我对android apk的构建有问题,因为缺少main.dart。我认为将-t参数传递给build命令可以处理这个问题 我将在下面添加构建脚本和日志,但正在执行的flatter命令如下:flatterbuildapk--flavor dev--r

我一直在关注一系列文章,试图使用flavors在MS Appcenter上构建颤振应用程序,以实现应用程序环境(即dev/test/live)

为了实现这一点,我使用了单独的
main-.dart
entry文件方法,如中所示,然后配置Appcenter

我对android apk的构建有问题,因为缺少
main.dart
。我认为将
-t
参数传递给build命令可以处理这个问题

我将在下面添加构建脚本和日志,但正在执行的flatter命令如下:
flatterbuildapk--flavor dev--release-t lib/main\u dev\u test.dart

flatter build apk
命令似乎完成得很好,但是构建在gradle任务步骤失败,并显示以下错误消息:

Task :app:compileFlutterBuildDevRelease FAILED
12 actionable tasks: 2 executed, 10 up-to-date
Error: Error when reading 'lib/main.dart': No such file or directory
package:hello_world/main.dart: Error: No 'main' method found.
Try adding a method named 'main' to your program.


FAILURE: Build failed with an exception.

* Where:
Script '/Users/runner/work/1/s/flutter/packages/flutter_tools/gradle/flutter.gradle' line: 904

* What went wrong:
Execution failed for task ':app:compileFlutterBuildDevRelease'.
> Process 'command '/Users/runner/work/1/s/flutter/bin/flutter'' finished with non-zero exit value 1
在windows上本地运行时的输出:

flutter build apk --flavor dev --release -t lib/main_dev_test.dart
You are building a fat APK that includes binaries for android-arm, android-arm64, android-x64.
If you are deploying the app to the Play Store, it's recommended to use app bundles or split the APK to reduce the APK size.
    To generate an app bundle, run:
        flutter build appbundle --target-platform android-arm,android-arm64,android-x64
        Learn more on: https://developer.android.com/guide/app-bundle
    To split the APKs per ABI, run:
        flutter build apk --target-platform android-arm,android-arm64,android-x64 --split-per-abi
        Learn more on:  https://developer.android.com/studio/build/configure-apk-splits#configure-abi-split
Running Gradle task 'assembleDevRelease'...
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Calling mockable JAR artifact transform to create file: C:\Users\_USERFOLDER_\.gradle\caches\transforms-2\files-2.1\5760bf626ba5c024071f2e9f16ccfcc3\android.jar with input C:\Users\_USERFOLDER_\AppData\Local\Android\Sdk\platforms\android-28\android.jar
Calling mockable JAR artifact transform to create file: C:\Users\_USERFOLDER_\.gradle\caches\transforms-2\files-2.1\08efdfe0d8cf00cccc6a03622959e0ad\android.jar with input C:\Users\_USERFOLDER_\AppData\Local\Android\Sdk\platforms\android-28\android.jar
Calling mockable JAR artifact transform to create file: C:\Users\_USERFOLDER_\.gradle\caches\transforms-2\files-2.1\1a859f032ea56da6fdcf4706b3d23efa\android.jar with input C:\Users\_USERFOLDER_\AppData\Local\Android\Sdk\platforms\android-29\android.jar
Removed unused resources: Binary resource data reduced from 759KB to 728KB: Removed 4%
Running Gradle task 'assembleDevRelease'...
Running Gradle task 'assembleDevRelease'... Done                  270.2s (!)
√ Built build\app\outputs\flutter-apk\app-dev-release.apk (21.0MB).
AppCenter构建变体-devRelease(在webUI上指定)

appcenter-post-clone.sh:

#/usr/bin/env bash
#将此脚本放置在project/android/app中/
光盘
#如果任何命令失败,则失败
set-e
#调试日志
集合x
#打印appcenter的输出文件夹
echo“!~!Appcenter输出:$Appcenter\u输出\u目录”
#指定打印应用程序样式
echo“为$app_ENV flavor构建应用程序”
entrypoint=“要替换的占位符\u.dart”
#设置目标main.dart文件
如果[“$APP_ENV”=“dev”];然后
entrypoint=“main\u dev\u test.dart”;
elif[“$APP_ENV”=”beta“];然后
entrypoint=“main_beta.dart”;
elif[“$APP_ENV”==“prod”];然后
entrypoint=“main\u release.dart”;
fi
echo“使用入口点:$entrypoint”
光盘
#如果需要,请选择其他发布频道-https://github.com/flutter/flutter/wiki/Flutter-build-release-channels
#稳定-推荐用于生产
git克隆-b稳定https://github.com/flutter/flutter.git
导出路径=`pwd`/flatter/bin:$PATH
颤振通道β
颤振升级
颤振医生
颤振构建apk——发布——flavor dev-t lib/$entrypoint
#将APK复制到AppCenter将找到它的位置
mkdir-p android/app/build/outputs/apk/;mv构建/应用/输出/颤振apk/app-$app_ENV-release.apk$_
android/app/build.gradle:

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.hello_world"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }
    signingConfigs {
        release {
            storeFile rootProject.file("app/android.keystore")
            storePassword System.getenv("APPCENTER_KEYSTORE_PASSWORD")
            keyAlias System.getenv("APPCENTER_KEY_ALIAS")
            keyPassword System.getenv("APPCENTER_KEY_PASSWORD")
        }
    }
    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.release
        }
    }
    flavorDimensions "default"
    productFlavors {
        local {
            dimension "default"
            applicationIdSuffix ".dev"
        }
        dev {
            dimension "default"
            applicationIdSuffix ".dev"
        }
        beta {
            dimension "default"
            applicationIdSuffix ".beta"
        }
        prod {
            dimension "default"
        }
    }
}

flutter {
    source '../..'
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}

AppCenter生成输出:

//---OMITTED TOOLING CLONING---

Building flutter tool...
Flutter is already up to date on channel beta
Flutter 1.22.0-12.1.pre • channel beta • https://github.com/flutter/flutter.git
Framework • revision 8b3760638a (8 days ago) • 2020-09-15 17:47:13 -0700
Engine • revision 4654fc6cf6
Tools • Dart 2.10.0 (build 2.10.0-110.3.beta)
+ flutter doctor
Downloading Material fonts...                                       0.5s
Downloading package sky_engine...                                   0.2s
Downloading flutter_patched_sdk tools...                            0.7s
Downloading flutter_patched_sdk_product tools...                    0.6s
Downloading darwin-x64 tools...                                     1.6s
Downloading libimobiledevice...                                     0.0s
Downloading usbmuxd...                                              0.0s
Downloading darwin-x64/font-subset tools...                         0.3s
Downloading android-arm-profile/darwin-x64 tools...                 0.3s
Downloading android-arm-release/darwin-x64 tools...                 0.2s
Downloading android-arm64-profile/darwin-x64 tools...               0.3s
Downloading android-arm64-release/darwin-x64 tools...               0.3s
Downloading android-x64-profile/darwin-x64 tools...                 0.3s
Downloading android-x64-release/darwin-x64 tools...                 0.3s
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel beta, 1.22.0-12.1.pre, on Mac OS X 10.14.6 18G6020, locale en)
[!] Android toolchain - develop for Android devices (Android SDK version 30.0.2)
    ! Some Android licenses not accepted.  To resolve this, run: flutter doctor --android-licenses
[✓] Xcode - develop for iOS and macOS (Xcode 11.3.1)
[!] Android Studio (not installed)
[!] Connected device
    ! No devices available

! Doctor found issues in 3 categories.
+ flutter build apk --flavor dev --release -t lib/main_dev_test.dart
Running "flutter pub get" in s...                                   6.9s
You are building a fat APK that includes binaries for android-arm, android-arm64, android-x64.
If you are deploying the app to the Play Store, it's recommended to use app bundles or split the APK to reduce the APK size.
    To generate an app bundle, run:
        flutter build appbundle --target-platform android-arm,android-arm64,android-x64
        Learn more on: https://developer.android.com/guide/app-bundle
    To split the APKs per ABI, run:
        flutter build apk --target-platform android-arm,android-arm64,android-x64 --split-per-abi
        Learn more on:  https://developer.android.com/studio/build/configure-apk-splits#configure-abi-split
Running Gradle task 'assembleDevRelease'...                     
Gradle 5.6.2

//---OMMITTED PACKAGE RESOLVE LINES---

> Task :clean
> Task :app:clean UP-TO-DATE
> Task :barcode_scan:clean UP-TO-DATE
> Task :camera:clean UP-TO-DATE
> Task :device_info:clean UP-TO-DATE
> Task :flutter_secure_storage:clean UP-TO-DATE
> Task :package_info:clean UP-TO-DATE
> Task :path_provider:clean UP-TO-DATE
> Task :permission_handler:clean UP-TO-DATE
> Task :shared_preferences:clean UP-TO-DATE
> Task :sqflite:clean UP-TO-DATE

> Task :app:compileFlutterBuildDevRelease FAILED
Error: Error when reading 'lib/main.dart': No such file or directory
package:hello_world/main.dart: Error: No 'main' method found.
Try adding a method named 'main' to your program.


FAILURE: Build failed with an exception.

* Where:
Script '/Users/runner/work/1/s/flutter/packages/flutter_tools/gradle/flutter.gradle' line: 904

* What went wrong:
Execution failed for task ':app:compileFlutterBuildDevRelease'.
> Process 'command '/Users/runner/work/1/s/flutter/bin/flutter'' finished with non-zero exit value 1

* Try:
12 actionable tasks: 2 executed, 10 up-to-date
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 6s
Error: /Users/runner/work/1/s/android/gradlew failed with return code: 1
    at ChildProcess.<anonymous> (/Users/runner/work/_tasks/Gradle_8d8eebd8-2b94-4c97-85af-839254cc6da4/1.128.0/node_modules/vsts-task-lib/toolrunner.js:569:30)
    at emitTwo (events.js:106:13)
    at ChildProcess.emit (events.js:191:7)
    at maybeClose (internal/child_process.js:920:16)
    at Socket.<anonymous> (internal/child_process.js:351:11)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:188:7)
    at Pipe._handle.close [as _onclose] (net.js:509:12)
##[error]Error: /Users/runner/work/1/s/android/gradlew failed with return code: 1
##[section]Finishing: Gradle Task
##[section]Starting: Checkout YardAppFlutter@feature/switchable_build_configurations to s
==============================================================================
Task         : Get sources
Description  : Get sources from a repository. Supports Git, TfsVC, and SVN repositories.
Version      : 1.0.0
Author       : Microsoft
Help         : [More Information](https://go.microsoft.com/fwlink/?LinkId=798199)
==============================================================================
Cleaning any cached credential from repository: YardAppFlutter (ExternalGit)
##[section]Finishing: Checkout YardAppFlutter@feature/switchable_build_configurations to s
##[section]Starting: Finalize Job
Cleaning up task key
Start cleaning up orphan processes.
Terminate orphan process: pid (1609) (java)
Terminate orphan process: pid (1550) (java)
Terminate orphan process: pid (1428) (adb)
##[section]Finishing: Finalize Job
##[section]Finishing: Build
/---省略了工具克隆---
建筑颤振工具。。。
颤振已在通道测试版上更新
颤振1.22.0-12.1.pre•通道beta•https://github.com/flutter/flutter.git
框架•修订版8B376038A(8天前)•2020-09-15 17:47:13-0700
发动机•版本4654fc6cf6
工具•Dart 2.10.0(build 2.10.0-110.3.beta版)
+颤振医生
正在下载材料字体。。。0.5s
正在下载软件包sky_引擎。。。0.2秒
正在下载Flatter_补丁的_sdk工具。。。0.7秒
正在下载Flatter_补丁_sdk_产品工具。。。0.6s
正在下载darwin-x64工具。。。1.6s
正在下载libimobiledevice。。。0.0秒
正在下载usbmuxd。。。0.0秒
正在下载darwin-x64/font子集工具。。。0.3s
正在下载android arm配置文件/darwin-x64工具。。。0.3s
正在下载android arm版本/darwin-x64工具。。。0.2秒
正在下载android-arm64-profile/darwin-x64工具。。。0.3s
正在下载android-arm64-release/darwin-x64工具。。。0.3s
正在下载android-x64-profile/darwin-x64工具。。。0.3s
正在下载android-x64-release/darwin-x64工具。。。0.3s
医生摘要(要查看所有详细信息,请运行flutter Doctor-v):
[✓] 颤振(通道测试版,1.22.0-12.1.pre,在Mac OS X 10.14.6 18G6020上,语言环境en)
[!]Android工具链-为Android设备开发(Android SDK版本30.0.2)
!某些Android许可证未被接受。若要解决此问题,请运行:flatter doctor--Android许可证
[✓] Xcode-为iOS和macOS开发(Xcode 11.3.1)
[!]Android Studio(未安装)
[!]已连接的设备
!没有可用的设备
!医生发现了3类问题。
+颤振构建apk--flavor dev--release-t lib/main_dev_test.dart
在s…6.9s中运行“Flatter pub get”
您正在构建一个包含android arm、android-arm64和android-x64二进制文件的胖APK。
如果要将应用程序部署到Play Store,建议使用应用程序捆绑包或拆分APK以减小APK大小。
要生成应用程序包,请运行:
颤振构建appbundle——目标平台安卓arm、安卓arm64、安卓x64
了解有关以下内容的详细信息:https://developer.android.com/guide/app-bundle
要按ABI拆分APK,请运行:
颤振构建apk——目标平台安卓arm、安卓arm64、安卓x64——按abi拆分
了解有关以下内容的详细信息:https://developer.android.com/studio/build/configure-apk-splits#configure-阿比斯普利特
正在运行Gradle任务“assembleDevRelease”。。。
梯度5.6.2
//---OMMITTED包解析行---
>任务:清洁
>任务:应用程序:最新清理
>任务:条码扫描:清除最新信息
>任务:相机:清理最新
>任务:设备信息:清除最新信息
>任务:颤振安全存储:最新清理
>任务:包信息:最新清理
>任务:路径\提供程序:清除最新
>任务:权限\处理程序:清除最新
>任务:共享_首选项:清除最新
>任务:sqflite:最新清理
>任务:应用程序:CompileFluterBuildDevRelease失败
错误:读取“lib/main.dart”时出错:没有这样的文件或目录
包:hello\u world/main.dart:错误:未找到“main”方法。
尝试将名为“main”的方法添加到程序中。
失败:生成失败,出现异常。
*其中:
脚本'/Users/runner/work/1/s/flatter/packages/flatter\u tools/gradle/flatter.gradle'行:904
*出了什么问题:
任务“:app:compileFlutterBuildDevRelease”的执行失败。
>处理“命令”/Users/runner/work/1/s/flatter/bin/flatter”已完成
#!/usr/bin/env bash
# place this script in project/android/app/
cd ..
# fail if any command fails
set -e
# debug log
set -x

cd ..
# choose a different release channel if you want - https://github.com/flutter/flutter/wiki/Flutter-build-release-channels
# stable - recommended for production

git clone -b stable https://github.com/flutter/flutter.git
export PATH=`pwd`/flutter/bin:$PATH

echo "Building with flavor $FLAVOR"

target="lib/main.dart"
if [ "$FLAVOR" == "qa" ]; then
    target="lib/main_qa.dart";
elif [ "$FLAVOR" == "prod" ]; then
    target="lib/main.dart";
fi

echo "using entrypoint: $target"

flutter channel stable
flutter doctor
flutter pub get
flutter pub run build_runner build
flutter build apk --release --dart-define=API_KEY=$API_KEY --dart-define=FLAVOR=$FLAVOR --flavor $FLAVOR -t $target

# change apk file name
mv build/app/outputs/flutter-apk/app-$FLAVOR-release.apk build/app/outputs/flutter-apk/wfm.apk

# copy the APK where AppCenter will find it
mkdir -p android/app/build/outputs/apk/; mv build/app/outputs/flutter-apk/wfm.apk $_