关于Android的AAR文件内部依赖问题

一点点废话

前几天着手开始对公司内部的一些通用框架进行拆分和二次分装,力求通用性更高,职责更明确,以形成良好的延续。同时也遇到了一些问题,比如咱们今天要说的AAR文件内部的依赖处理问题。由于自己封装的AAR文件内部又依赖了其他库,而在将自己封装的AAR文件通过Maven引用的时候发现项目根本没有把内部依赖同步到项目中。刚开始还以为自己通过Maven上传AAR文件到仓库的过程中出先了问题,后来Google了很长时间,最后才发现,原来是引用的姿势不对。

AAR文件的官方解析 点击阅读
  • AAR文件的文件扩展名为.aar,Maven工件类型也应当是aar.文件本身是一个包含以下强制性条目的zip文件

    • /AndroidManifest.xml
    • /classes.jar
    • /res/
    • /R.txt
  • 此外,AAR文件可能包含以下可选条目中的一个或者多个:

    • /assets/
    • /libs/name.jar
    • /jni/abi_name/name.so(其中abi_name是Android支持的ABI之一)
    • /proguard.txt
    • /lint.jar
  • 与Jar文件不同,AAR文件可以包含Android资源和一个清单文件,这样除了Java类与方法外,您还可以捆绑布局和可绘制对象等共享资源。

内部依赖的引用姿势
  • 我们一般情况下引用AAR文件可能是下面这种方式

    1
    compile: 'xxx.xxx.xxx:y.z:@aar'

    以这种方式引入,是不会处理依赖的。其实准确来说这种方式引入是默认的关闭了传递性依赖。那么,怎么开启传递性依赖呢?

  • 开启传递性依赖

    1
    compile('xxx.xxx.xxx:y.z:@aar') { transitive = true }

    就是上面的transitive关键字,设置为true,重新构建工程,内部依赖的库会同步到项目中。

  • 上面我们知道,使用了transitive后就可以处理依赖问题。那么如果你引入的AAR中依赖的common.jar,而项目中引入的其他AAR中也引入了common.jar,这个时候在项目构建的时候可能会现错误,为了解决这个问题,我们需要介绍另外一个关键字exclude

  • 排除传递性依赖

    1
    compile('xxx.xxx.xxx:y.z:@aar') { exclude(module: 'common') } // common为共同依赖的库文件名

    这样就可以解决问题啦~~~

参考文章
坚持原创技术分享,您的支持将鼓励我继续创作!
  • 本文作者: Author
  • 本文链接: http://iamfan.cn/cf6f/
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!