最近在使用flutter打包安卓apk的時候發現有錯誤,發現是使用了qr_code_scanner實現掃碼的錯誤。
截屏2024-11-07 09.07.41.png
仔細閱讀報錯信息發現有這行錯誤:flutter Namespace not specified. Specify a namespace in the module's build file,查閱資料后得出結論,在使用flutterSDK 3.24之后發現新建項目,項目默認都是基于AGP8了,由于 AGP 開始強制要求 namespace 配置,不僅僅是主工程,也包括第三方庫都強制要求 namespace 。但是我們在引入第三方庫的時候會發現部分庫沒能及時的去做相關配置,這也就導致了我們會出現標題錯誤:
解決方法:在android/build.gradle中添加判斷即可
// 修復由于高版本導致namespace檢測為空的問題,沒遇到可不添加
subprojects {
afterEvaluate { project ->
if (project.plugins.hasPlugin('com.android.library') || project.plugins.hasPlugin('com.android.application')) {
println "project: ${project.name} Namespace get: ${project.android.namespace}"
def packageName = project.android.namespace ?: project.android.defaultConfig.applicationId ?: project.android.sourceSets.main.manifest.srcFile.text.find(/package="([^"]*)"/) ?: project.group
project.android.namespace = packageName
println "Namespace set to: ${packageName} for project: ${project.name}"
def manifestFile = project.android.sourceSets.main.manifest.srcFile
if (manifestFile.exists()) {
def manifestText = manifestFile.text
if (manifestText.contains('package=')) {
manifestText = manifestText.replaceAll(/package="[^"]*"/, "")
manifestFile.text = manifestText
println "Package attribute removed in AndroidManifest.xml for project: ${project.name}"
} else {
println "No package attribute found in AndroidManifest.xml for project: ${project.name}"
}
} else {
println "AndroidManifest.xml not found for project: ${project.name}"
}
}
}
}
// 修復由于高版本導致namespace檢測為空的問題,沒遇到可不添加
補充:如果出現如下截圖錯誤的話可以通過配置gradle.properties文件添加這兩行內容就可以了正常運行了。
android.nonTransitiveRClass=false
android.nonFinalResIds=false
注意添加完之后,第一次運行可能會報錯,這個具體原因不清楚,不過不用管,接著再運行一次就可以了