文档章节

Android类库打包方法探究

ljrapple
 ljrapple
发布于 2015/03/02 14:34
字数 990
阅读 131
收藏 7
开发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

本文转载自:

共有 人打赏支持
ljrapple
粉丝 6
博文 66
码字总数 17974
作品 0
广州
Android工程师
私信 提问
加载中

评论(2)

阿耀
阿耀
5555
阿耀
阿耀
154
关于安卓工程导出带res资源文件的jar的总结

安卓项目导出成jar,自带的res资源不能正常使用,网上各说纷纭,总结一下归纳为五类,但是没有一种能够提供直接将res文件夹打包进jar,并能够使用R文件引用的方式。 打包时包含res文件夹,并...

tnjin
2014/04/17
0
3
[移动] 谈谈自定义Android界面切换效果库的使用

界面或者板块的切换是Android应用中非常常见的一个功能,本文将给大家介绍一个由本人开发的好用的Android界面切换效果库,同时也谈谈自己对“Android模块化编程”的一些想法。希望大家能通过...

长平狐
2013/07/01
1K
0
最简单的基于FFmpeg的移动端例子:Android 视频解码器-单个库版

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/leixiaohua1020/article/details/47011021 ===================================================== 最简单的...

雷霄骅
2015/07/25
0
0
Android代码混淆,资源混淆,SO混淆

> 代码混淆 通过ProGuard或者DexGuard来保护我们的代码,从而实现相对的代码安全。靠Android资源管理框架来完成的,而Android资源管理框架实际是由AssetManager和Resources两个类来实现的。其...

shareus
05/04
0
0
Android Studio之NDK环境搭建,so文件打包以及使用

本篇入门教程开发环境为mac + Android Studio + gradle 2.14.1,主要包含以下3块内容: NDK环境搭建 编写第一个JNI项目 打包出动态so文件,在其他项目中使用 一、NDK环境搭建 从Android Stu...

ljianbing
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

spring源码阅读笔记(一)

ClassPathXmlApplicationContext 与 FileSystemXmlApplicationContext 用了这么久的框架,是时候搞一下源码了,一般最初接触spring 从以下步骤开始 创建一个bean类 并创建 ooxx.xml之类的spr...

NotFound403
5分钟前
0
0
MySQL主从配置

12月14日任务 17.1 MySQL主从介绍 17.2 准备工作 17.3 配置主 17.4 配置从 17.5 测试主从同步 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单将就是A/B两个服务器做主从后,在A上写...

robertt15
7分钟前
0
0
我的Linux系统九阴真经

在今天,互联网的迅猛发展,科技技术也日新月异,各种编程技术也如雨后春笋一样,冒出尖来了。各种创业公司也百花齐放百家争鸣,特别是针对服务行业,新型互联网服务行业,共享经济等概念的公...

问题终结者
20分钟前
6
0
Java 使用 gson 对 json 根据 key 键进行排序

引入Google的gson jar <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.0</version>......

yh32
21分钟前
1
0
Vue.use源码解析

什么是Vue插件 关于什么是Vue插件大家可以去看官网的解释 ,总得来说就是提供一个全局注册/调用的能力。 怎么用 我们以Weex为例。 首先有一个toast.js const Toast = {}Toast.install = (Vu...

peakedness丶
28分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部