Android开发:《Gradle Recipes for Android》阅读笔记(翻译)4.5——使用Android Libraries
问题:
你想要在app当中增加新的library模块
解决方案:
使用library插件,增加一个library模块作为依赖。
讨论:
不可以通过使用java库给app增加许多功能,通常是使用jar包。1.5节讲述了如何使用dependencies块。举例子,为了使用Googles的Gson库解析json,可以在module的配置文件里面增加依赖:
dependencies {
compile 'com.google.code.gson:gson:2.6.2'
}
Android libraries超出了java library,因为它们不但包含android的API,还包括了需要的资源。当项目构建的时候,Gradle将Android libraries打包成aar(Android Archieve)文件,和jar文件类似,但是包含了Android的依赖。
从Gradle来看,Android libraries是root的一个子项目。这意味着它们就和Android应用一样,只是在一个子目录下面。module的名字因此被添加到settings.gradle文件里面:
include ':app', ':icndb'
在这样的情况下,Android library模块叫做icndb,代表着 Internet Chuck Norris Database,用来以json格式提供笑话。API页面如下:

作为一个Android library的示例,这个网站作为RESTful服务,返回的json数据会被解析,然后返回的笑话会被添加到WelcomeActivity的TextView。
在Android Studio里面可以通过“New Module”,选择“Android Library”新建一个library模块:

创建library名字后,你可以增加任何你想要的类型的activity。完成向导,创建了library目录,将它增加到根目录下面的settings.gradle文件里面。
每个library都有自己的Gradle配置文件。你可以指定最小和目标的SDK版本,自定义build types,flavors和按照需要修改依赖。最终要的区别是Gradle 配置使用了一个不同的插件:
apply plugin: 'com.android.library'
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
packagingOptions {
exclude 'META-INF/notice.txt'
exclude 'META-INF/license.txt'
exclude 'LICENSE.txt'
}
defaultConfig {
minSdkVersion 16
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'),
}
}
}
dependencies {
compile 'com.google.code.gson:gson:2.6.2'
compile 'com.squareup.retrofit2:retrofit:2.0.1'
compile 'com.squareup.retrofit2:converter-gson:2.0.1'
}
配置文件增加Retrofit2项目作为依赖想,使用Gsonlibrary转化JSON信息。
注意packagingOtions块的使用。这允许你排除在多个项目里面使用的同名文件。
如果你使用这些libraries,ICNDB库的使用就会变得很简单:
public class JokeFinder {
private TextView jokeView;
private Retrofit retrofit;
private AsyncTask<String, Void, String> task;
public interface ICNDB {
@GET("/jokes/random")
Call<IcndbJoke> getJoke(@Query("firstName") String firstName,
@Query("lastName") String lastName,
@Query("limitTo") String limitTo);
}
public JokeFinder() {
retrofit = new Retrofit.Builder()
.baseUrl("http://api.icndb.com")
.addConverterFactory(GsonConverterFactory.create())
.build();
}
public void getJoke(TextView textView, String first, String last) {
this.textView = textView;
new JokeTask().execute(first, last);
}
private class JokeTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
ICNDB icndb = retrofit.create(ICNDB.class);
Call<IcndbJoke> icndbJoke = icndb.getJoke(
params[0], params[1], "[nerdy]");
String joke = "";
try {
joke = icndbJoke.execute().body().getJoke();
} catch (IOException e) {
e.printStackTrace();
}
return joke;
}
@Override
protected void onPostExecute(String result) {
jokeView.setText(result);
}
}
}
JokeFinder类使用提供的首字母和结尾字母访问ICNDB网络服务,使用异步任务,这样就可以使得操作在非UI线程运行。getJoke方法包含了一个TextView参数,这样JokeTask完成的使用进行更新。
IncdbJoke任务只是一个简单的POJO匹配JSON响应。响应的格式如下:

JSON很小,所以对于的IcndbJoke类也很简单,如下:
public class IcndbJoke {
private String type;
private Joke value;
public String getJoke() { return value.getJoke();}
public String getType() { return type; }
public void setType(String type) { this.type = type; }
public Joke getValue() { return value; }
public void setValue(Joke value) { this.value = value;}
private static class Joke {
private int ID;
private String joke;
private String[] categories;
public int getId() { return ID; }
public void setId(int ID) { this.id = ID; }
public String getJoke() { return joke; }
public void setJoke(String joke) { this.joke = joke; }
public String[] getCategories() { return categories; }
public void setCategories(String[] categories) {
this.categories = categories;
}
}
}
应用通过JokeFinder类使用library。在module的配置文件里面使用project依赖,如下:

使用project方法编译应用,将包含子目录的module作为参数。结果就是Gradle知道在构建app之前先构建ICNDB模块,这样使得在编译时可以使用类。
WelcomActivity在JokeFinder里面调用getJoke方法,提供一个TextView的引用和第一个和最后一个名字。如下:

运行结果如下:

构建进程在icndb/build/outputs/arr目录下生成了debug和release版本:

