Flutter爬坑记 - jetified-BaiduLBS_Android.jar重复定义

在使用Flutter开发时,遇到了jetified-BaiduLBS_Android.jar重复定义的问题,尝试了修改gradle版本、混淆设置、排除文件等方法无效。最终发现是百度地图插件版本更新,新版本与旧版本存在冲突。解决方案是将所有相关插件升级到最新版本,避免版本不一致导致的冲突,成功解决问题。


去年用Flutter做了一个APP,有百度地图及其定位功能,Flutter是1.2.2版本的,很久么有更新SDK了。这两天突然新血来潮flutter upgrade了一下,顺便把右下角凡人的gradle upgradle也点了,接下来,舒服了。。。。。工程挂了,各种报错。
报错:
AGPBI: {“kind”:“error”,“text”:"Type com.baidu.a.a.a.a.a is defined
Execution failed for task ‘:app:mergeDebugNativeLibs’.
Could not initialize class org.codehaus.groovy.runtime.InvokerHelper
jetified-BaiduLBS_Android.jar重复定义。。。
等等。。。

最初,以为是升级flutter sdk和gradle之后把混淆打开了,开始研究gradle的机制。弄了半天,无论打开和关闭混淆代码,都无法解决;gradle的版本跟jdk的版本要对应,直接拉满用gradle和jdk最新的版本,Android Studio也搞到最新版本,不行。。。
然后,百度搜到optionConfig里面要exclude一些东西,一边编译一遍根据错误排除各种so文件,asset/xxx.png文件,还是无法解决;
gradle搞到新版本后,用android工程模式可以看到正常的中文build提示了(之前用flutter build都是乱码提示)。搞出jetified-BaiduLBS_Android.jar有两处重复引用导致冲突,又按百度搜到的解决办法,把build.gradle中的dependencies下,加入compileOnly files(‘libs/BaiduLBS_Android.jar’),还是吐了。。。。不行;
快绝望放弃的时候,仔细观察百度地图的插件版本,发现我之前用的是1.0.2版本的,去库里面用同样的关键字搜索,发现最新版本依旧是1.0.2,但有一个红红的uncontinue。难道百度官方放弃flutter插件了?不科学啊,现在flutter这么火,各大厂

android开发中地图和定位是很多软件不可或缺的内容,这些特色功能也给人们带来了很多方便。定位一般分为三种发方案:即GPS定位、Google网络定位以及基站定位 最简单的手机定位方式当然是通过GPS模块(现在大部分的智能机应该都有了)。GPS方式准确度是最高的,但是它的缺点也非常明显:1,比较耗电;2,绝大部分用户默认不开启GPS模块;3,从GPS模块启动到获取第一次定位数据,可能需要比较长的时间;4,室内几乎无法使用。这其中,缺点2,3都是比较致命的。需要指出的是,GPS走的是卫星通信的通道,在没有网络连接的情况下也能用。 另外一种常见的定位方式是基站定位。大致思路就是采集到手机上的基站ID号(cellid)和其它的一些信息(MNC,MCC,LAC等等),然后通过网络访问一些定位服务,获取并返回对应的经纬度坐标。基站定位的精确度不如GPS,但好处是能够在室内用,只要网络通畅就行。 还有Wifi定位。和基站定位类似,这种方式是通过获取当前所用的wifi的一些信息,然后访问网络上的定位服务以获得经纬度坐标。因为它和基站定位其实都需要使用网络,所以在Android也统称为Network方式。 最后需要解释一点的是AGPS方式。很多人将它和基站定位混为一谈,但其实AGPS的本质仍然是GPS,只是它会使用基站信息对获取GPS进行辅助,然后还能对获取到的GPS结果进行修正,所以AGPS要比传统的GPS更快,准确度略高。
<think> 我们正在处理一个关于Flutter构建错误的问题。错误信息显示: 'Could not create task ':camera_android:generateDebugUnitTestConfig'. this and base files have different roots: E:\zsy\mobile\zhushun-cloudmix-main\flutter_module\.android\plugins_build_output\camera_android and D:\flutter_pub_cache\hosted\pub.flutter-io.cn\camera_android-0.10.9+11\android' 这个错误通常发生在Gradle任务中,当它尝试处理两个不同根目录(即完全不同的驱动器或完全不同的路径起点)的文件时。具体来说,这里涉及的两个路径分别是: 1. E:\zsy\mobile\zhushun-cloudmix-main\flutter_module\.android\plugins_build_output\camera_android 2. D:\flutter_pub_cache\hosted\pub.flutter-io.cn\camera_android-0.10.9+11\android 问题在于,这两个路径位于不同的驱动器(E: 和 D:),这可能导致Gradle在尝试相对路径操作时失败。 根据经验,可能的原因和解决方案如下: ### 可能原因 1. **Flutter缓存路径问题**:Flutter的包缓存通常位于用户目录下(例如D:\flutter_pub_cache),但项目位于E盘。这本身没有问题,但可能由于某些配置导致Gradle无法正确处理跨驱动器的路径。 2. **项目配置问题**:项目中的`.android`目录是自动生成的,可能与插件缓存路径的配置有关。 3. **插件版本冲突**:`camera_android`插件版本可能存在兼容性问题。 ### 解决方案 #### 1. 清理构建缓存 首先,尝试清理项目的构建缓存: ```bash flutter clean ``` 然后重新运行项目: ```bash flutter run ``` 这会删除`build`目录和`.android`、`.ios`等构建目录,然后重新生成。 #### 2. 检查Flutter环境配置 确保Flutter的环境变量配置正确。特别是`PUB_CACHE`环境变量,它指定了包缓存的路径。如果这个路径被设置到了D盘,而项目在E盘,可能会引起问题。可以尝试将`PUB_CACHE`设置到E盘的某个路径,或者删除该环境变量使用默认位置(在用户目录下)。默认情况下,Flutter的包缓存位于用户目录下的`.pub-cache`。 查看当前配置: ```bash flutter doctor -v ``` #### 3. 检查项目配置 在项目根目录下,检查`pubspec.yaml`文件中`camera_android`插件的版本。确保使用的版本与Flutter SDK兼容。可以尝试升级或降级该插件。 例如,将`camera_android`的版本改为最新或稳定版本: ```yaml dependencies: camera_android: ^0.10.9+11 # 尝试改为最新版本,或者检查是否有更新 ``` 然后运行: ```bash flutter pub get ``` #### 4. 手动删除插件构建输出目录 错误信息中提到了路径`E:\zsy\mobile\zhushun-cloudmix-main\flutter_module\.android\plugins_build_output\camera_android`。尝试手动删除这个目录(或者整个`.android`目录),然后重新运行`flutter run`。Flutter会在构建时重新生成这些文件。 #### 5. 移动项目到同一驱动器 如果上述方法都不奏效,考虑将整个项目移动到D盘(即与Flutter包缓存相同的驱动器)以避免跨驱动器的问题。这是解决不同根目录问题的最直接方法。 #### 6. 修改Flutter的缓存路径 如果希望将缓存路径设置到E盘,可以通过设置环境变量`PUB_CACHE`来实现: - 在Windows系统中,设置环境变量`PUB_CACHE`为`E:\path\to\new\pub_cache`(确保路径存在)。 - 然后重新运行`flutter pub get`,这样包就会被下载到新的缓存位置。 设置环境变量后,需要重新启动终端(或IDE)以使更改生效。 ### 总结步骤 首先尝试最简单的清理缓存和重新生成: 1. `flutter clean` 2. 手动删除`.android`目录(整个删除,Flutter会重新生成) 3. `flutter pub get` 4. `flutter run` 如果依然不行,考虑调整插件版本或者将项目移动到与缓存相同的驱动器。 §§相关问题§§ 1. 如何修改Flutter的包缓存路径? 2. Flutter项目中的`.android`目录有什么作用? 3. 如何解决Gradle任务中不同根目录导致的构建错误? </think> ### 解决 "Could not create task ':camera_android:generateDebugUnitTestConfig'" 错误 该错误是由于 Flutter 插件路径冲突导致的两个根目录不匹配问题(E:\ 和 D:\)。以下是系统性的解决方案: #### 1️⃣ **清理构建缓存(首要步骤)** ```bash # 在项目根目录执行 flutter clean rm -rf .android/build # Windows 使用 rd /s /q .android\build rm -rf .dart_tool ``` #### 2️⃣ **统一文件根目录(关键解决)** 错误核心是路径 `E:\...\flutter_module\.android\plugins_build_output\camera_android` 与 `D:\...\camera_android-0.10.9+11\android` 冲突: ```diff - 项目路径: E:\zsy\mobile\zhushun-cloudmix-main\flutter_module - 缓存路径: D:\flutter_pub_cache\hosted\pub.flutter-io.cn\ ``` **解决方案:** ```bash # 将PUB缓存迁移到E盘(与项目同驱动器) setx PUB_CACHE "E:\flutter_pub_cache" # 或移动整个项目到D盘 mv E:\zsy\mobile\zhushun-cloudmix-main D:\projects ``` #### 3️⃣ **修改插件依赖(持久化配置)** 在 `pubspec.yaml` 中指定路径依赖: ```yaml dependencies: camera_android: path: D:/flutter_pub_cache/hosted/pub.flutter-io.cn/camera_android-0.10.9+11 ``` 然后执行: ```bash flutter pub get ``` #### 4️⃣ **修改Gradle配置** 在 `android/settings.gradle` 中添加: ```groovy include ':camera_android' project(':camera_android').projectDir = new File( 'D:/flutter_pub_cache/hosted/pub.flutter-io.cn/camera_android-0.10.9+11/android' ) ``` #### 5️⃣ **验证路径一致性** 检查所有路径必须同属一个根目录: ```bash # 正确示例 E:\project\.android\... E:\flutter_pub_cache\... # 错误示例(会触发本问题) E:\project\.android\... D:\flutter_pub_cache\... ``` > **原理说明**:Gradle任务要求参与构建的所有文件必须共享同一个根目录(root),跨驱动器路径会被视为不同文件系统导致任务创建失败[^1][^4]。通过统一存储位置或显式声明路径映射可解决此问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值