Android多模块构建合并aar解决方案
zhaonyu
8年前
<h2>前言</h2> <p>前段时间,我在实现gradle多模块构建遇到一个问题,以前我们基本上是以jar包形式让开发者集成到工程中使用,但自从Android Studio中有了多module的概念,而我们的SDK也是分了多个模块进行构建的,但我们这里有个问题就是模块之间是相互关联的,不能针对每个模块单独打包,而每个module都会生成对应的aar,但并不会把依赖的module代码打进去,别问我为什么知道,你将aar后缀改为zip,然后反编译classes.jar就可以看到。所以我们这边就有了合并aar这样的一个需求,下面就告诉大家怎么来实现。</p> <h2>android-fat-aar</h2> <p>当时我遇到这个问题,就去github搜了一下,已经有人将合并aar的脚本开源出来了,开源地址如下:</p> <p><a href="/misc/goto?guid=4958975286001097901" rel="nofollow,noindex">https://github.com/adwiv/android-fat-aar</a></p> <h2>什么是aar?</h2> <p>什么是aar?它跟jar包有什么区别?它该怎么样使用?相信大家一定会有这些疑问。首先aar是针对 <strong>Android Library</strong> 而言的,你可以理解为IDE针对Android Library的打包,一个aar包含什么东西?</p> <p>它的文件后缀名是.aar,它本身是一个zip文件,强制包含以下文件:</p> <ul> <li>/AndroidManifest.xml</li> <li>/classes.jar</li> <li>/res/</li> <li>/R.txt</li> </ul> <p>另外,AAR文件可以包括以下可选条目中的一个或多个:</p> <ul> <li>/assets/</li> <li>/libs/name.jar</li> <li>/jni/abi_name/ <strong>name</strong> .so (where <strong>abi_name</strong> is one of the Android supported ABIs)</li> <li>/proguard.txt</li> <li>/lint.jar</li> </ul> <p>具体看到这里看如何创建一个Android Library:</p> <p><a href="/misc/goto?guid=4959725759343046802" rel="nofollow,noindex">https://developer.android.com/studio/projects/android-library.html#aar-contents</a><strong>jar包跟aar包有什么区别?</strong></p> <p>jar:只包含了class文件与清单文件,不包含资源文件,如图片等所有res中的文件。</p> <p>aar:包含所有资源,class以及res资源文件全部包含。</p> <p>如果你只是简单实用一些类库,你可以直接使用 *.jar 文件,而如果你想既想使用类库,又想实用资源,那么你就可以创建一个Android Library,使用它生成的 *.aar 文件。</p> <p>jar文件的使用方式我们应该比较熟悉了,将它复制到工程的libs目录下,然后在gradle中添加以下脚本:</p> <pre> <code class="language-java">dependencies { compile fileTree(include: ['*.jar'], dir:'libs') }</code></pre> <p>aar文件使用同样需要复制到libs目录下,并按照以下方式集成:</p> <pre> <code class="language-java">repositories { flatDir { dirs'libs' } } dependencies { compile(name:'your aar', ext:'aar') }</code></pre> <h2>多模块构建合并aar</h2> <p>这个是本文的重点,我们可以再每个module下的build/outputs/aar下找到编译生成的 *.aar 文件。</p> <p>步骤1:</p> <p>将gradle文件’fat-aar.gradle’到你的项目目录,然后apply:</p> <pre> <code class="language-java">apply from: 'fat-aar.gradle'</code></pre> <p>步骤2:定义嵌入的依赖关系</p> <p>你需要修改你以前依赖项,并将 compile 更改为 embedded ,作为你想要合并的aar。使用例子如下:</p> <pre> <code class="language-java">apply from: 'fat-aar.gradle' dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) // Order of dependencies decide which will have precedence in case of duplicates // during manifest / resource merger embedded project(':librarytwo') embedded project(':libraryone') // We can embed android libraries from maven too embedded 'com.adwiv.internal:librarythree:1.0.0' compile 'com.android.support:appcompat-v7:22.2.0' //Non embedded dependency }</code></pre> <p>通过以上的方式你可以将多个module生成的aar合成一个,大家可以新建一个demo工程来测试下</p> <p><img src="https://simg.open-open.com/show/f8eeb8473d7d08c6f502e10e16671d67.png"></p> <p> </p> <p>来自:http://blog.csdn.net/wwj_748/article/details/53230706</p> <p> </p>