最近在研究一个验证码转发的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.orgBUILD 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.namespaceprintln("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 = packageNameprintln("Namespace set to: $packageName for project: ${this.name}")val manifestFile = android.sourceSets.getByName("main").manifest.srcFileif (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: flutterhttp: ^1.3.0shared_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.8sms_advanced: ^1.1.0
4.2. Solution
网上大多数解决方案是修改android/build.gradle
文件,将kotlin
版本修改为1.5.20以上,这个方案需要对sms_advanced
依赖中的文件进行操作。我尝试前往对应插件库的github项目地址,发现作者最新的更新仅上传了github并未上传到pub,因此无法通过修改版本号的方式解决问题。
因此我尝试修改dependencies,直接从git仓库中引入依赖,如下:
dependencies:flutter:sdk: flutterhttp: ^1.3.0shared_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.8sms_advanced:git:url: git@github.com:EddieKamau/sms_advanced.git
最终得以解决。