当前位置: 首页 > 科技观察

GradleforAndroidPart3(依赖管理)

时间:2023-03-13 00:02:38 科技观察

依赖管理依赖管理是Gradle最出彩的地方。在最好的情况下,你只需要在你的构建文件中添加一行代码,Gradle就会自动加载你下载相关的jar包并确保你可以正确使用它们。Gradle甚至可以为您做更多,包括当您向项目添加多个相同的依赖项时,Gradle会为您排除相同的jar包。本章我们将学习以下内容:Repositorylocaldependenciesdependencydependencyisrepositories的概念当我们说到依赖时,通常会说到远程仓库,比如那些专门为其他开发者提供依赖库的依赖。手动管理依赖关系会给你带来很多麻烦。您必须找到依赖文件位置,然后下载jar文件,将文件复制到您的项目中,然后引用它们。通常这些jar文件没有具体的版本号,所以你要记住它们的版本号,这样当你需要更新的时候,你就知道你需要更换哪个版本。你还必须把依赖包放到svn或者Git上,这样你的其他同事就不用手动去下载这些依赖jar了。这些问题都可以通过使用远程仓库来解决。仓库可以看作是一些文件的集合。默认情况下,Gradle不会向您的项目添加任何存储库。所以你需要将它们添加到存储库方法体中。如果你使用的是Androidstudio,工具已经为你准备好这一切:repositories{jcenter()}Gradle支持三种不同的仓库,即:Maven和Ivy以及文件夹。构建时将从这些远程存储库下载依赖项。当然,Gradle会在本地为你保留一个缓存,所以特定版本的依赖只需要下载一次。一个依赖需要定义三个元素:组、名称和版本。group表示创建库的组织的名称,通常这将是包名称,而name是库的唯一标识符。version是库的版本号,我们看看如何声明依赖:dependencies{compile'c??om.google.code.gson:gson:2.3'compile'c??om.squareup.retrofit:retrofit:1.9.0'}上面的代码它基于groovy语法,所以它的完整表达应该是这样的:dependencies{compilegroup:'com.google.code.gson',name:'gson',version:'2.3'compilegroup:'com.squareup.retrofit',name:'retrofit'version:'1.9.0'}为你的仓库预定义为了方便,Gradle会默认预定义三个maven仓库:Jcenter、mavenCentral和localmaven仓库。可以同时声明:repositories{mavenCentral()jcenter()mavenLocal()}Maven和Jcenter仓库是两个比较知名的仓库。我们不需要同时使用它们。这里建议大家使用jcenter,它是maven中央库的一个分支,可以随意切换这两个仓库。当然jcenter也支持https,但是maven仓库不支持。本地maven库是你用过的所有依赖包的集合,当然你也可以添加自己的依赖包。默认情况下,您可以在主文件下找到.m2文件夹。除了这些存储库之外,您还可以使用其他公共甚至私有存储库。一些远程仓库组织创建了一些有趣的插件或库,他们更喜欢将这些放在自己的maven库中,而不是maven中央库或jcenter。那么当你需要这些仓库的时候,只需要在maven方法中添加url地址即可:repositories{maven{url"http://repo.acmecorp.com/maven2"}}同样,ivy仓库也是可以的完毕。ApacheIvy是蚂蚁界知名的依赖管理工具。如果你的公司有自己的仓库,如果他们需要权限访问,你可以这样写:repositories{maven{url"http://repo.acmecorp.com/maven2"credentials{username'user'password'secretpassword'}}}注意:这不是一个好主意,最好的方法是将这些验证放在Gradleproperties文件中,我们在第2章已经介绍过。可能有些情况需要手动下载本地依赖的jar包,或者你想创建自己的库,这样你就可以在不同的项目中重用它,而不需要将库发布到公共或私有库。在上述情况下,您可能不需要网络资源。接下来我将介绍如何使用这些jar依赖,如何导入so包,以及如何将依赖项目添加到你的项目中。文件依赖如果你想为你的项目添加jar文件作为依赖,你可以这样做:dependencies{compilefiles('libs/domoarigato.jar')}打包的时候可以改写为:dependencies{compilefileTree('libs')}默认情况下,新建的Android工程会有一个lib文件夹,在dependencies中会这样定义(即添加所有libs文件夹下的jar文件):dependencies{compilefileTree(dir:'libs',include:['*.jar'])}这也意味着在任何Android项目中,你可以在libs文件夹下放一个jar文件,它会自动将其添加到构建路径和最终的APK文件中。用c或c++编写的原生包(sopackage)库,都会被称为sopackage。Android插件默认支持原生包。需要把.so文件放在对应的文件夹下:app├──AndroidManifest.xml└──jniLibs├──armeabi│└──nativelib.so├──armeabi-v7a│└──nativelib.so├───mips│└──nativelib.so└──x86└──nativelib.soaar文件如果你想共享一个库,依赖包使用Androidapi,或者包含Android资源文件,那么aar文件适合你.依赖库和应用项目是一样的,你可以使用相同的任务来构建和测试你的依赖项目,当然它们也可以有不同的构建版本。应用程序项目和依赖项目之间的区别在于输出文件。应用项目会生成一个APK文件,可以安装到Android设备上,而依赖项目会生成一个.aar文件。此文件可用作Android应用程序项目的依赖项。创建和使用依赖项目模块的区别在于你需要添加不同的插件:applyplugin:'com.android.library'我们有两种方式来使用依赖项目。一种是直接在你的项目中作为一个模块使用,另一种是创建一个aar文件,以便其他应用程序可以复用。如果你把它作为一个模块来使用,那么你需要在settings.gradle文件中添加它作为一个模块:include':app',':library'这里,我们就叫它library,如果你想使用这个模块,你您需要将它添加到您的依赖项中,如下所示:dependencies{compileproject(':library')}使用aar文件如果您想重用您的库,那么您可以创建一个aar文件并将其用作您的工程依赖。当您构建库项目时,将在build/output/aar/下生成aar文件。要使用这个文件作为你的依赖包,你需要创建一个文件夹来放置它,我们称之为aars文件夹,然后将它复制到这个文件夹中,然后将这个文件夹添加为依赖库:repositories{flatDir{dirs'aars'}}以便您可以使用此文件夹中的所有aar文件作为依赖项,您可以这样做:dependencies{compile(name:'libraryname',ext:'aar')}这将告诉Gradle,在aars文件夹下,添加一个名为libraryname的文件,其后缀为aar作为依赖。依赖概念配置有时,您可能需要与sdk协调工作。为了顺利编译您的代码,您需要将SDK添加到您的编译环境中。你不需要在你的APK中包含sdk,因为它已经存在于设备中,所以配置来了,我们将有5种不同的配置:compileapkprovidedtestCompileandroidTestCompilecompile是默认的,这意味着包含所有的依赖包,即在APK中,编译依赖是会存在的。apk表示它存在于apk中,但不会加入到编译中。这个好像用的比较少。provided的意思是提供编译支持,但是不会写入apk。testCompile和androidTestCompile将为测试添加额外的库支持。这些配置会用在测试相关的任务中,这对于添加JUnit或Espresso等测试框架非常有用,因为你只希望这些框架出现在测试apk中,而不是生产apk中。除了这些具体的配置之外,Android插件还提供了每个构建变体的配置,这使得debugCompile或releaseProvided等配置成为可能。如果您想针对调试版本添加日志记录框架,这将很有用。这些内容的细节将在下一篇博客中详细介绍。动态版本在某些情况下,您可能希望在构建应用程序或库时使用最新的依赖项。实现他的最好方法是使用动态版本。我现在将向您展示几种不同的方式来动态控制版本:dependencies{compile'c??om.android.support:support-v4:22.2.+'compile'c??om.android.support:appcompat-v7:22.2+'compile'c??om.android.support:recyclerview-v7:+'}第一行,我们告诉gradle获取最新的生产版本。第二行,我们告诉gradle我们要获取最新的minor版本,它的最小版本号是2。第三行,我们告诉gradle获取最新的library。你应该小心使用动态版本,如果你允许gradle选择最新版本,可能会导致选择一个不是稳定版本的依赖版本,这会给构建带来很多问题,更糟糕的是,你可能在你的server和privatepc上获取到不同的依赖版本,直接导致你的应用不同步。如果你在build.gradle中使用动态版本,Androidstudio会警告你动态版本的潜在问题,如下所示:AndroidstudioUI操作依赖库是使用Androidstudio时最简单的添加新依赖项的最佳方法是使用项目结构弹出窗口。从文件按钮打开界面,导航到依赖包导航栏,然后就可以看到你当前的依赖包了:当你想添加新的依赖包时,可以点击绿色小按钮,可以添加其他模块、文件,甚至网络搜索。使用Androidstudio界面可以让您轻松浏览项目中的所有依赖项并添加新的依赖项。无需在build.gradle中手动添加代码,直接在JCenter库中搜索依赖资源即可。总结在本章中,我们了解了添加依赖项的各种方式,我们了解了什么是仓库,如何使用它们,以及如何在不使用仓库的情况下使用jar文件。您现在了解了依赖包的属性配置、动态版本控制等。我们还讨论了在多个环境中构建应用程序变体。在下一章中,我们将了解什么是构建变体以及它们为何重要。构建变体将使开发、测试和分发应用程序变得更加容易。了解变体的工作原理可以加快您的开发和分发。