一次集成aar的经历

公司和某知名支付公司合作,互相交换渠道。对方使用我们的扫码和公众号、服务窗支付。我们使用对方的支付宝APP支付。一切准备工作弄完后开始接入。

对方扔过来的sdk是aar的,当时就傻眼了。以前只用过jar,没用过aar。于是上网恶补了这部分的知识。不禁感叹到,如果aar早些出来,当时就不用那么辛苦手写布局了。

把对方的pay.aar放到libs目录,在gradle中配置引入:
增加

repositories {
    flatDir { dirs 'libs' }
}

在 dependencies 中增加:

    compile(name: 'pay', ext: 'aar')

引入完成后启动工程,本以为一切都很顺利,结果报了一个错误:
uses-sdk:minSdkVersion 15 cannot be smaller than version 19 declared in library [:pay:] D:\Project\android-payadd\PolymerSdk\app\build\intermediates\exploded-aar\pay\AndroidManifest.xml
Suggestion: use tools:overrideLibrary=”com.masget.pay” to force usage

用7z打开aar格式一看,原来aar不过是打包好的一个完整工程。这个错误意思是说pay.aar中的AndroidManifest最小SDK版本是19,而我的工程中使用的最小SDK版本是15。那么必须指定一个版本,以这个版本为准。所以我在AndroidManifest.xml中加上:

$lt;uses-sdk tools:overrideLibrary="com.masget.pay" /$gt;

如果tools报错,记得在AndroidManifest.xml声明命名空间:

xmlns:tools="http://schemas.android.com/tools"

重新编译,发现又报错了,但是错误内容不一样。错误如下:
error: No resource identifier found for attribute ‘layout_columnWeight’ in package ‘cn.payadd.polymer’

这是没引入gridlayout依懒包的原因,在gradle加上:

compile 'com.android.support:gridlayout-v7:25.1.0'

再次编译,通过。但是在程序运行时又报错了。


看到
Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/multidex/MultiDex;
第一反应是某些文件没打包进去。以前集成银联SDK时,很多商户都在打包时把so文件漏了。

查了一下,也是因为缺少依赖包。在gradle加上:

compile 'com.android.support:multidex:1.0.0'

再次重新编译。通过!

最后附上gradle部分配置图: