aar 在Eclipse项目中的使用和sdk开发注意事项

来源:互联网 发布:部落冲突毒药升级数据 编辑:程序博客网 时间:2024/05/22 00:40

1.问题描述:aar是AndroidStudio特殊格式的压缩包,as的项目可以直接放到libs目录下,as可以自动识别其中的代码和资源,但是如果直接放到Eclipse项目中的libs目录下的话,你会发现Eclipse不能识别aar格式的压缩包,里面的资源和代码根本引用不到。这样问题就来了,我们用Eclipse在接入第三方sdk的时候,而他们的sdk正是以aar形式给出的,我们怎么使用呢?

问题分析:我们知道,aar形式的jar包我们解压之后可以看出它的目录结构如下:

逐级查看目录结构可以发现:aapt    aidl  assets目录下大都情况是空目录,那么有用的就是classes.jar  AndroidManifest.xml  res目录,我们在Eclipse中直接将用到的classes.jar拷贝到libs目录下,res拷贝到res相应目录下,AndroidManifest.xml中相关activity recevicer配置拷贝到自身项目中的AndroidManifest.xml中不就行了吗?


于是手动拷贝,一切ok,没有错误和资源找不到的情况,一运行结果又出错了:如下:


可以发现,拷贝的时候,我们资源都没有冲突或者资源找不到,但是运行的时候发现找不到R文件,仔细观察 报错的 R 文件路径 并不是我们运行项目的R文件,而是第三方sdk中R 文件的路径,难道第三方sdk在写代码的过程中找 控件 相关的代码 都是用的 是R.layout.xxx  、R.id.xxxx  吗?用java Decompiler工具查看sdk jar包的代码,果然如此:如图:(没错从包名可以看出是  苏宁  的sdk


从这里我们可以知道2点:

1.在Androidstudio中 aar是以项目形式编译的,不然不会生成R文件

2.在sdk的编写过程中,像以上这种findViewById(R.xxxx.xxxx)查找资源文件的做法是绝对错误的。(这种做法  sdk只能以library 的形式集成到app中(项目中)这样就会在gen目录下生成2个R文件,但是假如说集成第三方sdk的项目本身就是一个sdk的话,这样就不适用了,而我遇到的就是这样的情况)


问题解决:

1.Eclipse 项目的App集成此种sdk

步骤 a.解压  xxxx.aar

         b.删除无用资源,比如空的asset  aidl 目录等

         c.在解压得到的目录里创建project.properties文件

         d.创建libs目录,并将classes.jar拷贝到该目录下

         到此,这样的目录结构就可以被当成一个Android项目导入Eclipse中了,然后当成library被其他app引用了。


这样的做法,其他blog中也有:Android Eclipse使用.aar文件攻略         aar 转 jar - 导入eclipse使用 (友盟转阿里百川趟出来的坑)


但是:这种做法并不能适配 此种sdk(sdk B)将要集成到另一个sdk(sdk A)当中,而sdk A又是以jar包和资源分开来对外提供的,这样另一个sdk A在集成过程中并不能将sdk B 当一个library来引用,因为sdk A 将来也要提供给 对外使用,并且不是以依赖library来对外提供,而且也不知道将来集成sdk A的项目是一个sdk 或者 是一个 app,更不知道它的集成者的包名。所以

2.Eclipse 项目的sdk 集成此种sdk,(不好解决)


总结:通过以上分析:我们在做sdk的过程中涉及到查找资源的代码,尽量不要使用开发app时用的findViewbyId(R.xxxxx.xxxxx)(这种写法只有以library形式集成,生成2个R文件,不好);因为我们开发sdk是要提供给其他app或者sdk使用的,R文件是在aapt在项目构建的时候自动生成的,它是跟构建它的项目的包名相关联的,而我们sdk并不知道将来集成我们sdk的项目的包名,这样做并不通用,也不好。

最好查找控件相关的代码都用以下的系统api代替,context.getResources().getIdentifier(fieldName, typeString, packageName);这样的话将来无论哪个app集成了sdk,都会重新编译资源,只有一个R文件,不存在有2个或多个R文件,要依赖项目才可以集成。

         

原创粉丝点击