2025-01-02

this and base files have different roots

使用 Flutter 两年,发现的问题有两个,干脆把两个都说一下吧。第一个是前面讲的升级 AGP 导致 AIDL 不显示,第二个是编译 Android 应用时提示存在不同的 root。

第二个问题相对来讲没那么严重,也容易发现(Flutter 官方 GitHub 页面也有这个 ISSUE),创建一个 Flutter App,导入 path_providershared_preferenceurl_lanncher 这几个包,编译 Android 端应用的时候大概率就提示:

this and base files have different roots: 
<Flutter 项目源码路径>\build\path_provider_android and 
<Flutter PUB-CACHE 路径>\hosted\pub.dev\path_provider_android-2.2.5\android.

有英语网页讲把 PUB-CACHE 设置到非默认路径(C 盘)再重建缓存,可以解决(可能作者那里奇奇怪怪的解决了),但是实际解决不了,我这配置环境的时候就把 PUB-CACHE 设置到了 D 盘,而且重建缓存也一样。

目前可靠的解决方案就是注释掉 path_providershared_preferenceurl_lanncher 这几个包 Android 端源码里 build.gradle 的测试选项,毕竟是包测序相关不会对 App 产生什么影响:

android {
    ...
    // testOptions {
    //     unitTests.includeAndroidResources = true
    //     unitTests.returnDefaultValues = true
    //     unitTests.all {
    //         testLogging {
    //            events "passed", "skipped", "failed", "standardOut", "standardError"
    //            outputs.upToDateWhen {false}
    //            showStandardStreams = true
    //         }
    //     }
    // }
    ...
}

这个问题也很久了,不过也没解决。也希望开发者看到吧,希望“注释掉测试选项”这个信息对他们有帮助吧。

版本冲突

APG(Android Gradle 插件,Android 应用构建工具链的一员)升到 8 之后项目里头的 AIDL 文件就不见了,早就发现这个问题,以为 Google 很快能解决,没想从升级时的 8.0.2、8.1.x 到现在最新稳定版 8.7.3 这问题都存在。

我的项目比较大,Flutter 应用依赖自己实现的插件,插件含有 C++、Rust 语言的 Native 实现,支持 Android、Windows 系统,Windows 部分走 MSVC 编译很正常就不扯远了,主要插件 Android 端升级带来的问题。

插件 Android 端需要和系统 VPN 交互,有个(独立进程)服务,AIDL 就是这个服务的接口文件,问题就出在升到 AGP 8 后这个 AIDL 就不见了。编译会报无法识别 AIDL 的接口符号,其实是工具链没分析 AIDL 文件(或者其他原因),IPC 通讯的代码都没生成。

本来想写一篇 Blog 详细讲讲这个问题,但是现在越来越懒了,Blog 也懒得写,希望开发者看到吧,把这个问题解决吧。