flutter android端运行报错Namespace not specified. Specify a namespace ...

打印 上一主题 下一主题

主题 836|帖子 836|积分 2508

在使用flutterSDK 3.24之后发现新建项目,项目默认都是基于AGP8了,由于 AGP 开始逼迫要求 namespace 设置,不仅仅是主工程,也包罗第三方库都逼迫要求 namespace 。但是我们在引入第三方库的时候会发现部分库没能及时的去做相关设置,这也就导致了我们会出现标题错误:

出现这个题目,我们可能会通已往找到当地缓存的第三方库代码去修改它的build.gradle和AndroidManifest.xml来解决缺失 namespace 的报错题目,但是显然这种方式不太友好,究竟正常项目可能会引用很多库,这个时候一个一个去修改太麻烦了。因此我们必要一种可以批量处理的方式,在编译的时候去做处理。

话不多说直接上代码吧,但还是建议连同下方补充的两项一起看完:

  1. allprojects {
  2.     repositories {
  3.         google()
  4.         mavenCentral()
  5.     }
  6. }
  7. subprojects {
  8.     afterEvaluate { project ->
  9.         if (project.plugins.hasPlugin('com.android.library') || project.plugins.hasPlugin('com.android.application')) {
  10.             println "project: ${project.name} Namespace get: ${project.android.namespace}"
  11.             def packageName = project.android.namespace ?: project.android.defaultConfig.applicationId ?: project.android.sourceSets.main.manifest.srcFile.text.find(/package="([^"]*)"/) ?: project.group
  12.             project.android.namespace = packageName
  13.             println "Namespace set to: ${packageName} for project: ${project.name}"
  14.         }
  15.     }
  16. }
  17. rootProject.buildDir = "../build"
  18. subprojects {
  19.     project.buildDir = "${rootProject.buildDir}/${project.name}"
  20. }
  21. subprojects {
  22.     project.evaluationDependsOn(":app")
  23. }
  24. tasks.register("clean", Delete) {
  25.     delete rootProject.buildDir
  26. }
复制代码
通过在根目次下的build.gradle文件中添加以下代码就可以在编译的时候批量处理:
  1. subprojects {
  2.     afterEvaluate { project ->
  3.         if (project.plugins.hasPlugin('com.android.library') || project.plugins.hasPlugin('com.android.application')) {
  4.             println "project: ${project.name} Namespace get: ${project.android.namespace}"
  5.             def packageName = project.android.namespace ?: project.android.defaultConfig.applicationId ?: project.android.sourceSets.main.manifest.srcFile.text.find(/package="([^"]*)"/) ?: project.group
  6.             project.android.namespace = packageName
  7.             println "Namespace set to: ${packageName} for project: ${project.name}"
  8.         }
  9.     }
  10. }
复制代码
我让GPT写了一下代码表明,有兴趣的可以看一下:
以下是对这段代码的分析:
一、整体功能

这段 Groovy 代码主要是在 Gradle 项目中针对 Android 项目(包罗 Android 库项目和应用项目)进行处理。详细功能包罗获取项目的定名空间(package name),并在必要时进行设置。
二、代码结构及表明

1、afterEvaluate闭包:

在 Gradle 项目评估完成后实行的代码块。这意味着在项目的设置阶段竣过后,这段代码才会被实行。
2、条件判定:

if (project.plugins.hasPlugin('com.android.library') ||project.plugins.hasPlugin('com.android.application')):查抄项目是否应用了 Android 库插件或 Android 应用插件。只有满足这个条件的项目才会实行后续的代码。
3、获取和设置定名空间:

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:尝试从多个泉源获取定名空间。如果项目已经设置了android.namespace,则使用该值;如果没有,尝试使用android.defaultConfig.applicationId;如果还没有,从 AndroidManifest.xml 文件中提取package属性的值;如果仍然没有找到,最后使用项目的group作为定名空间。
project.android.namespace = packageName:设置项目的定名空间为获取到的packageName。
println "Namespace set to: ${packageName} for project: ${project.name}":打印设置后的定名空间和项目名称。
最后我们再运行一下看看吧!


OK,乐成运行!

补充一:如果出现如下截图错误的话

就改成下面代码,用来清除AndroidManifest.xml中的package
  1. subprojects {
  2.     afterEvaluate { project ->
  3.         if (project.plugins.hasPlugin('com.android.library') || project.plugins.hasPlugin('com.android.application')) {
  4.             println "project: ${project.name} Namespace get: ${project.android.namespace}"
  5.             def packageName = project.android.namespace ?: project.android.defaultConfig.applicationId ?: project.android.sourceSets.main.manifest.srcFile.text.find(/package="([^"]*)"/) ?: project.group
  6.             project.android.namespace = packageName
  7.             println "Namespace set to: ${packageName} for project: ${project.name}"
  8.             def manifestFile = project.android.sourceSets.main.manifest.srcFile
  9.             if (manifestFile.exists()) {
  10.                 def manifestText = manifestFile.text
  11.                 if (manifestText.contains('package=')) {
  12.                     manifestText = manifestText.replaceAll(/package="[^"]*"/, "")
  13.                     manifestFile.text = manifestText
  14.                     println "Package attribute removed in AndroidManifest.xml for project: ${project.name}"
  15.                 } else {
  16.                     println "No package attribute found in AndroidManifest.xml for project: ${project.name}"
  17.                 }
  18.             } else {
  19.                 println "AndroidManifest.xml not found for project: ${project.name}"
  20.             }
  21.         }
  22.     }
  23. }
复制代码
注意添加完之后,第一次运行可能会报错,这个详细原因不清晰,不过不消管,接着再运行一次就可以了

补充二:如果出现如下截图错误的话可以通过设置gradle.properties文件添加这两行内容就可以了正常运行了。
   android.nonTransitiveRClass=false
android.nonFinalResIds=false
  


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

缠丝猫

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表