【发布时间】:2021-07-20 13:20:01
【问题描述】:
我正在尝试在 AppCenter.ms 中构建颤振应用程序,但我遇到了清理中间文件夹的 gradle 命令。
我已按照这些教程进行设置:
- https://www.rocksolidknowledge.com/articles/using-appcenter-for-flutter-projects
- https://buildflutter.com/deploying-flutter-apps-via-appcenter/
- https://medium.com/@subodhpushpak/flutter-continuous-build-deployment-using-appcenter-e105d00e6f9c
我添加了一个名为 appCenter 的 productFlavor 来容纳这个库:https://pub.dev/packages/flutter_appcenter_bundle
这是我的appcenter-post-clone.sh:
#!/usr/bin/env bash
#Place this script in project/android/app/
cd ..
# fail if any command fails
set -e
# debug log
set -x
cd ..
git clone -b stable https://github.com/flutter/flutter.git
export PATH=`pwd`/flutter/bin:$PATH
flutter channel stable
flutter doctor
# prevent missing flutter.jar error
flutter precache `pwd`/flutter/bin/cache/artifacts/engine
# Set APP_CENTER_VERSION_MODIFIER if you want to modify the version name
# to x.y.z-${APP_CENTER_VERSION_MODIFIER}
BUILD_NAME=$(grep -E '^version' pubspec.yaml | cut -d':' -f2 | tr -d '[:space:]')
if [ ! -z "$APPCENTER_BUILD_ID" ]
then
BUILD_NAME=${BUILD_NAME}.${APPCENTER_BUILD_ID}
fi
if [ ! -z "$APP_CENTER_VERSION_MODIFIER" ]
then
BUILD_NAME=${BUILD_NAME}-${APP_CENTER_VERSION_MODIFIER}
fi
flutter build apk --debug --flavor appCenter
flutter build apk --release --flavor appCenter --build-name=${BUILD_NAME} -t lib/main.dart
mkdir -p android/app/build/outputs/apk/
mv build/app/outputs/flutter-apk/app-appcenter-release.apk $_
appcenter-post-clone.sh 脚本完成后运行 gradle 时出现错误:
+ flutter build apk --debug --flavor appCenter
Running "flutter pub get" in s... 11.2s
???? Building with sound null safety ????
Running Gradle task 'assembleAppCenterDebug'...
Gradle 6.7
...
Running Gradle task 'assembleAppCenterDebug'... 193.4s
✓ Built build/app/outputs/flutter-apk/app-appcenter-debug.apk.
+ flutter build apk --release --flavor appCenter --build-name=1.42 -t lib/main.dart
Running "flutter pub get" in s... 15.7s
???? Building with sound null safety ????
Running Gradle task 'assembleAppCenterRelease'...
Gradle 6.7
...
Running Gradle task 'assembleAppCenterRelease'... 104.7s
✓ Built build/app/outputs/flutter-apk/app-appcenter-release.apk (25.9MB).
+ mkdir -p android/app/build/outputs/apk/
+ mv build/app/outputs/flutter-apk/app-appcenter-release.apk android/app/build/outputs/apk/
+ mv -v android/app/build/outputs/apk/app-appcenter-release.apk android/app/build/outputs/apk/app-release.apk
android/app/build/outputs/apk/app-appcenter-release.apk -> android/app/build/outputs/apk/app-release.apk
//SCRIPT HAS FINISHED
//RUNNING NORMAL GRADLE
Description : Build using a Gradle wrapper script
Version : 1.128.0
Author : Microsoft Corporation
Help : [More Information](https://go.microsoft.com/fwlink/?LinkID=613720)
==============================================================================
(node:3364) Warning: Use Cipheriv for counter mode of aes-256-ctr
...
(node:3364) Warning: Use Cipheriv for counter mode of aes-256-ctr
SYSTEMVSSCONNECTION exists true
[command]/.../android/gradlew -DAPPCENTER_BUILD_VERSION=42 -DMOBILECENTER_BUILD_VERSION=42 -p android clean :app:assembleAppCenterRelease :app:lintAppCenterRelease
...
> Task :app:lintVitalAppCenterRelease FAILED
Resolved com.android.tools.lint:lint-gradle:27.1.0 in :app:lintClassPath
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:lintVitalAppCenterRelease'.
> Could not resolve all artifacts for configuration ':app:appCenterDebugRuntimeClasspath'.
> Failed to transform libs.jar to match attributes {artifactType=processed-jar, org.gradle.libraryelements=jar, org.gradle.usage=java-runtime}.
> Execution failed for JetifyTransform: /.../build/app/intermediates/flutter/appCenterDebug/libs.jar.
> Transform's input file does not exist: /.../build/app/intermediates/flutter/appCenterDebug/libs.jar. (See https://issuetracker.google.com/issues/158753935)
问题:
Transform's input file does not exist: /.../intermediates/flutter/appCenterDebug/libs.jar
我遇到了这个 SO 帖子: Generate signed apk fails with build\app\intermediates\flutter\profile\libs.jar (The system cannot find the path specified) 指向https://github.com/flutter/flutter/issues/58247#issuecomment-636500680
“解决方案”是先运行flutter build apk --debug,然后运行flutter build apk --release
理论上,这将为appCenterDebug 和appCenterRelease 生成带有所需文件的intermediates 目录。
通过运行gradlew lintAppCenterDebug 在本地对其进行测试,然后运行gradlew lintAppCenterRelease。
两个颤振命令都成功构建。
问题出在 gradle 开始运行时这一行:
[command]/.../android/gradlew -DAPPCENTER_BUILD_VERSION=42 -DMOBILECENTER_BUILD_VERSION=42 -p android clean :app:assembleAppCenterRelease :app:lintAppCenterRelease
它在命令中进行了清理,删除了intermediates 目录(所以这个/.../appCenterDebug/libs.jar 不再存在)并且只构建:app:...Release 版本。然后它继续并中断并给出input file does not exist 错误。
如何解决这个问题?
如何从 gradle 命令中删除 clean 部分? (我在任何地方都找不到)
- 我已经在本地测试了这个确切的命令,但失败了。
- 通过运行两个 gradle lint 命令重新生成
intermediates内容 - 运行相同的 gradle 命令但没有
clean并且它可以工作。
在本地和 appcenter 中调试、发布构建工作正常(直到 gradle 运行并删除所需的文件)
附加信息
pubspec.yaml:
environment:
sdk: ">=2.12.0 <3.0.0"
gradle.properties
org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true
build.gradle
buildscript {
ext.kotlin_version = '1.3.50'
repositories {
google()
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.1.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
allprojects {
repositories {
google()
jcenter()
mavenCentral()
}
}
rootProject.buildDir = '../build'
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
project.evaluationDependsOn(':app')
}
task clean(type: Delete) {
delete rootProject.buildDir
}
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 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 30
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
signingConfigs {
defaultKey {
/* truncated */
}
}
defaultConfig {
applicationId "com.example.app"
minSdkVersion 21
targetSdkVersion 30
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}
buildTypes {
release {
signingConfig = signingConfigs.defaultKey
}
}
flavorDimensions "distribute"
productFlavors {
appCenter {
dimension "distribute"
}
}
}
flutter {
source '../..'
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}
gradle/wrapper/gradle-wrapper.properties
#Fri Jun 23 08:50:38 CEST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
【问题讨论】:
标签: android bash flutter gradle visual-studio-app-center