在软件工程中,分治是最基本的设计原理,就如同现实中的砖、瓦、钢筋、水泥一样,模块化、组件化的分工,让我们整个软件世界变得井井有序,丰富多彩。
在Java开发中,添加组件简单的以添加jar文件依赖为途径,jar有两个含义:
jar文件格式:Java Archive,就是zip文件格式,文件名后缀是jar,包含了java class,metadata,资源(文本、图片等)。Java archive tool: JDK中的工具,用来生成jar包的工具。在Android应用资源中,Java Source,Resouce以及所需的so文件和jar包,用jar格式可以很好的处理Java Source,但对于目录比较复杂的Android Res目录,二进制依赖so文件和jar包则显得的乏力。当你收到一个第三方SDK zip包,要添加到自己的项目中,解压后是一个jar包和一堆文件夹,不停的复制粘贴甚至解决冲突的时候,心里肯定开始不满意这血吸虫组件分发方式了。
为了解决Android开发中组件引用的问题,引入aar格式。也是简单的zip格式。 定义:The ‘aar’ bundle is the binary distribution of an Android Library Project. Zip包中的内容有:
/AndroidManifest.xml (mandatory)/classes.jar (mandatory)/res/ (mandatory)/R.txt (mandatory)/assets/ (optional)/libs/*.jar (optional)/jni//*.so (optional)/proguard.txt (optional)/lint.jar (optional) 其中,R.txt是aapt –output-text-symbols命令的输出。在Android Studio1.4中,New project,先默认新建一个Applicaton module,接后File > New > New Module,选择Androd Library > Next,指定Library Name和Module Name。
新建的Library与正常的Application最大区别是module build.gradle中是apply plugin: ‘com.android.library’ 而不是 apply plugin: ‘com.android.application’.
Build > Make project(⌘F9),自动生成aar文件。
1 2 3 4 5 | build | outputs | aar | mylibrary-debug.aar | mylibrary-release.aar
aar可通过以下三种方式引入到项目中:
公共Maven仓库私有Maven仓库复制粘贴aar文件 前两种引入方式涉及到Gradle发布Library到Maven,另文介绍。 重点介绍第三种方式:把aar粘贴到要引入库的Application Module/libs目录下,如没有libs目录,创建就好。注意要在Application Module根目录下,不是Project根目录下。在Application Module/build.gradle中添加 1 2 3 4 5 repositories { flatDir { dirs 'libs' } }flatDir repositories用来声明文件目录做为依赖库,’libs’路径是build.gradle的相对路径,目录名称可以任意,也可以同时声明多个dirs。
在Application Module/build.gradle中添加依赖 1 2 3 dependencies { compile(name: 'mylibrary-debug', ext: 'aar') }在上文中看到aar文件中还包含了库中的AndroidManifest.xml文件,但是最终应用APK中只能有一个AndroidManifest.xml,就涉及到应用AndroidManifest.xml和所有库AndroidManifest.xml的合并。
合并顺序:
1.与Produt flavors和build types指定的清单文件2.application module的主清单文件3.library module的清单文件大多数情况下合并不会造成什么问题,如果发现合并后出现了问题:
检查最终的AndroidManifest.xml检查合并报告(app\build\outputs\logs\),日志文件的格式和内容本文中所用的项目代码托管在github。
AAR File Format http://tools.android.com/tech-docs/new-build-system/aar-format
Manifest merging user guide http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger