Robolectric单元测试 - Android Could not determine artifacts for XXXX: Skipped due to earlier error

解决Robolectric单元测试资源找不到及Gradle版本问题
在使用Robolectric进行单元测试时遇到资源类找不到的错误,通过在app的gradle中添加`testOptions.unitTests.includeAndroidResources = true`来尝试解决。但随后出现androidx.test.monitor2包找不到的问题,经过排查发现Gradle版本差异可能是原因。将我的Gradle版本从公司内部库更新为同事使用的较旧版本(4.1)后,问题得到解决。

最近使用Robolectric单元测试的时候遇到如下问题:

一直报资源类找不到,需要在app下的gradle中加入(代码手动打的,可能会有错误,见谅)

testOptions{
	unitTests{
			includeAndroidResources = true
	}
}

加完上面代码之后出现了标题的错误,具体是androidx.test.monitor2…这个找不到,每次sync好久,然后报同样错误,参考了如下链接文章,但是对我帮助不大。

请同事帮忙看下,比较了我们俩配置,发现Gradle版本引用不同(gradle/wrapper/gradle-wrapper.properties),之前的引用是:

distributionUrl:=https\://service.gradle.org/distributions/gradle-5.4.1-all.zip

我的是从公司映射maven库中直接拿,她是本地的引用且版本较低些:

distributionUrl:=../../../../tools/gradle-4.1-all.zip

我按她的配置从新改了gradle配置,重新sync了下,问题解决。

Error:Skipped due to earlier error

