Flutter踩坑:Android property not found.

2,486 阅读3分钟

先剧透下: 依赖url_launcher也可能会导致这个问题,相同的解决方式。

今天在build flutter aar的时候报了个异常:

FAILURE: Build failed with an exception.

* Where:
Initialization script '/Users/frc/Library/Android/flutter/packages/flutter_tools/gradle/aar_init_script.gradle' line: 15

* What went wrong:
Android property not found.

问题分析

根据提示找到init_script.gradle文件:

就是上图标注的地方出错了。说是找不到Android属性。 这块之前打aar是没问题的,后来通过多方会诊确定是当前项目中的某个依赖库的flutter项目中缺少了android包。 如下图:

一般只有只针对ios的flutter三方库才会有这问题

定位问题

看下我都依赖了哪些库:

还好只有三个,flutter_swiperpull_to_refresh都只是ui相关不涉及原生功能,所以可以排除。 但是shared_preferences应该是android和ios都有啊。所以想定位真实情况,还得看shared_preferences的真实缓存内容。

flutter 依赖库缓存位置在.pub-cache目录下。该目录正常是在根目录下隐藏,可以使用command+shfit+.来使其显示(mac)。看下我的路径:

我们看到shared_preferences其实有四个文件:shared_preferences_macos-0.0.1+10,shared_preferences_web-0.1.2+7这两个看命名就是针对Macos和web的,所以他们里面没有android包那就说的过去了。

解决问题

解决思路有两个:

  • 1.在这两个文件夹中补充上android包
  • 2.移除shared_preferences_macos-0.0.1+10,shared_preferences_web-0.1.2+7这两个包

添加android目录

不要想着创建个命名为android的空目录就能蒙混过去,为啥我知道不行呢?因为我试过了呀.......。

我尝试着将shared_preferences-0.5.7+3目录下的android文件夹拷贝到shared_preferences_macos-0.0.1+10,shared_preferences_web-0.1.2+7文件夹中。然后重新build,然后就通过了。

移除macos和web包

不建议这么粗暴,虽然我们确实用不上macos和web的东西。但是还是得尊重下作者。

这时我的志超小伙说使用旧版(0.5.4+9)本就没问题。我试了下果然可以。

这里有个小坑,虽然我们在项目依赖中将版本下降为0.5.4+9,执行flutter pub get之后仍然不行,因为并没有下载老版本,项目中使用的还是0.5.7+3。试了flutter clean这些也没用,我这暴脾气直接去之前的目录把那四个文件给手动删了,然后再执行flutter pub get。然后,然后还是不行,pubspec.lock文件中还是指定的0.5.7+3版本。我没忍住把pubspec.lock也删掉。........还是不行。

上面的现象说明,某处配置导致了当前三方库总是下载最新的版本。那到底是哪?机智如我一猜就中:

如上图把版本号钱的^符号去掉就行。又GET到了。重新build下果然可以。

那么我又是怎么知道shared_preferences-0.5.4+9是没有Macos和web文件的呢? 看shared_preferences库的更新记录啊: 点我传送

总结:其实上面两种都是临时方案,最好还是等待三方库作者修复这问题。目前看到网上有类似问题都是最近10天提出来的,所以部分三方库作者现在可能 还没注意到这个,或者说flutter自己能修复这个问题