`

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

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

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

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

    2010年谢彦的android笔记

    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笔记.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 代码分析

    25.2 公共库概述 70 25.3 Binder进程间通讯部分 71 26 Android IPC 通讯机制源码分析 73 26.1 Binder通信简介: 73 26.1.1. ServiceMananger进程注册过程源码分析: 74 26.1.2. client获取remote IServiceManager ...

    在您的Android应用中建立实时位置共享-Android开发

    对于iOS,请参阅我们的开源iOS系统信息库。 Google Play商店提供了适用于Android的HyperTrack Live,供已通过HyperTrack注册的用户使用。 适用于iOS的HyperTrack Live在公共App Store上可用。 :waving_hand:阅读我们...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    Sqlite 一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中 W3C 万维网联盟,创建于1994年,是Web技术领域最具权威和影响力的国际中立性技术标准机构。主要的工作是发展 Web 规范,...

    Xamarin-ArcGIS-PCL:概念证明展示了一种使用 Xamarin 从 PCL 访问 ArcGIS Runtime 的方法

    这是什么? ESRI 最近宣布即将支持 。 这是一个概念验证,演示了一种从 Xamarin 上的 PCL 内部访问 ESRI ArcGIS Runtime 的方法。... 请注意, Mvx.Android 实现了核心 PCL 库和 Android 平台库。

    lab-maps-sdk-android-display-a-map

    您将学习: 如何使用TomTom Map SDK开始您的旅程编写一个简单的Android Main Activity 使用TomTom开发人员门户网站连接TomTom Web服务建立下一代的位置体验为了获得功能齐全的应用程序,您需要通过在TomTom ...

    60条Android开发注意事项与经验总结

    1. 全部Activity可继承自BaseActivity,便于统一风格与处理公共事件,构建对话框统一构建器的建立,万一需要整体变动,一处修改到处有效。 2.数据库表段字段常量和SQL逻辑分离,更清晰,建议使用Lite系列框架LiteOrm...

    gh4a:适用于Android的Github客户端

    查看公共/监视的存储库 查看关注者/关注 查看组织(如果类型为用户) 查看成员(如果类型是组织) 问题 列出问题 按标签,受让人或里程碑过滤 创建/编辑/关闭/重新打开问题 对问题发表评论 管理标签 管理里程碑 ...

    novid20-android-sdk:NOVID20 Android SDK源代码

    NOVID20 Android SDK 这是为NOVID20 ... 注意:这不会因为缺少机密和密钥而建立,但是除了代码库已完成之外。 更多信息: 作者 执照 该项目是根据GNU通用公共许可证v3.0发布的,有关更多详细信息,请参见 。

    inject:围绕javax.inject批注的简单Kotlin多平台抽象

    有关该库的更多信息,请参阅的博客文章,该文章在《 Android Weekly》期中有介绍。 该还刊登在Kotlin Weekly期中。 使用图书馆 只需使用提供的注释,就像使用注释一样。 例如,在Kotlin公共代码中的构造函数上...

    Mumble:专为开发人员打造的开源社交媒体平台和公共论坛,用于提问和讨论

    为开发人员建立的开源社交媒体平台和问题与讨论公共论坛。 :link: 友情链接: UI套件(文档/预览) :backhand_index_pointing_right: 不和谐 ======= 下载和设置说明: 克隆项目。 这会将GitHub存储库文件下载到...

    Android 日常开发总结的60条技术经验

    1. 全部Activity可继承自BaseActivity,便于统一风格与处理公共事件,构建对话框统一构建器的建立,万一需要整体变动,一处修改到处有效。 2. 数据库表段字段常量和SQL逻辑分离,更清晰,建议使用Lite系列框架...

    Roam:使用QGIS构建简单的数据收集

    Roam是使用QGIS库和Python构建的现场数据收集应用程序。 它被构建为易于在基于Windows的平板电脑设备上使用,并计划在未来使用Android。 Roam是作为独立的完全打包的Python应用程序构建的,其中包含了所有内容。 ...

    web-push:Web推送通知演示

    Web推送通知演示 一个完整的应用程序,演示Web推送通知的使用以及完整的...启用消息传递API:API和身份验证-&gt;移动API-&gt; Android的云消息传递-&gt;启用API 克隆此存储库 为您的项目编号和API密钥设置外壳变量: export

    LiveSmart视频聊天独立程序带安装教程

    (可选)将ws文件夹移到公共文件夹外; 检查这里怎么安装上的Node.js和这里的PHP。您也可以查看视频教程 ; 安装完信令服务器后,打开config / config.ini文件并使用服务器编辑YOUR_DOMAIN; 在文件夹的根目录...

    2011年全国电子信息技术与应用学术会议论文集

    全面整合模式下的政府公共危机管理机制的战略选择研究⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯张星,王秀平(481) Study on the Knowledge Innovation Performance of the High-Tech Virtual Industry Cluster⋯⋯...

Global site tag (gtag.js) - Google Analytics