buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'comandroidtoolsbuild:gradle:123'
}
}
apply plugin: 'comandroidapplication'
android {
compileSdkVersion 22
buildToolsVersion "2201"
sourceSets {
main {
manifestsrcFile 'AndroidManifestxml'
javasrcDirs = ['src']
resourcessrcDirs = ['src']
aidlsrcDirs = ['src']
renderscriptsrcDirs = ['src']
ressrcDirs = ['res']
assetssrcDirs = ['assets']
}
androidTestsetRoot('tests')
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['jar'])
}
在做开发的时候,我们经常会导入一些库,库里面又会依赖其他的一些库,这就会导致有时候库版本冲突了,导致编译不能过!昨天刚好群里有个哥们问了一个这个错误,怎么解决,这里记录一下!(You should manually set the same version via DependenyResolution)
在进行解决这个之前,我们先了解一下,依赖时候填写的那一段长长的字符串是什么意思,类似以下的导入
comgithubdonkingliang 是分组,也就是group
ConsecutiveScroller 是module
440 是版本号
有了上面知识,我们继续
1依赖树
当发生了错误,我们需要知道是哪些库引入导致的冲突,这时候就需要依赖树了,gradle给我们提供了对应的查看命令,在我们Android Studio软件窗口的右边,分别点击 Gradle--(对应的module)--Tasks--help--dependencies (需要哪个module就选择哪个)
点击后会在build生成依赖树,这时候查找哪些库会额外导入冲突的库
通过依赖树找到哪些库导致的版本不一致,这时候字需要修改导入,就能解决问题
比如还有A库引入了livedata,那你这样修改,mudule和group请看顶部的知识点
Gradle是可以用于Android开发的新一代的BuildSystem,也是AndroidStudio默认的build工具。Gradle脚本是基于一种JVM语言--Groovy,再加上DSL(领域特定语言)组成的。因为Groovy是JVM语言,所以可以使用大部分的Java语言库。所谓DSL就是专门针对Android开发的插件,比如标准Gradle之外的一些新的方法(Method)、闭包(Closure)等。由于Gradle的语法足够简洁,而且可以使用大部分的java包,当之无愧地成为新一代BuildSystem。使用AndroidStudio新建一个工程后,默认会生成两个buildgralde文件,一个位于工程根目录,一个位于app目录下。还有另外一个文件--settingsgradle。根目录下的脚本文件是针对module的全局配置,它的作用阈所包含的所有module是通过settingsgradle来配置。app文件夹就是一个module,如果在当前工程中添加了一个新的module--lib,就需要在settingsgralde文件中包含这个新的module。gradle脚本的基本结构用我现在的工程举例来说,根目录的buildgradle的内容如下所示://Top-levelbuildfilewhereyoucanaddconfigurationoptionscommontoallsub-projects/modulesbuildscript{repositories{jcenter()}dependencies{classpath'comandroidtoolsbuild:gradle:100-rc4'//NOTE:Donotplaceyourapplicationdependencieshere;theybelong//intheindividualmodulebuildgradlefiles}}allprojects{repositories{jcenter()maven{url'pileSdkVersion21buildToolsVersion"2111"compileOptions{sourceCompatibilityJavaVersionVERSION_1_7targetCompatibilityJavaVersionVERSION_1_7}defaultConfig{applicationId"yourapplicationid"minSdkVersion14targetSdkVersion21versionCode2versionName"200"}signingConfigs{release{storeFilefile('releasekeystore')storePassword"yourstorepassword"keyAlias"yourkeyalias"keyPassword"yourkeypassword"}debug{storeFilefile('debugkeystore')}}buildTypes{release{minifyEnabledtrueproguardFilesgetDefaultProguardFile('proguard-androidtxt'),'proguard-rulespro'signingConfigsigningConfigsrelease}debug{signingConfigsigningConfigsdebug}}productFlavors{inner{applicationId"yourapplicationinnerid"versionName"200"}market{}}}repositories{flatDir{dirs'libs'}}dependencies{//通用compilename:'volley',ext:'aar'compile'comnostra13universalimageloader:universal-image-loader:193'compile'comalibaba:fastjson:latestintegration'//项目相关(已删除)}Groovy的基本语法方法调用applyplugin:'comandroidapplication'以上语句中的apply是一个方法,给它传递了一个参数plugin,plugin的值是'comandroidapplication'。如果有多个参数,则以逗号隔开,例如compilename:'volley',ext:'aar'闭包Groovy中花括号包含的部分成为一个闭包(Closure)。例如下面的代码compileOptions{sourceCompatibilityJavaVersionVERSION_1_7targetCompatibilityJavaVersionVERSION_1_7}compileOptions是一个Method,它的参数是一个闭包,这个闭包内依次执行了两个方法--sourceCompatibility和targetCompatibility,参数都是JavaVersionVERSION17。闭包也可以嵌套包含repositories{flatDir{dirs'libs'}}常见使用方法包依赖(aar)使用aar时可以分为两种情况①aar位于本地目录首先在android的参数闭包中添加调用方法repositoriesrepositories{flatDir{dirs'libs'}}然后在dependencies的参数闭包中添加compilename:'volley',ext:'aar'②aar位于远程仓库这里以maven为例,当然也可以使用其他类型的仓库,例如Ivy。只需要在jar包引用方式后面添加一个@aar就可以了compile'comalibaba:fastjson:latestintegration@aar'包依赖(jar)compilegroup:'comalibaba',module:'fastjson',version:'latestintegration'可以简写成compile'comalibaba:fastjson:latestintegration'latestintegration可以替换成具体的版本号,这里是获取服务器上的最新版本。去掉重复依赖compile'comalibabafastjsonlatestintegration'{excludemodule:'annotations',group:'comgoogleandroid'}使用Java7compileOptions{sourceCompatibilityJavaVersionVERSION_1_7targetCompatibilityJavaVersionVERSION_1_7}productFlavors针对不同的APP分发渠道,我们可以定义不同的productflavor。也可以定义内部版本和外部版本,内部版本中包含了一些调试代码,这些代码在发布时并不会被编译进最后的APP中。而且可以分别为内部版本和外部版本指定不同的ApplicationId,这样在同一个设备上可以同时安装两个版本以方便调试。命令行执行Gradle脚本在Android工程根目录下会自动生成一个shell脚本-gradlew,执行之前记得加上x属性-chomod+xgradlewgradle脚本中包含了很多task,可以通过task名来指定需要执行的task。/gradlewbuild/gradlewassemble/gradlewassembleInnderDebug总结不得不说,Gradle实在太好用了!虽然Gradle可以与Ant或maven配合使用,但是其简洁和功能性远远超过其他两个。我现在开发的项目普遍使用的是maven,不知道什么原因,使用Gradle时经常会遇到一些无法获取远程依赖包的问题,最简单的解决法就是把依赖包下载的本地。
比如编译项目需要依赖 Lib A,而Lib A 又同时依赖 Lib C,则 Lib C 就被称为是项目的传递依赖。
这会引入一个问题,比如当前工程同时依赖 Lib A 和 Lib B,而 Lib A 依赖 Lib C 的 11 版本,Lib B 依赖 Lib C 的 12 版本,在编译项目时就会引入 Lib C 版本冲突问题。
可以通过命令:gradle androidDependencies 查看项目的整体依赖。
+--- comexample:LibA:10
| | +--- comexample:libC:11
+--- comexample:LibB:10
| | +--- comexample:libC:12
方式1:强制设置依赖项版本
方式2:声明依赖项替换规则
方式1:排除项目所有传递依赖
方式2:排除项目所有对LibC的传递依赖
方式3:排除LibA中依赖LibC的传递依赖
假设我们有项目, ProjectA, ProjectB 和 ProjectC, 此时, A依赖B, B依赖C, 那么这种依赖就是传递依赖
例如上面的例子, 我们打印出当前依赖jar的位置
android-native-dependencies是一个自动处理查找&下载&拷贝原生函数库依赖到jniLibs目录的Android插件,这样在APK构建过程中可以自动包含这些函数库。
这个插件使用跟声明查找jar包一样的仓库,下面是一个例子:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'comandroidtoolsbuild:gradle:010+'
classpath 'comnabilhachicha:android-native-dependencies:01'
}
}
apply plugin: 'android'
apply plugin: 'android-native-dependencies'
native_dependencies {
artifact 'comsnappydb:snappydb-native:02+:armeabi'
artifact 'comsnappydb:snappydb-native:02+:x86'
}
dependencies {
//regular Jar dependencies
}
规约
DSL artifact遵循Maven artifacts的命名规则。因此,我们下面两种语法都可以使用:
group:name:version[:classifier]缩写
//adding x86 classifier will resolve only intel's (so) lib
native_dependencies {
artifact 'comsnappydb:snappydb-native:02+:x86'
}
//omit the classifier will resolve all supported architectures
native_dependencies {
artifact 'comsnappydb:snappydb-native:02+'
}
映射风格
//adding x86 classifier will resolve only intel's (so) lib
native_dependencies {
artifact group: 'comsnappydb', name: 'snappydb-native', version: '02+', classifier: 'x86'
}
//omit the classifier will resolve all supported architectures
native_dependencies {
artifact group: 'comsnappydb', name: 'snappydb-native', version: '02+'
}
在每种语法中,classifier都是可选的。这意味着,当忽略classifier时,插件将会尝试获取所有类型CPU架构(armeabi, armeabi-v7a, x86和mips)的artifacts。
在Android开发过程中会总会引入一些第三方依赖库,无可避免的会遇到jar/aar包冲突,Manifest合并冲突,资源冲突等问题
基于此本次主要记录下如何处理类冲突,jar/aar版本冲突。先由常见的comtautdid2aaa found in modules alicloud-android-utdid-252 android-utdid冲突入手,常见于支付宝sdk和友盟Sdk的冲突。
磨刀不误砍材工,在处理冲突问题前,要先了解下如何查看Gradle依赖树,在AS的Terminal里输入 gradle :app:dependencies 即可查看gradle依赖树。输出结果如下(示意)
输出依赖树后,在里面搜索android-utdid,会发现有多个第三方库对utdid存在引入关系。
经过查看得知utdid我依赖为:comaliyunams:alicloud-android-utdid:252
该依赖库的Group为comaliyunams。module为alicloud-android-utdid
下面要做的就是去除其他依赖对utdid的引入,仅保留一次有效的引用关系即可。
implementation ('comxxx:yyy:0004'){
exclude module: 'alicloud-android-utdid'
}
implementation ('comaaa:bbb:04'){
exclude module: 'alicloud-android-utdid'
}
常规查阅资料大家推荐去除重复引入的方法都是exclue group。实际上如该group下的依赖项较多,且只想去除某一个依赖时,这时使用exclude module能更细节且准确的控制去除某一项的引用关系。
以上为utdid的处理方式
关于微信sdk冲突的处理方式
问题背景:我方已集成wechat-sdk-android-with-mta sdk用作分享和支付功能,随着业务发展需要接入一个第三方业务Sdk,该Sdk内部具备支付功能,他们也进行了wechat-sdk-android-with-mta的引入,且两个微信sdk的版本不一致。
此时如果进行打包就会爆出各种comtecentxx的类冲突。
处理方式参照支付宝sdk的冲突方式
implementation ('comxxx:zzz:06'){
exclude module: 'wechat-sdk-android-with-mta'
}
关于百度地图API_KEY冲突的处理方式
百度地图需要在主工程的Manifest里注册一个API_KEY。如此时引入的第三方Sdk里同样有百度地图,且已经在内部注册了combaidulbsapiAPI_KEY。
此时会出现Manifestxml的合并冲突。解决方式为增加tools:replace="android:value"属性即可
<meta-data
android:name="combaidulbsapiAPI_KEY"
android:value=""
tools:replace="android:value"/>
在开发中不同第三方Sdk对基础依赖的版本会发生变化,比如ktx和compact的版本。需要强制指定这些基础依赖的版本统一
方式为在buildgradle(app)里增加
configurationsall{
resolutionStrategyforce'androidxcore:core-ktx:180-alpha01'
}
后续将持续添加AndroidStudio里各种冲突的处理方式。
title: gradle基础
date: 2018-01-12 14:50:13
categories: android
tags: android基础学习
Gradle 是一个能通过插件形式自定义构建逻辑的优秀构建工具。
以下的一些特性让我们选择了 Gradle:
这里主要记录几个比较常用,重要的点。
gradle的依赖主要分成本地包依赖和远程包依赖。
依赖的关键字主要包括:
依赖格式:
其中的group表示组织,name表示要依赖的库,vesion表示版本。
我们可以简写成
当然,不单只有对jar包的依赖,还可以有对文件的依赖,对项目的依赖,他们的写法依次如下:
上面讲到的就是本地依赖的方式:
首先需要添加远程仓库,android中至少添加一个远程仓库,例如使用开放的maven仓库。
然后,就对添加具体依赖。
启动混淆非常简单,只需要在 buildgradle 中启动即可。
其中的 minfyEnabled 默认是false,即不混淆,因为启动混淆编译速度会比较慢。
与混淆相关的还有一个 shrinkResources 属性,可以通过将其设置为 true ,设置资源文件压缩。
以上就是关于android studio怎么使用使用gradle 依赖全部的内容,包括:android studio怎么使用使用gradle 依赖、解决gradle依赖库冲突、Gradle未能解决Android Studio的依赖问题,怎么解决等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)