本文主要介绍在android工程中如何将共用代码建成公共包方便其余工程引用、引用后的工程结构分析、library引入方式的优缺点。java
个人公共库已开源,可见TrineaAndroidCommon@Github ,包含图片缓存、下拉刷新、静默安装及其余Android开发经常使用工具类,欢迎star和fork^_^。示例APK地址:TrineaAndroidDemoandroid
一、java中公共库的建立和引入git
熟悉java的朋友都知道在java中能够将公用代码提取出来新建工程,打包成jar包,而后经过外部依赖或是maven依赖加入其余工程使用。github
二、android中公共库的建立和引入缓存
使用android提供的is library功能建立公共库,android adt提供了公共库的建立方法,下面逐一介绍app
a. 新建android工程maven
这一步同通常的android工程建立方法,以下模块化
b. 设置工程属性为library工具
右击工程->properties->Android,将工程设置为是library,以下google
c. android公共库的引入方法
右击须要引入library的工程->properties->Android,在library中添加以前新建的common,以下
这样咱们就成功引入library了,对于引入后的工程结构分析能够参见本文下面第三部分介绍。引入后咱们能够正常的引入java类,对于资源能够像在同一个工程中引入便可,由于library的资源被并入了工程中。
PS:若是这个时候工程编译出错,则多是由于工程和公用library中资源的冲突问题,在后面的分析中咱们能够知道引入library后,对于工程的资源会进行合并。好比library中如今含有icon.png的drawable资源,若调用者资源中也含有icon.png则会编译报错,这个时候咱们能够将library中的icon资源删除,对于library来讲尽可能不要放这些drawable资源,咱们甚至能够以下图红圈所示删除全部drawable资源文件夹,防止冲突发生。
固然删除icon后同时须要修改相应的引用资源的文件,如这里AndroidManifest.xml中的android:icon
三、引用后的工程结构分析
引入library的工程目录结构以下
从上图三个黄色标记的地方咱们能够发现library的资源被并入了工程中,同时生成了两个同样的资源文件R.java。这样作的话,对于工程来讲能够方便的调用library中的资源,跟在同一个工程中调用资源无甚区别。
a、library的资源被并入调用者工程中,而且相同资源值被覆盖
library中存在strings.xml内容以下
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, AndroidCommon!</string>
<string name="app_name">AndroidCommon</string>
</resources>
调用者一样存在strings.xml,内容以下
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">TESTPROJECT</string>
<string name="string2">testString</string>
</resources>
最终R.java中的string咱们能够看到同时存在hello、app_name、string2三个变量,即资源被合并。而且app_name的值为TESTPROJECT,即资源值被覆盖。
b. 资源一致性
修改上面红色标记的AndroidCommon_src中的AndroidCommon的内容,会发现library中的内容也会被相应修改
c. 编译一致性
修改library的资源进行编译会发现调用者工程也会同时被编译。
4. library引入方式的优缺点
经过library方式成功引入了公用库
a. 提升了代码的复用率减小了开发量
b. 可使得项目模块化以及更好的扩展
同时对于这种工程方式的引入仍是以为有一些不妥的地方
a. 经过源码引入,而不是经过相似jar包引入,从而对于library的修改致使全部引入该library都须要同时编译过于麻烦