flutter项目构建常见问题

最近在研究一个验证码转发的app,原理是尝试读取手机中对应应用的验证码进行自动转发。本次尝试用flutter开发,因为之前没有flutter开发的经验,遇到了诸多环境方面的问题,汇总一些常见的问题如下。希望帮助到入门的flutter开发者,避免踩坑。

problems

1. running failed

1.1. Bug Description

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':gradle:compileGroovy'.
> BUG! exception in phase 'semantic analysis' in source unit 'C:\dev\flutter\packages\flutter_tools\gradle\src\main\groovy\app_plugin_loader.groovy' Unsupported class file major version 65

* Try:
> 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 31s
Running Gradle task 'assembleDebug'...                             32.3s

┌─ Flutter Fix ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐  
│ [!] Your project's Gradle version is incompatible with the Java version that Flutter is using for Gradle.                                      │  
│                                                                                                                                                │
│ If you recently upgraded Android Studio, consult the migration guide at https://flutter.dev/to/java-gradle-incompatibility.                    │  
│                                                                                                                                                │  
│ Otherwise, to fix this issue, first, check the Java version used by Flutter by running `flutter doctor --verbose`.                             │  
│                                                                                                                                                │  
│ Then, update the Gradle version specified in D:\Project\Verify_Code_App\verify_code_app\android\gradle\wrapper\gradle-wrapper.properties to be │  
│ compatible with that Java version. See the link below for more information on compatible Java/Gradle versions:                                 │  
│ https://docs.gradle.org/current/userguide/compatibility.html#java                                                                              │  
│                                                                                                                                                │  
│                                                                                                                                                │  
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

1.2. Solution

执行flutter doctor --verbose发现

Java binary at: D:\Android\Android Studio\jbr\bin\java

说明java地址指向不对,要使用flutter config --jdk-dir <jdk目录>来指定java目录

2. settings.gradle.kts配置

2.1. Bug Description

配置gradle plugin国内镜像源时,使用了

