this and base files have different roots
使用 Flutter 两年,发现的问题有两个,干脆把两个都说一下吧。第一个是前面讲的升级 AGP 导致 AIDL 不显示,第二个是编译 Android 应用时提示存在不同的 root。
第二个问题相对来讲没那么严重,也容易发现(Flutter 官方 GitHub 页面也有这个 ISSUE),创建一个 Flutter App,导入 path_provider
、shared_preference
、url_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_provider
、shared_preference
、url_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 也懒得写,希望开发者看到吧,把这个问题解决吧。