`

Android 公共库的建立方法

 
阅读更多

本文主要介绍在android工程中如何将共用代码建成公共包方便其他工程引用、引用后的工程结构分析、library引入方式的优缺点

 

我的公共库已开源,可见TrineaAndroidCommon@Github,包含图片缓存下拉刷新静默安装及其他Android开发常用工具类,欢迎star和fork^_^。示例APK地址:TrineaAndroidDemo

 

1、java中公共库的创建和引入

熟悉java的朋友都知道在java中可以将公用代码提取出来新建工程,打包成jar包,然后通过外部依赖或是maven依赖加入其他工程使用。

 

2、android中公共库的创建和引入

使用android提供的is library功能创建公共库,android adt提供了公共库的创建方法,下面逐一介绍

a. 新建android工程

这一步同一般的android工程创建方法,如下

 

b. 设置工程属性为library

右击工程->properties->Android,将工程设置为是library,如下

 

c. android公共库的引入方法

右击需要引入library的工程->properties->Android,在library中添加之前新建的common,如下

这样我们就成功引入library了,对于引入后的工程结构分析可以参见本文下面第三部分介绍。引入后我们可以正常的引入java类,对于资源可以像在同一个工程中引入即可,因为library的资源被并入了工程中。

 

PS:如果这个时候工程编译出错,则可能是因为工程和公用library中资源的冲突问题,在后面的分析中我们可以知道引入library后,对于工程的资源会进行合并。比如library中现在含有icon.png的drawable资源,若调用者资源中也含有icon.png则会编译报错,这个时候我们可以将library中的icon资源删除,对于library来说尽量不要放这些drawable资源,我们甚至可以如下图红圈所示删除所有drawable资源文件夹,防止冲突发生。

当然删除icon后同时需要修改相应的引用资源的文件,如这里AndroidManifest.xml中的android:icon

 

3、引用后的工程结构分析

引入library的工程目录结构如下

从上图三个黄色标记的地方我们可以发现library的资源被并入了工程中,同时生成了两个一样的资源文件R.java。这样做的话,对于工程来说可以方便的调用library中的资源,跟在同一个工程中调用资源无甚区别。

a、library的资源被并入调用者工程中,并且相同资源值被覆盖

library中存在strings.xml内容如下

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, AndroidCommon!</string>
    <string name="app_name">AndroidCommon</string>
</resources>

调用者同样存在strings.xml,内容如下

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">TESTPROJECT</string>
    <string name="string2">testString</string>
</resources>

最终R.java中的string我们可以看到同时存在hello、app_name、string2三个变量,即资源被合并。并且app_name的值为TESTPROJECT,即资源值被覆盖。

b. 资源一致性

修改上面红色标记的AndroidCommon_src中的AndroidCommon的内容,会发现library中的内容也会被相应修改

c. 编译一致性

修改library的资源进行编译会发现调用者工程也会同时被编译。 

 

 

4. library引入方式的优缺点

通过library方式成功引入了公用库

a. 提高了代码的复用率减少了开发量

b. 可以使得项目模块化以及更好的扩展

 

同时对于这种工程方式的引入还是觉得有一些不妥的地方

a. 通过源码引入,而不是通过类似jar包引入,从而对于library的修改导致所有引入该library都需要同时编译过于麻烦

 

 
 
  • 大小: 19.8 KB
  • 大小: 37.3 KB
  • 大小: 88.2 KB
  • 大小: 38.8 KB
  • 大小: 47 KB
  • 大小: 25 KB
  • 大小: 2.7 KB
分享到:
评论
13 楼 u010244357 2014-06-30  
Trinea 写道
u010244357 写道
尼壕,请问引入其他项目后,是否意味着是应用变为多进程

八竿子打不着的两件事情

嗯,我知道我出现的问题了.是之前的应用没删干净
12 楼 Trinea 2014-03-24  
u010244357 写道
尼壕,请问引入其他项目后,是否意味着是应用变为多进程

八竿子打不着的两件事情
11 楼 u010244357 2014-03-23  
尼壕,请问引入其他项目后,是否意味着是应用变为多进程
10 楼 Trinea 2013-06-20  
z390174504 写道
Trinea 写道
z390174504 写道
楼主,您好,想问下,我在编译的时候,没有错误,但是运行时候,发现库项目访问不到库项目中资源文件的id,
我在库项目中使用如下方法
    this.findViewById(R.id.relativelayout)

怎么解决呢?

你是跟android系统一起编译还是eclipse编译

和android一起编译,直接运行在手机上,没提出诚library时候没问题,提出来就访问不到id


这个问题我也碰到了,目前除了把library java及resource源码都拷贝到工程里面,并且修改library的R为工程的R外,没有好的方法。

系统是可以的,我也在靠framework层怎么做到的
9 楼 z390174504 2013-06-15  
Trinea 写道
z390174504 写道
楼主,您好,想问下,我在编译的时候,没有错误,但是运行时候,发现库项目访问不到库项目中资源文件的id,
我在库项目中使用如下方法
    this.findViewById(R.id.relativelayout)

怎么解决呢?

你是跟android系统一起编译还是eclipse编译

和android一起编译,直接运行在手机上,没提出诚library时候没问题,提出来就访问不到id

8 楼 Trinea 2013-06-14  
z390174504 写道
楼主,您好,想问下,我在编译的时候,没有错误,但是运行时候,发现库项目访问不到库项目中资源文件的id,
我在库项目中使用如下方法
    this.findViewById(R.id.relativelayout)

怎么解决呢?

你是跟android系统一起编译还是eclipse编译
7 楼 z390174504 2013-06-14  
楼主,您好,想问下,我在编译的时候,没有错误,但是运行时候,发现库项目访问不到库项目中资源文件的id,
我在库项目中使用如下方法
    this.findViewById(R.id.relativelayout)

怎么解决呢?
6 楼 Trinea 2013-05-07  
sgjsdf5944 写道
楼主你好,如果库工程处理完了需要向引用库项目某界面传递参数该怎么实现呀,因为业务通过startActivityForResult不能实现业务的需求,请问楼主有没有其他的方式实现,谢谢!

没明白你的意思?公共库传递参数给引入库项目?
5 楼 sgjsdf5944 2013-05-07  
楼主你好,如果库工程处理完了需要向引用库项目某界面传递参数该怎么实现呀,因为业务通过startActivityForResult不能实现业务的需求,请问楼主有没有其他的方式实现,谢谢!
4 楼 Trinea 2013-04-03  
scliu0718 写道
Trinea 写道
scliu0718 写道
LZ,你好, 请问一下,如果使用maven打包的话Is Library项目怎么打包到apk中呢?

什么意思,用libs文件夹的话adt是自动会打包到apk中的


恩, 但是用你文中的方式“Is Library”的方式却不会被打包到apk中呢?
(另外,用“Is Library”的方式引入另一个Android项目,貌似会自动引入该项目Bin目录下生成该项目的jar包)

这个问题我暂时也不知道怎么解决,你要是有好的方式麻烦搞我一下,嘿嘿
3 楼 scliu0718 2013-04-03  
Trinea 写道
scliu0718 写道
LZ,你好, 请问一下,如果使用maven打包的话Is Library项目怎么打包到apk中呢?

什么意思,用libs文件夹的话adt是自动会打包到apk中的


恩, 但是用你文中的方式“Is Library”的方式却不会被打包到apk中呢?
(另外,用“Is Library”的方式引入另一个Android项目,貌似会自动引入该项目Bin目录下生成该项目的jar包)
2 楼 Trinea 2013-04-02  
scliu0718 写道
LZ,你好, 请问一下,如果使用maven打包的话Is Library项目怎么打包到apk中呢?

什么意思,用libs文件夹的话adt是自动会打包到apk中的
1 楼 scliu0718 2013-04-02  
LZ,你好, 请问一下,如果使用maven打包的话Is Library项目怎么打包到apk中呢?

相关推荐

    android 多选库源码.rar

    这个目录可能包含的是库的公共模块,包括可能的接口、常量、工具类等。这些类可能被整个项目中的其他组件所引用,提供了一种标准化的方式来处理多选操作,比如提供选择模式的开关,或者统一的回调机制来通知应用...

    GB28181Android.zip

    GB28181是中国国家公共安全视频监控网络系统技术标准,主要应用于视频监控领域,规范了设备接入、媒体传输、控制信令等方面。在这个"GB28181Android.zip"压缩包中,我们看到的是针对Android平台的实现,包括了RTP/PS...

    sdk-android-1.1.66.zip

    例如,可以先通过HTTP/HTTPS发起请求获取服务器的公钥,然后使用SSH库建立安全连接,从而实现端到端的安全通信。 总结起来,"ssh.zip"是Android平台上一个用于集成SSH功能的开源库,它简化了在移动应用中实现安全...

    新版Android开发教程.rar

    � Android 的平台基本上是免费的,虽然有部份原生链接库会要求费用,但大部份是免权利金; Android 的 程序可以采用 JAVA 开发,但是因为它的虚拟机 (Virtual Machine) Dalvik ,是将 JAVA 的 bytecode 转成 自 己...

    Android应用程序开发教程PDF电子书完整版、Android开发学习教程

    很好的电子书教程!...Android Android Android Android 学习方法 ① 了解什么是 Androi ② 建立开发环境 ③ 阅读 SDK 文档 ④ 背景知识 � Java � 面向对象 � 设计模式 � J2ME、Brew 、Symbian

    Android组件的权限泄露检测方法研究.pdf

    研究者们首先需要建立一个API特征库,这个库将系统权限与调用方法映射起来,从而可以识别出潜在的权限泄露点。 静态分析技术包括以下几个步骤:首先是反编译生成源码,然后通过词法、语法分析,将源码转化为映射...

    Android文件上传实例

    在Android中,我们通常使用HTTP库,如HttpURLConnection或OkHttp,来发起HTTP请求,包括POST或PUT方法,以上传文件。 二、Android文件系统 在Android中,文件存储有多种方式,包括内部存储、外部存储(公共和私有...

    Android Auto Connect Wifi

    在本文中,我们将深入探讨Android系统如何实现自动连接Wi-Fi,以及相关的配置和优化方法。 首先,Android系统通过Wi-Fi Manager API来管理和控制Wi-Fi连接。Wi-Fi Manager是Android SDK中的一个接口,它提供了扫描...

    MQTT android端单聊群聊DEMO实现

    1. **选择MQTT库**:Android开发者可以选择如Paho MQTT Android Client这样的开源库,它是Eclipse Paho项目的一部分,提供了方便的API来处理MQTT连接和消息收发。 2. **设置连接参数**:创建一个`...

    Android Jauns WebRTC VideoRoom

    6. **WebSocket API**:在Android上,可以使用Java WebSocket API或者第三方库(如OkHttp-WebSocket)来实现WebSocket连接。创建连接、发送和接收消息都是通过这个API完成的。 7. **消息协商**:在视频会议中,...

    android之http工具: okhttp-master

    Retrofit是另一个由Square公司开发的Android网络库,用于简化接口调用。OkHttp是Retrofit默认的HTTP客户端,两者结合可以轻松实现RESTful API的调用。 5. **最佳实践** - **配置合适的超时时间**:避免因为网络...

    Unity与Android通信流程图

    1. **创建Java层接口**:在Android Studio中,编写一个Java类,定义一些公共方法,这些方法将作为Unity与Android通信的接口。例如,我们可以创建一个名为`UnityBridge`的类,并在其中声明`sendDataToUnity(String ...

    WebRTC的Android视频聊天客户端+信令服务器

    - **STUN (Session Traversal Utilities for NAT)**: 帮助穿越NAT(网络地址转换)来找到对等方的公共IP地址。 - **TURN (Traversal Using Relays around NAT)**: 当ICE和STUN无法建立直接连接时,通过服务器作为...

    webrtc android 服务器demo

    5. **连接建立与数据传输**: 使用PeerConnection的addStream方法添加本地流,createOffer/Answer方法创建SDP,并通过信令通道发送给对端。 三、Node.js信令服务器 1. **Express框架**: Node.js中常用的web应用框架...

    Tiny6410 Android开发指南

    - **校准方法**:使用Android系统内置的校准工具(如iTest程序中的校准功能)进行校准。 - **校准步骤**: 1. 进入iTest程序。 2. 执行触摸屏校准。 3. 断电并更换触摸屏(如果需要)。 4. 上电重启,系统会自动...

    快速混合开发框架,JSBridge提供核心Android、iOS功能。多平台API支撑,部分兼容浏览器.zip

    1. **核心库**:这可能是一个包含JSBridge实现的库,用于在JavaScript和原生代码之间建立通信通道。 2. **SDK**:为开发者提供的API集合,允许他们通过JavaScript调用原生功能。 3. **示例应用**:展示如何使用框架...

    Android应用源码---从服务器下载文件到模拟器.zip

    3. **URL连接与文件流**: 文件下载通常涉及创建`HttpURLConnection`或使用上述网络库建立连接,然后通过输入/输出流读取和写入数据。在Android中,`java.io`和`java.nio`包提供了处理流的工具。 4. **进度显示**: ...

    webRTC 4 android 2.2

    Google提供了适用于Android的WebRTC库,开发者可以通过AAR(Android Archive)文件引入。 - **权限管理**:为了访问摄像头和麦克风,需要在AndroidManifest.xml中声明相应的权限,如`&lt;uses-permission android:name=...

    android笔记.rar

    1.4 编译在G1 上运行的android 2.2(froyo)代码_旧方法... ..12 1.5 编译在G1 上运行的android 2.2(froyo)代码_新方法... ..15 1.6 编译在N1 上运行的android 2.3(GingerBread)代码... .18 1.7 系统结构... ..21 1.8 ...

    android 网络对战五子棋和聊天室

    为了实现这些功能,开发者可能使用了Android Studio作为集成开发环境,Java或Kotlin作为编程语言,还有可能用到了Android的Socket库,如Apache HttpClient或者OkHttp。同时,对于游戏逻辑,可能使用了数据结构(如二...

Global site tag (gtag.js) - Google Analytics