Android 如何生成第三方包
近期要离职了,在旧公司工作了差不多两年,个人在Android方面有点积累,想在离开前给公司留下点什么,于是寻思着把我积累的开发框架打成第三方包,方便其他同事以后开发,同时也是对自己工作经验的一次总结吧。闲话少说,下面进入正题:
总结了一下,我的框架包含了一下内容:
1.基础类,包括获取应用的基本信息,以及设备等信息,以及常用的一些工具类等。
2.数据处理类,包括网络请求、缓存机制、数据解析类等
3.程序管理类,包括Activity管理,线程控制等
4.控件类,包括自己写的一些控件
于是我建立了一个is Library共工程,把这些类都放进去,这样就成了一个第三方类库,很简单。有些源码我不想给别人看,于是寻思着如何把源码打包成jar文件,这时候问题就出现了。但我单纯地把src的代码导出成jar,并加入到新工程的libs目录,很不幸运行的时候报错了,java.lang.NoClassDefFoundError:***,原因是资源文件找不到。在网上查了一下,也参考了android官方文档,总结了一下以下两种方法可以实现:
方法一:
1.android类库(library project)能支持打包成jar,并且jar里的字节码类文件能够成功被打进目标应用项目的apk包里。如果类库中不包含activity等需要界面资源的内容,或者在类库中手工读取资源,而不使用ADT的从res下读取资源的机制,这个类库jar的使用完全没问题,不需特别关注。
2.res下的资源文件打进jar包没有意义,目标应用项目在打apk包时不会从jar中读取res打进apk。猜测不支持从jar中读res的可能的原因是担心资源名与目标应用项目中重复(纯属个人猜测,作不得准)。
方法二:
1.开发类库项目(library project,即Project -> Properties -> Android -> Check "Is Library"),正常编译,生成jar包(在bin下,jar中只包含src下的类生成的字节码,不包含gen下自动生成的类,也不包含res)。假设这个类库叫做mylib,生成的jar名称为mylib.jar。
2.新建一个类库项目(library project,同样设置 Project -> Properties -> Android -> Check "Is Library" ),假设这个类库叫做mylibdeploy,设置其命名空间与mylib相同( AndroidMainfest.xml中package内容相同)。在mylibdeploy下新建一个libs目录,把mylib.jar导入到libs目录下。再将mylib项目下的assets、res目录复制到mylibdeploy下。
3.开发目标应用(常规Android project,不勾选“Is Library”),在这个目标应用项目中设置对mylibdeploy的引用。引用方法如下: 打开android应用设置 Project -> Properties -> Android , 点“Add...”按钮选择mylibdeploy。经如此设置后,在目标应用项目中就可以引用mylib中的类了。最后编译、导出成apk,这个apk里会包含mylibdeploy下的res,也会包含相应的gen下自动生成的类编译后的文件。
对于需要向外发布的类库,将mylibdeploy直接发出。可以将其压缩打包成zip或者其它的什么格式,只要使用方能解开就行。使用方(目标应用开发方)按照第3步的方式引用mylibdeploy,就能正常使用mylib.jar,正常打包apk。
参考:http://www.cnblogs.com/wangchuanju/archive/2012/04/05/android_lib_jar.html