模块的 build.gradle 文件是否有一种相当简单的方法来指示应排除依赖项中的某些文件?我对从 AAR 中排除某些资源特别感兴趣.
Is there a reasonably simple way for a module's build.gradle file to indicate that certain files from a dependency should be excluded? I am specifically interested in excluding certain resources from an AAR.
LeakCanary 是一个有趣的库,用于帮助追踪内存泄漏.但是,它对 compileSdkVersion 的未记录要求为 21 或更高.虽然大多数项目不应该有这个问题,但库在没有充分理由的情况下要求某个 compileSdkVersion 是不合时宜的.开发团队可能已经冻结了他们的 compileSdkVersion 作为一般政策的一部分,只在他们的应用程序或其他东西的主要版本更新中更改这些类型的设置.
LeakCanary is an interesting library for helping to track down memory leaks. However, it has an undocumented requirement of compileSdkVersion of 21 or higher. While most projects should not have a problem with this, it's unseemly for a library to require a certain compileSdkVersion without a good reason. A development team may have frozen their compileSdkVersion as part of a general policy to only change those sorts of settings as part of major version updates of their app or something.
在这种情况下,至少对于 v1.3.1 的 LeakCanary,AFAICT 需要 compileSdkVersion 的唯一原因是因为 AAR 有一个 res/values-v21/ 目录,包含从 Theme.Material 继承的主题定义.此主题由诊断活动使用.最终用户永远不会看到该活动,只有在 debug 构建中的开发人员才能看到.坦率地说,那个活动看起来像什么,就主题而言,并不重要.强制 compileSdkVersion 为 21 只是为了让诊断活动具有特定主题,恕我直言,愚蠢.
In this case, for v1.3.1 of LeakCanary at least, the only reason compileSdkVersion is required, AFAICT, is because the AAR has a res/values-v21/ directory, containing a theme definition that inherits from Theme.Material. This theme is used by a diagnostic activity. That activity is never seen by end users, only by developers in debug builds. Frankly, what that activity looks like, theme-wise, does not really matter. Forcing a compileSdkVersion of 21 just to have that diagnostic activity have a certain theme is, IMHO, stupid.
如果作为 compile 指令的一部分,我们可以说嘿,请跳过这个 AAR 中的 res/values-v21/,好吧?".由于 -v21 主题只是提供了在别处定义的主题的替代定义,因此删除 -v21 主题不会在运行时破坏构建或破坏事物,而只会给我们一个以 Holo 为主题的诊断活动.
It'd be nice if as part of a compile directive we could say "hey, please skip res/values-v21/ from this AAR, m'kay?". Since the -v21 theme is simply providing an alternative definition of a theme defined elsewhere, dropping the -v21 theme will not break the build or break things at runtime, but merely will give us a Holo-themed diagnostic activity.
我看不到 this answer 如何处理依赖项.我也不确定是否完整,而且它似乎不被支持一个>.它也并不真正符合简单"的条件—我不希望有人尝试将其放入 build.gradle 文件中,只是为了阻止来自 LeakCanary 等诊断库的单个文件.
I fail to see how this answer works with dependencies. I am also uncertain if it is complete, and it certainly does not appear to be supported. It also doesn't really qualify as "simple" — I would not expect somebody to try dropping this in a build.gradle file just to block a single file from a diagnostic library like LeakCanary.
那么,有没有比这更简单的方法可以与当前版本的 Android Plugin for Gradle 一起使用?
So, is there something simpler than this that works with now-current editions of the Android Plugin for Gradle?
为您编写了高级 gradle 任务:
Wrote advanced gradle task for you:
final List<String> exclusions = [];
Dependency.metaClass.exclude = { String[] currentExclusions ->
currentExclusions.each {
exclusions.add("${getGroup()}/${getName()}/${getVersion()}/${it}")
}
return thisObject
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile ('com.android.support:appcompat-v7:20.+')
debugCompile ('com.squareup.leakcanary:leakcanary-android:1.3.1')
.exclude("res/values-v21/values-v21.xml")
releaseCompile ('com.squareup.leakcanary:leakcanary-android-no-op:1.3.1')
}
tasks.create("excludeTask") << {
exclusions.each {
File file = file("${buildDir}/intermediates/exploded-aar/${it}")
println("Excluding file " + file)
if (file.exists()) {
file.delete();
}
}
}
tasks.whenTaskAdded({
if (it.name.matches(/^process.*Resources$/)) {
it.dependsOn excludeTask
}
})
现在您可以在每个依赖项上使用方法 .exclude() ,提供到路径列表中,您想从指定的依赖项中排除.此外,您可以堆叠 .exclude() 方法调用.
Now you can use method .exclude() on each dependency, providing into list of paths, you want to exclude from specified dependency.
Also, you can stack the .exclude() method calls.
这篇关于如何从 AAR 依赖中排除特定资源?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!
更新到 Android Build Tools 25.1.6 GCM/FCM 后出现 IncompIncompatibleClassChangeError after updating to Android Build Tools 25.1.6 GCM / FCM(更新到 Android Build Tools 25.1.6 GCM/FCM 后出现 Incompatible
如何在 gradle 中获取当前风味How to get current flavor in gradle(如何在 gradle 中获取当前风味)
如何修复“意外元素<查询>在“清单How to fix quot;unexpected element lt;queriesgt; found in lt;manifestgt;quot; error?(如何修复“意外元素lt;查询gt;在“清单中找到错误
基于 Android Gradle 中多风味库的多风味应用Multi flavor app based on multi flavor library in Android Gradle(基于 Android Gradle 中多风味库的多风味应用)
Android 依赖在编译和运行时有不同的版本Android dependency has different version for the compile and runtime(Android 依赖在编译和运行时有不同的版本)
本地 aar 库的传递依赖Transitive dependencies for local aar library(本地 aar 库的传递依赖)