用Gradle 构建你的android程序-依赖管理篇

原创
2013/05/22 13:46
阅读数 338

<div id="post" class="entry"> <h2 id="menuIndex0">前言</h2> <p>续上一篇《用Gradle 构建你的android程序》,这次把上次没写的关于,如何用gralde 构建带有依赖的项目补全吧。</p> <a name="more"></a> <h2 id="menuIndex1">Gradle android 插件现况</h2> <p>个人感觉还是说说,目前android gradle 插件的现况,如无意外应该是最新的。</p> <p>目前最新的官方gradle android 是0.4,除了android 官方的gralde的插件,也有一些开发者很早以前开发的gradle 插件,不过现在基本不维护了,所以这里不对这些第三方的gradle插件进行介绍。</p> <p><a href="http://search.maven.org/#artifactdetails|com.android.tools.build|gradle|0.4|jar">android Gradle 0.4 插件maven中央库</a>,目前新的android gradle 构建系统基本完善,现在已知的问题有</p> <ol> <li>不支持android library 与 android library 的互相引用。 </li> <li>不支持 NDK </li> <li>不支持android library 打包文件(*.aar) 的本地引用 </li> </ol> <p>如果,以上问题的你都碰到不到的话,从现在开始,用gradle来构建android程序是一个不错的选择。</p> <h2 id="menuIndex2">引用依赖</h2> <p><strong>这里阅读的前提是你已经把上一篇已经看过。</strong></p> <h3 id="menuIndex3">本地依赖</h3> <p>gradle 作为构建工具,能够很方便的使用本地jar包,以下为使用的代码块。</p> <figure class="highlight lang-groovy localDependics"> <table><tbody> <tr> <td class="gutter"> <pre>1 2 3 4 5 6 7 8 9 10</pre> </td>

    <td class="code">
      <pre>dependencies {
<span class="comment">//单文件依赖</span>
compile files(<span class="string">'libs/android-support-v4.jar'</span>)
<span class="comment">//某个文件夹下面全部依赖</span>
compile fileTree(<span class="keyword">dir</span>: <span class="string">'libs'</span>, include: <span class="string">'*.jar'</span>)

}

android {

}</pre> </td> </tr> </tbody></table>

</figure>

<h3 id="menuIndex4">远程依赖</h3>

<p>gradle 同时支持maven,ivy,由于ivy我没用过,所以用maven 作为例子,以下为代码块:</p> <figure class="highlight lang-groovy remoteDependics">

<table><tbody> <tr> <td class="gutter"> <pre>1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21</pre> </td>

    <td class="code">
      <pre>repositories {
<span class="comment">//从中央库里面获取依赖</span>
mavenCentral()
<span class="comment">//或者使用指定的本地maven 库</span>
maven{
	url <span class="string">&quot;file://F:/githubrepo/releases&quot;</span>
}
<span class="comment">//或者使用指定的远程maven库</span>
maven{
	url <span class="string">&quot;https://github.com/youxiachai/youxiachai-mvn-repo/raw/master/releases&quot;</span>
}

}