<think> 我们正在处理Unity打包安卓时出现的依赖解析错误。主要问题包括: 1. 无法确定任务':unityLibrary:compileReleaseAidl'的依赖 2. 无法解析com.google.guava:guava:33.0.0-android,因为存在多个变体(androidApiElements和jreApiElements)且Gradle无法自动选择 3. 找不到本地模块依赖:applovin-max-unity-plugin, CopyPastePlugin-debug, UnityAds 根据引用[1]、[2]、[3]和用户之前的问题,我们采取以下步骤: 步骤1:确保Gradle配置正确 - 引用[2]提到:修改Unity安装目录下的mainTemplate.gradle文件(位于[UnityInstallationDirecory]\Editor\Data\PlaybackEngines\AndroidPlayer\Tools\GradleTemplates) - 在Unity编辑器中启用自定义Gradle模板:Project Settings > Publishing Settings > 勾选Custom Base Gradle Template和Custom Main Gradle Template 步骤2:解决Guava依赖冲突 - 在mainTemplate.gradle中添加resolutionStrategy,强制指定guava的变体(因为我们需要android变体): ```gradle configurations.all { resolutionStrategy { // 强制使用android变体,因为我们在Android环境中 force 'com.google.guava:guava:33.0.0-android' // 也可以指定依赖的属性,但这里直接强制版本并让Gradle选择android变体 } } ``` - 同时,我们可以通过指定属性来帮助Gradle选择正确的变体(在dependencies块之前): ```gradle configurations.all { resolutionStrategy { eachDependency { details -> if (details.requested.group == 'com.google.guava' && details.requested.name == 'guava') { // 设置属性,告诉Gradle我们需要android环境的库 details.useTarget group: details.requested.group, name: details.requested.name, version: details.requested.version, because 'resolve android variant' details.attributes { attribute(BuiltInAttributes.ARTIFACT_TYPE_ATTRIBUTE, 'jar') // 或者根据情况选择 attribute(BuiltInAttributes.TARGET_PLATFORM_ATTRIBUTE, 'android') } } } } } ``` 但是,更简单的方式是直接强制版本,因为Unity的Android环境应该会自动选择android变体。如果上面的方法无效,可以尝试显式排除jre变体: ```gradle dependencies { implementation('com.google.guava:guava:33.0.0-android') { exclude group: 'com.google.guava', module: 'guava-jre' // 如果有这个模块的话 } } ``` 注意:实际上,guava:33.0.0-android这个坐标下并没有guava-jre模块,所以我们需要通过属性来解决。 步骤3:添加缺失的本地模块依赖 - 错误信息显示找不到:applovin-max-unity-plugin, CopyPastePlugin-debug, UnityAds - 这些应该是本地的Unity插件,通常位于Assets/Plugins/Android目录下,以.aar或.jar形式存在。 - 我们需要在mainTemplate.gradle的dependencies块中添加这些本地依赖: ```gradle dependencies { // ... 其他依赖 implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) // 或者单独指定 implementation files('libs/applovin-max-unity-plugin.aar') implementation files('libs/CopyPastePlugin-debug.aar') implementation files('libs/UnityAds.aar') } ``` 注意:确保这些文件确实存在于Plugins/Android/libs目录下(如果没有libs目录,请创建,并将文件放入)。或者,如果这些文件在Assets/Plugins/Android下直接,我们可以使用: ```gradle implementation fileTree(dir: 'src/main/libs', include: ['*.jar', '*.aar']) ``` 但是,在Unity中,通常我们使用相对路径,因为Unity在构建时会将这些文件复制到临时目录。正确的做法是使用以下路径: ```gradle implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) ``` 因为Unity会将Assets/Plugins/Android下的文件复制到android构建的libs目录。 步骤4:使用External Dependency Manager进行强制解析(引用[3]) - 在Unity编辑器中,选择菜单:Assets > External Dependency Manager > Android Resolver > Force Resolve - 引用[3]提到:勾选Custom Main Gradle Template选项后,Force Resolve会很快成功,因为它会将依赖配置添加到mainTemplate.gradle中。 步骤5:解决AppLovin版本不一致问题(引用[1]) - 引用[1]指出:AppLovin项目中版本与出包后版本不一致,如项目中为13.1.0,出包后为13.2.0。 - 因此,我们需要确保在Unity中使用的AppLovin MAX Unity插件版本一致,并且在mainTemplate.gradle中指定的版本与插件自带的版本一致。 步骤6:如果仍然遇到问题,检查Gradle版本和Android Gradle插件版本 - 在baseProjectTemplate.gradle中,确保使用兼容的Gradle插件版本。例如: ```gradle buildscript { repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:4.2.1' // 推荐使用4.2.1,因为Unity2020.3之后支持 } } ``` 总结步骤: 1. 启用自定义Gradle模板(两个都勾选)。 2. 修改mainTemplate.gradle- 添加resolutionStrategy强制guava版本(或解决变体冲突)。 - 添加缺失的本地依赖(fileTree或单个文件)。 3. 使用External Dependency Manager强制解析。 4. 确保所有第三方插件(特别是AppLovin)版本一致。 如果问题仍然存在,请检查: - 是否所有插件都支持当前Unity版本。 - 是否在Android Resolver中排除了冲突的依赖。 注意:由于错误中提到了多个缺失的本地模块,请务必确认这些模块的文件确实存在于项目中。如果不存在,需要重新导入这些插件。 最后,生成相关问题: </think> 针对Unity打包安卓时出现的依赖解析错误和缺失依赖问题,以下是系统化的解决方案: ### 一、核心解决步骤 1. **修复缺失本地依赖** - 检查项目中是否存在以下文件(路径:`Assets/Plugins/Android/`): - `applovin-max-unity-plugin.aar`(或`.jar`) - `CopyPastePlugin-debug.aar` - `UnityAds.aar` - 若文件缺失: - 重新导入最新版[AppLovin MAX Unity插件](https://dash.applovin.com/documentation/mediation/unity/getting-started) [^1] - 确认Unity Ads插件已通过Package Manager安装 - 检查CopyPastePlugin是否在项目Assets目录中 - 在`mainTemplate.gradle`中添加显式依赖: ```gradle dependencies { implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) implementation files('libs/applovin-max-unity-plugin.aar') implementation files('libs/CopyPastePlugin-debug.aar') implementation files('libs/UnityAds.aar') } ``` 2. **解决Guava依赖冲突** ```gradle configurations.all { resolutionStrategy { // 强制使用Android变体 force 'com.google.guava:guava:33.0.0-android' // 显式选择android变体 eachDependency { details -> if (details.requested.name == 'guava') { details.useTarget( "com.google.guava:guava:33.0.0-android", { because "解决Android/JRE变体冲突" attributes { attribute(Attribute.of("org.gradle.jvm.environment", String), "android") } } ) } } } } ``` 3. **启用Gradle模板配置** - Unity Editor → `Project Settings > Publishing Settings`: ✅ **Custom Base Gradle Template** ✅ **Custom Main Gradle Template** ✅ **Custom Gradle Properties Template** - 参考[^2][^3]修改模板文件 4. **执行依赖强制解析** - Unity菜单栏: ``` Assets > External Dependency Manager > Android Resolver ``` → 依次执行: ✅ **Delete Resolved Libraries** ✅ **Force Resolve** ### 二、版本一致性检查 1. 确保所有SDK版本兼容: ```gradle // mainTemplate.gradle dependencies { // AppLovin MAX必须≥11.0.0 implementation 'com.applovin:applovin-sdk:11.11.3' // Unity Ads需匹配Unity版本 implementation 'com.unity3d.ads:unity-ads:4.9.2' // Guava保持33.0.0-android implementation 'com.google.guava:guava:33.0.0-android' } ``` 2. 排除冲突依赖(示例): ```gradle implementation ('com.applovin.mediation:unityads-adapter:4.9.2') { exclude group: 'com.google.android.gms' exclude group: 'androidx.recyclerview' } ``` ### 三、项目清理与验证 1. 清理缓存: - 删除项目目录下的`Library`、`Temp`、`Build`文件夹 - 删除`~/.gradle/caches`目录 2. 验证依赖树: ```bash # 在工程目录执行 ./gradlew :unityLibrary:dependencies --configuration releaseCompileClasspath ``` > **关键提示**: > - AppLovin版本必须与Unity插件[严格匹配](https://dash.applovin.com/documentation/mediation/unity/getting-started#sdk-versions),避免自动升级导致冲突[^1] > - 使用`Force Resolve`后必须检查`mainTemplate.gradle`是否包含最新依赖[^3] > - Android SDK Build Tools推荐30.0.3+(与Gradle 4.2.1兼容)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值