从Eclipse转Android Studio后,很多操作都不是很清楚,就包括jar包的使用,直到昨天出现了问题,才去找原因并解决。
问题是这样的:自定义的控件打成jar包了,在其他工程中调用,在运行时出现错误,提示说在xml中的自定义控件无法填充。在xml中弹出错误,说NoClassDefFoundError,进入源码发现指向的是styleable,也就是自定义属性。毫无疑问,这就是R文件的问题了。在libs中打开jar包,都是些class文件,根本没有R文件和attrs文件。肯定要加入才有效。
那怎么把这些资源文件加入jar包中???
最后,在百度经验里找一篇aar导入的文章,才明白jar包和aar包的区别。当晚就把jar包和aar包的导出与导入进行了总结,今天发表以帮助有需要的朋友。这些都是简单地导出与导入,不涉及代码混淆等比较高级的操作(日后研究)。
在AS中有两种包:jar包和aar包
jar包:只包含了class文件与清单文件 ,不包含资源文件,如图片等所有res中的文件。
aar包:包含jar包和资源文件,如图片等所有res中的文件。
一、jar包的导出与导入
导出
- 新建库,File——New——New Module——Android Library
- 编译或生成工程,Build——Make Module
- 获取jar包,在build\intermediates\bundles\release目录下的classes.jar
导入
- 把工程切换到Project视图下,在app目录下创建libs目录
- 把jar拷贝到libs目录
- 右键——Add to Library,Create Library默认选app。完成后jar包将变成如下这样
二、aar包的导出与导入
导出
编译库后,jar包和aar会同时生成,arr包的路径:build\outputs\aar\zjun_lib-release.aar。zjun_lib为我的库名
导入
两种方法
【1】通过gradle(个人推荐)
- 把aar复制到工程应用app下的libs目录中
-
在app的build.gradle中添加一个本地仓库,并把libs作为仓库地址:
// aar包添加1/2
repositories {
flatDir{
dirs 'libs'
}
} -
修改dependencies。添加一行:compile(name:’zjun_lib-release’, ext:’aar’)。name就是zjun_lib-release.aar的文件名,ext就是zjun_lib-release.aar扩展名
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.2.1'
// aar包添加2/2
compile(name:'zjun_lib-release', ext:'aar')
} 重新编译,编译成功后,在build\intermediates\exploded-aar目录下能看到zjun_lib-release.aar包的内容了。jars下是class文件,res下是资源文件(图是后来截取的,包名已经修改成zjun_lib-1.1.aar了)
【2】界面导入
- File——New——New Module——Import .JAR/.AAR Package(jar包也可以这样导入)
- 选择aar包所在的路径,一般还是放置在libs目录下。Finish完成即可
- Sync Now同步一下工程与Gradle,或重新编译工程。zjun_lib-1.1将变成一个带茶杯的文件夹,且会自动添加一个iml文件
- 添加到app的依赖中去。Project Structure——app——Dependencies中添加Module dependency,把module添加进去
参考:
http://jingyan.baidu.com/article/2a13832890d08f074a134ff0.html