Flutter - Gradle task assembleDebug failed【持续更新】

505 阅读2分钟

1 AGP Namespace Error

1.1 错误信息

A problem occurred configuring project ':video_thumbnail'.
> Could not create an instance of type com.android.build.api.variant.impl.LibraryVariantBuilderImpl.
    > Namespace not specified. Specify a namespace in the module's build file. See...
        If you've specified the package attribute in the source AndroidManifest.xml, you can use the AGP Upgrade Assistant to migrate to the namespace value in the build file. Refer to...

1.2 错误解析

该问题提示 video_thumbnail 插件的 build.gradle 文件没有指定 namespace。这是由于 Android Gradle Plugin (AGP) 从 7.0 开始要求在每个模块的 build.gradle 文件中定义 namespace

1.3 解决方案

### 1.3.1 手动修改插件的 build.gradle

  • 找到 video_thumbnail 插件的源码路径,具体路径如下:

    ~/.pub-cache/hosted/pub.dartlang.org/video_thumbnail-<version>/ 
    
  • video_thumbnail 插件的 android/build.gradle 中添加 namespace,例如:

    android {
        namespace 'xyz.justsoft.video_thumbnail'
        // 其余配置...
    } 
    

### 1.3.2 fork 插件

video_thumbnail 插件的代码 fork 到自己的仓库,手动添加 namespace,然后在 pubspec.yaml 中指定您的 fork 版本:

dependencies:
  video_thumbnail:
    git:
      url: https://github.com/yourusername/video_thumbnail.git
      ref: main 

### 1.3.3 使用 patch 包工具

  1. 安装 patch-package
  • 在项目中安装 patch-package 工具。该工具依赖于 node,因此需要确保已安装 Node.js

  • 如果项目中还没有 package.json 文件,在 Flutter 项目的根目录中,运行以下命令来初始化 npm

    npm init -y
    
  • 然后运行以下命令安装 patch-package

    npm install patch-package --save-dev
    
  1. 修改 video_thumbnail 插件的代码
  • 参考 1.3.1 手动修改插件的 build.gradle
  1. 生成补丁
  • 修改完插件后,在项目根目录中运行以下命令来生成补丁:

    npx patch-package video_thumbnail
    
  • 这将创建一个 patches/ 目录,里面保存了 video_thumbnail 插件的补丁文件,例如:

    patches/video_thumbnail+<version>.patch
    
  1. package.json 中添加脚本
  • 为了确保每次您运行 flutter pub get 时自动应用补丁,可以在 package.json 中添加一个 postinstall 脚本: 

    {
      "scripts": {
        "postinstall": "patch-package"
      }
    } 
    
  1. 测试并清理项目
  • 运行 flutter clean 来清理项目缓存,然后重新获取依赖:

    flutter clean
    flutter pub get 
    
  • 在执行 flutter pub get 后,patch-package 会自动应用补丁。如果补丁被正确应用,video_thumbnail 插件的 build.gradle 文件就会包含刚刚添加的 namespace 修改。

补丁文件只需生成一次并提交到版本控制系统,换电脑或者其他开发者使用时无需重新生成补丁,只要运行 flutter pub get,补丁就会自动应用。