当前位置: 首页 > 编程日记 > 正文

Android类库打包方法探究

为什么80%的码农都做不了架构师?>>>   hot3.png

开发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中的类了。最后编译、导出成apk,这个apk里会包含mylibdeploy下的res,也会包含相应的gen下自动生成的类编译后的文件。

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

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

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

  参考:

Managing Projects from Eclipse with ADT

http://developer.android.com/guide/developing/projects/projects-eclipse.html

Android Developer Tools

http://developer.android.com/guide/developing/tools/adt.html

How to export the project as a JAR file

http://groups.google.com/group/android-developers/browse_thread/thread/bc4b509765bd1956

How to create Android library in Eclipse?

http://groups.google.com/group/android-developers/browse_thread/thread/ce546a393cbb8bcf

转载于:https://my.oschina.net/u/859939/blog/381272

相关文章:

大叔也说并行和串行`性能提升N倍(N由操作系统位数和cpu核数决定)

并行是.net4.5主打的技术,同时被封装到了System.Threading.Tasks命名空间下,对外提供了静态类Parallel,我们可以直接使用它的静态方法,它可以并行一个委托数组,或者一个IEnumerable的迭代,而今天主要通过一…

这7个开源技术,支撑起整个互联网时代

转载自 钛媒体 - 这7个开源技术,支撑起整个互联网时代 开源软件现在成为整个互联网时代的支撑技术,你可能已经无法离开由开源软件构建起来的网络世界了。下面我们就来看看一些最重要的开源技术。 为互联网而生的操作系统linux Linux是一款免费的操作系统…

WebDriver 识别反爬虫的原理和破解方法~

作者|志斌来源|python笔记有时候我们在爬取动态网页的时候,会借助渲染工具来进行爬取,这个“借助”实际上就是通过使用相应的浏览器驱动(即WebDriver)向浏览器发出命令。但是有时候使用浏览器驱动来爬取网页时,会遇到这种情况这时&#xff0c…

Linux下文件如果没有权限不能被Apache访问

通过 apache的网站 php和图片都可以显示 就是 Htm页面不行 报错 Forbidden You dont have permission to access /me/1.html on this server. 其实是权限设置问题 可以 到文件所在目录 使用命令查看权限 #ls -al 再使用chmod命令给予足够权限即可 #chmod 0644 文件名…

html标签的显示模式(块级标签,行内标签,行内块标签)(转)

html标签的显示模式(块级标签,行内标签,行内块标签) 今天讲课的时候,讲到了html中的标签的显示模式,大致分为块级标签和行内标签。那么初学者在刚使用标签的时候会发现有些属性在一些标签上不起作用&#x…

RT-thread内核之进程间通信

一、进程间通信机制 rt-thread操作系统的IPC(Inter-Process Communication,进程间同步与通信)包含有中断锁、调度器锁、信号量、互斥锁、事件、邮箱、消息队列。其中前5个主要表现为线程间同步,邮箱与消息队列表现为线程间通信。本…

Linux内核学习四库全书

关于内核学习我建议不要上来就读内核而是先了解内核的构成和特性,然后通过思考发现疑问这时再去读内核源码。即先了解概貌在读局部细节。而且内核分成好多部分,不要只是按照顺序去读,应该针对某一部分比如内存管理或进程管理横向读几本书&…

46W 奖金池等你来战!微众银行第三届金融科技高校技术大赛火热报名中!

青春是什么?张爱玲曾说过,青春是个奇形怪状的玩意儿,短短的身子偏偏拖了一个长长的尾巴,像翅膀一样的招摇着,久久不肯离去。对于你我而言,青春是什么?青春也许是大学里点点滴滴的记忆&#xff1…

spring cloud快速搭建

为什么80%的码农都做不了架构师&#xff1f;>>> 一&#xff1a;注册中心 服务提供者&#xff08;简单&#xff09; 注册中心本身就可以是服务提供者&#xff0c;如果有需求可以分开。 1&#xff1a;pom.xml <?xml version"1.0" encoding"UTF-8…

ubuntu操作系统下载

原文网址&#xff1a;http://www.cyberciti.biz/linux-news/download-ubuntu-14-4-cd-dvd-iso-images/ Download of the day: Ubuntu Linux 14.04 LTS CD / DVD ISO by NIXCRAFT on APRIL 17, 2014 5 COMMENTS LAST UPDATED APRIL 17, 2014 in LINUX NEWS, OPEN SOURCE Ubuntu…

Linux内核模块编程入门

针对2.6内核的Linux系统&#xff0c;需要你的机器上已经安装了kernel-devel这个包&#xff0c;也就是编译模块所必须的东西&#xff1a;内核的头文件和一些Makefile。 一&#xff0c;Hello World程序&#xff1a; [code:1:fbc83fc10a]/*file: hello.c*/ #ifndef __KERNEL__ #…

2021中国国际消费电子博览会和青岛国际软件融合创新博览会盛大开幕

9月24日&#xff0c;备受瞩目的2021中国国际消费电子博览会(简称“电博会”)和青岛国际软件融合创新博览会(简称“软博会”)在青岛国际会展中心盛大开幕。国家工信部原副部长杨学山&#xff0c;国家工信部信息技术发展司副司长江明涛&#xff0c;中国机电产品进出口商会秘书长郭…

oracle 11g wm_concat 、 listagg 函数的使用(合并数据)

方法一 wn_concat() 函数 1、把以下图中Name一样的数据合并为一条&#xff0c;而且NO的值要这样显示如 C.1,C.2 2、实现这种效果的操作如下&#xff0c;先把Name的值进行分组&#xff08;group by&#xff09;&#xff0c;再把NO的值用 wm_concat()函数合并起来&#xff08;注意…

使用Cacti监控你的网络Cacti的安装

声明&#xff1a;本系列文档出自石头记&#xff0c;如若转载请注明出处&#xff0c;本人保留文档的所有权&#xff0c;并欢迎转载。本系列文档的其他部分链接如下&#xff1a;一、概述及Cacti的工作流程二、Cacti的安装三、Cacti的使用四、Cacti脚本及模板五、Cacti插件六、Cac…

AI 被当做炒作工具?

编译 | 禾木木 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 上班路上由于高峰期&#xff0c;眼看就要迟到了&#xff0c;这个时候会想“如果汽车能自动完成这种高度重复的动作&#xff0c;我就可以在路上参加我的会议了”。但是你必须每几秒踩一次油门&#xff0…

毕业五年后差距

毕业五年后差距正如"打工皇帝"唐骏说&#xff1a;"我觉得有两种人不要跟别人争利益和价值回报。第一种人就是刚刚进入企业的人&#xff0c;头5年千万不要说你能不能多给我一点儿工资&#xff0c;最重要的是能在企业里学到什么&#xff0c;对发展是不是有利……&…

我的新技术博客

我是一个技术小白&#xff0c;我开启一片新的空间转载于:https://blog.51cto.com/13526168/2048988

Varnish使用小结

文章原始出处和作者信息及 本声明http://iyubo.blogbus.com/logs/35085709.html此日志会随时更新&#xff0c;当然&#xff0c;是随着我的应用积累:) 实现静态文件压缩 Varnish itself does not compress or decompress objects, although that has been on our wish list fo…

EF 通用数据层类

EF 通用数据层父类方法小结 转载&#xff1a;http://www.cnblogs.com/yq-Hua/p/4165344.html MSSql 数据库 数据层 父类 增删改查&#xff1a; using System; using System.Collections.Generic; using System.Data; using System.Data.Entity; using System.Data.Entity.Infra…

最新的B站弹幕和评论爬虫,你们要的冰冰来啦!

作者 | 周萝卜 来源 | 萝卜大杂烩 最近想爬下B站的弹幕和评论&#xff0c;发现网上找到的教程基本都失效了&#xff0c;毕竟爬虫和反爬是属于魔高一尺、道高一丈的双方&#xff0c;程序员小哥哥们在网络的两端斗智斗勇&#xff0c;也是精彩纷呈。 当然了&#xff0c;对于爬虫…

K:java中的序列化与反序列化

Java序列化与反序列化是什么&#xff1f;为什么需要序列化与反序列化&#xff1f;如何实现Java序列化与反序列化&#xff1f;以下内容将围绕这些问题进行展开讨论。 Java序列化与反序列化 简单来说Java序列化是指把Java对象转换为字节序列的过程&#xff1b;而Java反序列化是指…

千万级并发HAproxy均衡负载系统介绍

Haproxy介绍及其定位 HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理&#xff0c;支持虚拟主机&#xff0c;它是免费、快速并且可靠的一种解决方案。根据官方数据&#xff0c;其最高极限支持10G的并发。 HAProxy特别适用于那些负载特大的web站点&#xff0c; 这些…

中国的“Databricks”们:打造AI基础架构,我们是认真的

AI落地最大的驱动因素是基础架构的升级。 近年来&#xff0c;大数据分析、AI等领域一直备受关注&#xff0c;常有引人关注的融资事件发生。美国数据科学公司Databricks刚刚在今年8月底完成了16亿美元H轮融资&#xff0c;其最新估值高达380亿美元&#xff0c;相比7个月前G轮融资…

更改git bash默认的路径

在打开git bash时&#xff0c;每次都是在C:\Uer路径下&#xff0c;每次都需要先用cd命令转换到自己需要工作的路径&#xff08;cd /f/dss&#xff09;。修改打开git bash 时的默认的路径就可以不用每次都使用cd命令转换到需要管理的目录。 修改默认路径方法&#xff1a;右击Gi…

Gradle入门系列(4):创建二进制发布版本

本文由 伯乐在线 - JustinWu 翻译。未经许可&#xff0c;禁止转载&#xff01; 英文出处&#xff1a;petrikainulainen。欢迎加入翻译组。 在创建了一个实用的应用程序之后&#xff0c;我们可能想将其与他人分享。其中一种方式就是创建一个可以从网站上下载的二进制文件。 这篇…

什么是A记录、MX记录、CNAME记录

什么是A记录&#xff1f; A (Address) 记录是用来指定主机名&#xff08;或域名&#xff09;对应的IP地址记录。用户可以将该域名下的网站服务器指向到自己的web server上。同时也可以设置域名的子域名。通俗来说A记录就是服务器的IP,域名绑定A记录就是告诉DNS,当你输入域名的…

Graph + AI 2021中国峰会:TigerGraph与行业共探图与AI应用前景

由企业级可扩展图分析平台TigerGraph主办的第二届“Graph AI中国峰会”将于10月20日线上举办&#xff0c;本届主题为“图创未来无界精彩”。作为全球唯一一个专注于图技术的行业峰会&#xff0c;“Graph AI峰会”自开办以来&#xff0c;受到数据行业专家及应用领域伙伴的持续…

rrdtool数据备份与迁移

rrdtool 显示错误ERROR: This RRD was created on another architecture rrdtool数据备份与迁移1.在原服务器生成xml文件 …

Format specifies type 'id' but the argument has type 'NSError *__autoreleasing *

我想打印error&#xff0c;但是出现了标题中的错误&#xff0c;代码如下&#xff1a; -(id)yobee_responseObjectForResponse:(NSURLResponse *)response data:(NSData *)data error:(NSError *__autoreleasing *)error { if (error) { NSLog("url ----> %\n error %&…

域名解析和cdn 原理

用户访问未使用CDN缓存网站的过程为: 1)、用户向浏览器提供要访问的域名&#xff1b; 2)、浏览器调用域名解析函数库对域名进行解析&#xff0c;以得到此域名对应的IP地址&#xff1b; 3)、浏览器使用所得到的IP地址&#xff0c;域名的服务主机发出数据访问请求&#xff1b; 4)…