dependencies { <span class="comment">//应用格式: packageName:artifactId:version</span> compile <span class="string">'com.google.android:support-v4:r13'</span> }

android {

}</pre> </td> </tr> </tbody></table>

</figure>

<h3 id="menuIndex5">android library 依赖</h3>

<p>对于项目依赖 android library的话,就不是依赖一个jar,那么简单了,在这里需要使用gradle mulit project 机制。例子的话,我就不重复写了,具体参考上一篇提到的德国人写的例子。<strong>记得把插件版本改为 0.4</strong> <a href="https://github.com/Goddchen/Android-Gradle-Examples/tree/master/Gradle%20Library%20Projects"></a><a href="https://github.com/Goddchen/Android-Gradle-Examples/tree/master/Gradle%20Library%20Projects">https://github.com/Goddchen/Android-Gradle-Examples/tree/master/Gradle%20Library%20Projects</a> </p>

<p><strong>注意对于android library <code>build.gradle</code> 记得要把</strong></p>

<blockquote> <p>apply plugin: 'android' 改为 apply plugin: 'android-library'</p> </blockquote>

<h4>Mulit project 设置</h4>

<p>Mulit project 设置是gradle 约定的一种格式,如果你需要编译某个项目之前,要先编译另外一个项目的时候,就需要用到,结构如下图(来自于官方文档):</p>

<blockquote style="border-bottom-style: none; padding-bottom: 0px; margin: 0px 0px 0px 40px; border-left-style: none; padding-left: 0px; padding-right: 0px; border-top-style: none; border-right-style: none; padding-top: 0px"> <div><span style="line-height: 1.6; font-style: normal; font-size: 10pt"><font face="courier new, monospace">MyProject/</font></span></div>

<div><font style="font-style: normal" face="courier new, monospace">| settings.gradle</font></div>

<div><font style="font-style: normal" face="courier new, monospace">+ app/</font></div>

<div><font style="font-style: normal" face="courier new, monospace">&#160;&#160;&#160; | build.gradle</font></div>

<div><font style="font-style: normal" face="courier new, monospace">+ libraries/</font></div>

<div><font style="font-style: normal" face="courier new, monospace">&#160;&#160;&#160; + lib1/</font></div>

<div><font style="font-style: normal" face="courier new, monospace">&#160;&#160;&#160;&#160;&#160;&#160; | build.gradle</font></div>

<div><font style="font-style: normal" face="courier new, monospace">&#160;&#160;&#160; + lib2/</font></div>

<div><font style="font-style: normal" face="courier new, monospace">&#160;&#160;&#160;&#160;&#160;&#160; | build.gradle</font></div>

</blockquote>

<p>你需要在你的workplace 目录下面创建settings.gradle 的文件,然后在里面写上:</p>

<blockquote> <p>include ':app', ':libraries:lib1', ':libraries:lib2'</p> </blockquote>

<p>那样,gradle mutil project 就设置完毕。</p>

<p>对于app project 如果需要应用libraries 目录下的 lib1 ,你只需要在app project <code>build.gradle</code> 里面的依赖中这么写:</p> <figure class="highlight lang-groovy android-library">

<table><tbody> <tr> <td class="gutter"> <pre>1</pre> </td>

    <td class="code">
      <pre><span class="title">compile</span> project(<span class="string">':libraries:lib1'</span>)</pre>
    </td>
  </tr>
</tbody></table>

</figure>

<p>即可完成,写完以后可以用<code>gradle AndroidDependencies</code> 来检查依赖状况。</p>

<h3 id="menuIndex6">需要注意的地方</h3> <figure class="highlight lang-python notice">

<table><tbody> <tr> <td class="gutter"> <pre>1 2 3 4 5 6 7 8 9</pre> </td>

    <td class="code">
      <pre><span class="title">buildscript</span> {
repositories {
    mavenCentral()
}

dependencies {
    <span class="class">classpath 'com.android.tools.build:gradle:0.4'
}

} </span></pre> </td> </tr> </tbody></table>

</figure>

<p>对于<code>buildscript{}</code> 在android gradle是用来预置插件环境,一般不建议把依赖写着里面,推荐的依赖写法是:</p> <figure class="highlight lang-python notice">

<table><tbody> <tr> <td class="gutter"> <pre>1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</pre> </td>

    <td class="code">
      <pre>buildscript <span class="cell">{
repositories {
    mavenCentral()
}</span>

dependencies <span class="cell">{
    classpath <span class="string">'com.android.tools.build:gradle:0.4'</span>
}</span>

}

repositories <span class="cell">{ //从中央库里面获取依赖 mavenCentral() //或者使用指定的本地maven 库 maven{ url "file://F:/githubrepo/releases" }</span> }

dependencies <span class="cell">{ //应用格式: packageName:artifactId:version compile <span class="string">'com.google.android:support-v4:r13'</span> }</span></pre> </td> </tr> </tbody></table>

</figure>

<h2 id="menuIndex7">使用Maven 管理库</h2>

<p>gradle 对于包的管理,支持filesystem,maven,ivy,这里我重点说说如何利用maven 进行android 依赖包的管理</p>

<h3 id="menuIndex8">利用Gradle 发布本地maven 库</h3>

<p>对于如何打包一个jar 包并且发布到maven,这是java 的基本知识,这里就不说了。</p>

<p>我们现在要学习的是,例如发布一个android library 包。</p>

<p>在过去,android library并没有一个很好的包管理方式,简单来说,在gradle出现以前,官方并没有一种用于管理android library 依赖包的方式,一般我们都是直接下载别人的android library project 源码进行集成,而对于第三方的android-maven-plugin 用的是apklib 格式。</p>

<p>而现在,官方终于推出一种android library的打包格式,扩展名为<code>*.aar</code>。前面提到,目前android gradle插件并不支持本地直接使用<code>*.aar</code>文件,不过,支持包管理库的引用方式,下面,我为大家说一下,怎么对android library 发布使用。</p>

<ol> <li> <p>打包android library </p>

  <blockquote>
    <p>对android library 进行打包直接在library项目下面使用<code>gradle build</code> 即可,然后,你就会在 build/libs 目录下看到两个<code>*.aar</code>文件,一个debug包用的,一个是release 下用的,看个人需求使用,这里我们用的是release 版本的 .aar 文件。</p>
  </blockquote>
</li>

<li>
  <p>发布脚本</p>

  <blockquote>
    <p>android library project 目录的 build/libs 下创建一个build.gradle 文件 </p>

<figure class="highlight lang-groovy publish">

    <table><tbody>
        <tr>
          <td class="gutter">
            <pre>1

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18</pre> </td>

          <td class="code">
            <pre><span class="title">apply</span> plugin:<span class="string"> 'maven'</span>

<span class="title">group</span> =<span class="string"> 'com.youxiachai'</span>

<span class="title">artifacts</span> { //当前aar 文件名 archives file('<span class="type">Gradlelib</span>.aar') }

<span class="title">uploadArchives</span> { repositories { mavenDeployer { repository(url: <span class="string">"file://F:/githubrepo/releases"</span>) pom.version =<span class="string"> 'r1'</span> pom.artifactId =<span class="string"> 'gradletest'</span> } } }</pre> </td> </tr> </tbody></table>

</figure><code>gradle uploadArchives</code>即可完成包的发布。

    <p></p>
  </blockquote>
</li>

</ol>

<p>完成以上两步就可以直接用maven 引用jar的依赖那样,引用android library 的依赖。</p>

<h2 id="menuIndex9">扩展阅读</h2>

<p><a href="http://v.youku.com/v_show/id_XNTYwMzY0NDYw.html">Google I/O 2013 上面介绍的android Gralde build System‎ (已经转载到优酷)</a></p>

<p><a href="https://plus.google.com/+XavierDucrohet/posts">Xavier Ducrohet</a> Android SDK Tech Lead,上面那个视频就是这个人演讲的。</p>

<p><a href="https://groups.google.com/forum/#!topic/adt-dev/">adt-dev社区</a> 因为用gradle 构建android 是新系统,一般而言有问题是搜索不到的,有问题还是上社区直接问吧,一般<a href="https://plus.google.com/+XavierDucrohet/posts">Xavier Ducrohet</a> 都会帮你解决。</p> </div>

展开阅读全文
打赏
0
6 收藏
分享
加载中

引用来自“Ivan”的评论

请教一个问题,Java源文件中有中文的话编译就会出现乱码,如果是自己的源文件还好点,可以把中文去掉,但是第三方Jar 就难搞了

不太明白你的意思,如果只是注释中文的话,就算是乱码也不影响编译吧?
2013/05/24 13:21
回复
举报

引用来自“Ivan”的评论

请教一个问题,Java源文件中有中文的话编译就会出现乱码,如果是自己的源文件还好点,可以把中文去掉,但是第三方Jar 就难搞了

中文。。。。。???代码是中文的????
2013/05/24 13:17
回复
举报
请教一个问题,Java源文件中有中文的话编译就会出现乱码,如果是自己的源文件还好点,可以把中文去掉,但是第三方Jar 就难搞了
2013/05/24 11:08
回复
举报

引用来自“Ivan”的评论

录视频比较容易懂。

?? 有个官方的视频。。。叫我录视频算了。。。
2013/05/23 17:16
回复
举报
录视频比较容易懂。
2013/05/23 17:02
回复
举报
更多评论
打赏
5 评论
6 收藏
0
分享
返回顶部
顶部