开发Android应用的时候,对于可用于多个应用的公用的部分,或是打算发布给第三方进行应用集成的部分,要把这部分打包成类库怎么做呢?
  Android应用使用ADT打包成apk,apk中包含了运行程序所需要的一切,包括:class、asset、res、AndroidManifest.xml等。而对于类库项目(library project),ADT生成的jar包里只包含编译生成的class文件,不包含res资源文件,res只能在应用项目打包apk的时候打进apk包。

  那考虑自行导出jar如何? 针对类库项目(library project)执行导出(export),导出时把res打上勾,这样导出的jar包里确实包含了res下的资源文件。很不幸,经反复试验得知,即使在jar包里包含了res,目标应用项目在编译时仍然不会对jar包里的res进行处理,打成apk包时是不会包含jar里的res的。这样一来,通过在jar包里包含res以供目标应用项目使用的路走不通了。

先做个总结:
  1. android类库(library project)能支持打包成jar,并且jar里的字节码类文件能够成功被打进目标应用项目的apk包里。如果类库中不包含activity等需要界面资源的内容,或者在类库中手工读取资源,而不使用ADT的从res下读取资源的机制,这个类库jar的使用完全没问题,不需特别关注。
  2. res下的资源文件打进jar包没有意义,目标应用项目在打apk包时不会从jar中读取res打进apk。猜测不支持从jar中读res的可能的原因是担心资源名与目标应用项目中重复(纯属个人猜测)。

打不成jar包,直接把源码给出去又不合适,怎么办?

  下面是一个办法:
  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相同。在mylibdeploy下新建一个libs目录,把mylib.jar导入到libs目录下。再将mylib项目下的assets、res目录复制到mylibdeploy下。
  3. 开发目标应用(常规Android project,不勾选“Is Library”),在这个目标应用项目中设置对mylibdeploy的引用。引用方法如下: 打开android应用设置 Project -> Properties -> Android , 点“Add...”按钮选择mylibdeploy。经如此设置后,在目标应用项目中就可以引用mylib中的类了。

  4.    最后编译、导出成apk,这个apk里会包含mylibdeploy下的res,也会包含相应的gen下自动生成的类编译后的文件。

  对于需要向外发布的类库,将mylibdeploy直接发出。可以将其压缩打包成zip或者其它的什么格式,只要使用方能解开就行。使用方(目标应用开发方)按照第3步的方式引用mylibdeploy,就能正常使用mylib.jar,正常打包apk。

  当然,在打包jar(上例中的mylib.jar)时,可以根据需要对其进行部分混淆生成不易被反编译的jar包。

  这种发布包的办法并不完美,期待ADT的改进,未来也许可以直接发布JAR。

参考:
[1]. Managing Projects from Eclipse with ADT
  http://developer.android.com/tools/projects/projects-eclipse.html

[2]. Android Developer Tools
  http://developer.android.com/tools/help/adt.html

[3]. How to export the project as a JAR file
  http://groups.google.com/group/android-developers/browse_thread/thread/bc4b509765bd1956

[4]. How to create Android library in Eclipse?
  http://groups.google.com/group/android-developers/browse_thread/thread/ce546a393cbb8bcf

[5]. Android类库打包方法探究

  http://www.cnblogs.com/wangchuanju/articles/android_lib_jar.html

Android 类库打包、发布方法的更多相关文章

  1. Qt程序打包发布方法(使用官方提供的windeployqt工具)

    Qt程序打包发布方法(使用官方提供的windeployqt工具) 转自:http://tieba.baidu.com/p/3730103947?qq-pf-to=pcqq.group Qt 官方开发环 ...

  2. Android类库打包方法探究

    原文地址: http://www.cnblogs.com/wangchuanju/archive/2012/04/05/android_lib_jar.html 开发Android应用的时候,对于可用 ...

  3. 【Android Studio安装部署系列】十、Android studio打包发布apk安装包

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 使用Android studio发布apk安装包的操作步骤. 开始打包发布apk Build > Generate Signe ...

  4. Win7平台下React-Native开发之Android项目打包发布流程

    一.bundle文件 React-Native开发步骤中,有一个步骤是使用命令 react-native start 去启动一个基于Node.js的服务,名字为packager.这个packager的 ...

  5. Qt 程序打包发布总结

    1.  概述 当我们用QT写好了一个软件,要把你的程序分享出去的时候,不可能把编译的目录拷贝给别人去运行.编译好的程序应该是一个主程序,加一些资源文件,再加一些动态链接库,高大上一些的还可以做一个安装 ...

  6. Ant自动编译打包&发布 android项目

    Eclipse用起来虽然方便,但是编译打包android项目还是比较慢,尤其将应用打包发布到各个渠道时,用Eclipse手动打包各种渠道包就有点不切实际了,这时候我们用到Ant帮我们自动编译打包了. ...

  7. 创建自己的library类库包并使用webpack4.x打包发布到npm

    创建自己的library类库包并使用webpack4.x打包发布到npm 我们在开发过程中,可能经常要使用第三方类库,比如jquery.lodash等.我们通过npm,下载安装完之后,就可以使用了,简 ...

  8. Android Library项目发布到JCenter最简单的配置方法

    前沿 网上的步骤看起来实在太麻烦,gituhb上偶然间看到的一个项目,经过实际验证确实可行.github连接:https://github.com/xiaopansky/android-library ...

  9. Andorid进阶7—— Ant自动编译打包&发布 android项目

    http://www.cnblogs.com/tt_mc/p/3891546.html Eclipse用起来虽然方便,但是编译打包android项目还是比较慢,尤其将应用打包发布到各个渠道时,用Ecl ...

随机推荐

  1. System.Data.SqlClient.SqlException.Number的所有错误值列表

    在系统数据库(master或msdb或model)的架构(sys)的视图(messages)中: SELECT [message_id]      ,[language_id]      ,[seve ...

  2. JavaScript对象 属性

    1.ES中的对象是完全动态的,这意味着,在程序执行的时候我们可以任意的添加,修改或删除对象的属性. var stu = { ID: 1 }; //添加新属性 stu.Name = 'ck'; cons ...

  3. (C#) Parse xml 时, 返回的node值总是null。

    网上查了一下,原因在于要parse的Xml文件本身包含了一些namespace,这些需要被添加进去. http://msdn.microsoft.com/zh-cn/library/system.xm ...

  4. POJ 2342 &&HDU 1520 Anniversary party 树形DP 水题

    一个公司的职员是分级制度的,所有员工刚好是一个树形结构,现在公司要举办一个聚会,邀请部分职员来参加. 要求: 1.为了聚会有趣,若邀请了一个职员,则该职员的直接上级(即父节点)和直接下级(即儿子节点) ...

  5. gridView--GridView关于间距的属性值介绍

    android:columnWidth  设置列的宽度.关联的方法为:setColumnWidth(int) android:gravity  设置此组件中的内容在组件中的位置.可选的值有:top.b ...

  6. Android网络通信库Volley简介

    1. 什么是Volley 在这之前,我们在程序中需要和网络通信的时候,大体使用的东西莫过于AsyncTaskLoader,HttpURLConnection,AsyncTask,HTTPClient( ...

  7. docker一些命令

    1.创建image(先创建Dockerfile) docker build -t xxx/xxx . 2.删除image docker rmi xxxxx(image id) docker rmi r ...

  8. python爬取并计算成绩

    模拟登录后抓取成绩,计算绩点. # -*- coding: utf-8 -*- import urllib import urllib2 import cookielib import re impo ...

  9. css 选择器优先级的计算过程

    以下转自互联网 下面看看官方对选择器的定义:一个选择器的优先级由四个数字a,b,c,d确定.当比较两个选择器时,先比较a,a值大的优先级高,如果a相等则比较b,b值大的优先级高,以此类推.因此,无论b ...

  10. [ActionScript 3.0] AS3 时间格式化方法

    /** * 格式化时间,格式 00:00:00 * @param total 总时间(毫秒) */ function getFormatTime(total:uint):String { if (to ...