aar文件可以发布到仓库,供以后的app使用。
总结下:
1、Android library项目是需要Android依赖(Android APU的类或者资源)的java项目
2、Gradle为多项目使用子目录,每个子项目添加到根目录下的settings.gradle文件里面
3、在Android Studio里,使用“New Module”向导里面的“Android Library”创建Android Library项目
4、library项目使用com.android.library插件
5、app配置文件使用 project(":library")依赖来使用library。
Android开发:《Gradle Recipes for Android》阅读笔记(翻译)4.5——使用Android Libraries的更多相关文章
- Android开发:《Gradle Recipes for Android》阅读笔记(翻译)5.2——使用Android Testing Support Library进行测试
问题: 你想要测试app的Android组件. 解决方案: 使用新的测试类实现JUnit风格的测试. 讨论: 测试像activities,services等的Android组件,需要将app部署到连接 ...
- Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.7——使用Android Studio签署发布apk
问题: 想要使用Android studio生成签名配置,给他们分配build类型. 解决方案: Build菜单提供了生成签名配置,Project Structure窗口有tab用于分配不同的type ...
- Android开发:《Gradle Recipes for Android》阅读笔记(翻译)6.2——DSL文档
问题: 你需要查找Android Gradle DSL的完整文档. 解决方案: 访问Gradle Tools网站,从Android开发网站下载ZIP文件. 讨论:Android开发网站首页有完整的AP ...
- Android开发:《Gradle Recipes for Android》阅读笔记(翻译)5.1——单元测试
问题: 你想要测试app中的非android部分. 解决方案: 可以使用Android Studio1.1里面增加的单元测支持和Android的Gradle插件. 讨论: ADT插件只支持集成测试,并 ...
- Android开发:《Gradle Recipes for Android》阅读笔记(翻译)4.1——编写自己的任务
问题: 你想用自己的任务定制gradle的构建过程. 解决方案: 在gradle的build文件里面增加task元素.用Android插件支持的extra属性使得开发更容易. 讨论: Gradle的D ...
- Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.3——用Eclipse ADT导出App
问题: 想在一个已经存在的Eclipse ADT的项目中使用Gradle 解决方案: Eclipse ADT插件可以帮助生成Gradle文件 讨论: Eclipse的ADT插件是在2013年推出Gra ...
- Android开发:《Gradle Recipes for Android》阅读笔记(翻译)3.1——使用Build Types
问题: 你想要自定义debug和release的build types,并且新建一些新的types. 解决方案: 使用buildTypes块配置build types. 讨论: build type决 ...
- Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.6——签署发布apk
问题: 为了将APK发布到google市场,需要对APK数字签名. 解决方案: 可以使用java的keytoll命令去创建一个证书,并且在gradle配置文件的signingConfigs块使用. 讨 ...
- Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.4——更新新版本的Gradle
问题: 你需要更新应用的Gradle版本. 解决方案: 生成一个新的wrapper,或者直接修改属性文件(.properties). 讨论: Android Studio包含了一个Gradle的分发. ...
随机推荐
- Layui 弹出层组件——layer
layer是作为Layui[经典模块化前端框架]的一个弹层模块,由于其用户基数较大,所以把layer作为独立组件来维护. 基础参数: 基础参数主要指调用方法时用到的配置项,如:layer.open({ ...
- C# Interview Questions:C#-English Questions
This is a list of questions I have gathered from other sources and created myself over a period of t ...
- Visual Studio 2010以及TeamFoundationServer 2010 MSDN免Key版地址分享(转载)
以下链接转自互联网,已经下载验证SHA1码和MSDN公布的一致,跟我一样不喜欢下试用版再自己动手的同学,请使用最新版的BT工具或者迅雷下载(需要支持Magnet协议) Download Visual ...
- PHP进制转换[实现2、8、16、36、64进制至10进制相互转换]
自己写了一个PHP进制转换程序,一个类吧,第一次写这个东东,写这个东东,在处理文本文件时能用得到. 可以实现: 10进制转换2.8.16.36.62进制2.8.16.36.62进制转换10进制 有 ...
- 【Objective-C】06-点语法
前言 在Java中,我们可以通过"对象名.成员变量名"来访问对象的公共成员变量,这个就称为"点语法".比如: 1.在Student类的第2行定义了一个公共的成员 ...
- js从数组中提取数字
某班的成绩出来了,现在老师要把班级的成绩打印出来. 效果图: XXXX年XX月X日 星期X--班级总分为:81 格式要求: 1.显示打印的日期. 格式为类似“XXXX年XX月XX日 星期X” 的当前的 ...
- Jquery学习笔记(6)--jquery中attr和prop的区别【精辟】
jquery中attr和prop的区别 在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别?这些问题就出现了. 关于它们两个的区别,网上的答案很 ...
- bzoj2005 能量采集 莫比乌斯或者普通容斥
/** 题目:bzoj2005 能量采集 链接:https://vjudge.net/contest/178455#problem/F 题意:栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可 ...
- gitlab手残点错关闭注册No authentication methods configured on login page
Gitlab - 如何解決 "No authentication methods configured on login page" ? (gitlab version : 8.1 ...
- Docker是用来干什么的?【快速入门】
Docker从去年开始不仅能在Linux下运行 ,还支持windows.osX等主流系统. 下面的例子我自己经常使用,当然你有更好的案例也可以分享给我. 尝试新软件 对开发者而言,每天会催生出的各式各 ...