pluginManagement {
    repositories {
        maven { url 'https://plugins.gradle.org/m2/' }
        maven { url 'https://maven.aliyun.com/nexus/content/repositories/google' }
        maven { url 'https://maven.aliyun.com/nexus/content/groups/public' }
        maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}

报错如下:

Launching lib\main.dart on sdk gphone64 x86 64 in debug mode...
e: D:\Project\Verify_Code_App\verify_code_app\android\settings.gradle.kts:14:25: Too many characters in a character literal ''https://maven.aliyun.com/nexus/content/repositories/google''
e: D:\Project\Verify_Code_App\verify_code_app\android\settings.gradle.kts:15:25: Too many characters in a character literal ''https://maven.aliyun.com/nexus/content/groups/public''
e: D:\Project\Verify_Code_App\verify_code_app\android\settings.gradle.kts:16:25: Too many characters in a character literal ''https://maven.aliyun.com/nexus/content/repositories/jcenter''

FAILURE: Build failed with an exception.

* Where:
Settings file 'D:\Project\Verify_Code_App\verify_code_app\android\settings.gradle.kts' line: 14

* What went wrong:
Script compilation errors:

  Line 14:         maven { url=uri('https://maven.aliyun.com/nexus/content/repositories/google') }
                                   ^ Too many characters in a character literal ''https://maven.aliyun.com/nexus/content/repositories/google''    

  Line 15:         maven { url=uri('https://maven.aliyun.com/nexus/content/groups/public') }
                                   ^ Too many characters in a character literal ''https://maven.aliyun.com/nexus/content/groups/public''

  Line 16:         maven { url=uri('https://maven.aliyun.com/nexus/content/repositories/jcenter')}
                                   ^ Too many characters in a character literal ''https://maven.aliyun.com/nexus/content/repositories/jcenter''   

3 errors

2.2. Solution

网上的教程大多是按build.gradle文件来配置的,然而本项目采用了build.gradle.kts,所以需要修改为

修改为

repositories {
    maven { url=uri("https://plugins.gradle.org/m2/") }
    maven { url=uri("https://maven.aliyun.com/nexus/content/repositories/google") }
    maven { url=uri("https://maven.aliyun.com/nexus/content/groups/public") }
    maven { url=uri("https://maven.aliyun.com/nexus/content/repositories/jcenter")}
    gradlePluginPortal()
    google()
    mavenCentral()
}

3. 第三方库命名空间NameSpace问题

3.1. Bug Description

运行flutter项目时报错,提示找不到第三方库的命名空间:

Namespace not specified. Specify a namespace in the module's build file

3.2. Solution

build.gradle.kts文件中添加如下代码,来对第三方库进行命名空间指定:

subprojects {
    afterEvaluate {
        if (this is org.gradle.api.Project && (plugins.hasPlugin("com.android.library") || plugins.hasPlugin("com.android.application"))) {
            val androidExtension = extensions.findByType<com.android.build.gradle.BaseExtension>()
            androidExtension?.let { android ->
                val currentNamespace = android.namespace
                println("project: ${this.name} Namespace get: $currentNamespace")

                val packageName = currentNamespace
                    ?: android.defaultConfig.applicationId
                    ?: android.sourceSets.getByName("main").manifest.srcFile.readText().let { manifestText ->
                        val regex = Regex("package=\"([^\"]*)\"")
                        regex.find(manifestText)?.groupValues?.get(1)
                    }
                    ?: group.toString()

                android.namespace = packageName
                println("Namespace set to: $packageName for project: ${this.name}")

                val manifestFile = android.sourceSets.getByName("main").manifest.srcFile
                if (manifestFile.exists()) {
                    var manifestText = manifestFile.readText()
                    if (manifestText.contains("package=")) {
                        manifestText = manifestText.replace(Regex("package=\"[^\"]*\""), "")
                        manifestFile.writeText(manifestText)
                        println("Package attribute removed in AndroidManifest.xml for project: ${this.name}")
                    } else {
                        println("No package attribute found in AndroidManifest.xml for project: ${this.name}")
                    }
                } else {
                    println("AndroidManifest.xml not found for project: ${this.name}")
                }
            }
        }
    }
}

4. sms_advanced第三方依赖问题

4.1. Bug Description

在编写flutter项目时,引入了sms_advanced第三方库,但是在运行时,出现了如下错误:

* What went wrong:
The Android Gradle plugin supports only Kotlin Gradle plugin version 1.5.20 and higher.
The following dependencies do not satisfy the required version:
project ':sms_advanced' -> org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.50

pubspec.yml中引入的依赖:

dependencies:
  flutter:
    sdk: flutter
  http: ^1.3.0
  shared_preferences: ^2.5.2

  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^1.0.8
  sms_advanced: ^1.1.0

4.2. Solution

网上大多数解决方案是修改android/build.gradle文件,将kotlin版本修改为1.5.20以上,这个方案需要对sms_advanced依赖中的文件进行操作。我尝试前往对应插件库的github项目地址,发现作者最新的更新仅上传了github并未上传到pub,因此无法通过修改版本号的方式解决问题。

在这里插入图片描述

因此我尝试修改dependencies,直接从git仓库中引入依赖,如下:

dependencies:
  flutter:
    sdk: flutter
  http: ^1.3.0
  shared_preferences: ^2.5.2

  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^1.0.8
  sms_advanced:
    git:
      url: git@github.com:EddieKamau/sms_advanced.git

最终得以解决。

### 解决Gradle版本与Flutter使用的Java版本不兼容的方法 当遇到Gradle版本和Java版本不一致的问题时,可以采取多种措施来确保两者之间的兼容性。 #### 修改Gradle的JVM配置 为了使Gradle使用特定版本的JVM,在项目中的`gradle.properties`文件里指定所需的JVM路径。这可以通过设置环境变量`ORG_GRADLE_PROJECT_javaHome`指向所需安装目录下的Java Home实现[^2]: ```properties org.gradle.java.home=/path/to/your/jdk ``` 对于Windows操作系统而言,上述路径可能类似于 `C:\Program Files\Java\jdk-17`;而对于Linux或macOS,则可能是 `/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home`. #### 使用Flutter Doctor诊断工具 通过执行命令`flutter doctor -v`可以帮助识别当前环境中存在的任何潜在问题,并提供有关正在使用的具体Java版本的信息。这对于确认是否已经解决了之前的错误非常有用[^3]: ```bash flutter doctor -v ``` 此命令会显示详细的系统状态报告,包括已安装软件包及其对应版本号等信息。 #### 配置Android Studio内置JDK 由于Android Studio自带了一个版本的Java开发套件(JDK),默认情况下Flutter会选择它作为编译器。如果没有安装Android Studio的话,就需要依赖于由shell脚本定义好的`JAVA_HOME`环境变量所指明的那个版本。如果该变量未被设定过,那么程序将会尝试查找PATH中可用的第一个java可执行文件[^4]. 因此建议优先考虑利用IDE内部集成的支持功能而不是手动调整外部依赖关系,除非确实有必要这样做。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码轨迹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值