当Android开发者为他们的项目选择一个 Library 时, 他们不仅仅是在追寻诸如功能、可用性、性能、文档和支持等,同时也关心这个 Library 的体积和多少个方法即将被添加到项目中去。因为随着项目的发展,它的依赖也在增长。开发者越来越难将他们app的方法总数控制在65K以下。然而对于尚未发布的 build版本来说,Proguard 实在是慢得令人难以等待。开发者就像躲避瘟疫一样在努力避免多个 dex。这就是 library 的作者应该重视他们项目大小的原因。
让你的 library 方法数降下来的最简单做法就是不要包含任何没有必要的依赖。任何你包含进来的依赖都将被加到你的用户的项目里。举个例子,如果你只是需要一些简单的通用方法,例如安静地关闭一个资源,不要直接把 Guava 加进来。而是应该引入你自己实现的方法或者是从现有的 library 中(确保得到了授权)提取所需的,你的用户一定会非常感激你排除了其他14K+的方法。
然而那并不表明你应该一直避免使用以下外部的libraries, 你只需要聪明一点对待它即可。不要偏离了原本的路线去写一个HTTP client这种已经实现好的libraries,与其浪费时间在这上面还不如去提高你的library。
避免简单地决定哪些 liraries 该引入,你可以采用一些策略去让你的 library 保持小体积。其中一个策略是在声明依赖的时候去使用一些提供的范围。这是 gradle 里 Android 构建系统的一部分。和编译相比,提供的范围仅仅是在编译时引入了依赖。这意味着当用户构建他们的项目时,依赖将不会被打包进 APK 文件。用户需要在 app 的 build.gradle 文件中显式地声明依赖,如此运行时依赖方可用。
注意:另外有一个 package scope 和默认提供的做了相反的事情,它能将把依赖打包进 APK 文件,但在编译时却不可用。
你在library中引入一个可选依赖可能有好几个原因,其中一个便是某些特定的功能只有部分用户才用得到。一个显而易见的例子就是 Retrofit 1.x,它通过消费反应式的REST调用来替代回调。那些想要使用 RxJava 的用户可以自行添加上,而那些不需要的用户则不用被额外的依赖所负累。虽然这个配置自从 Retrofit 用了 maven 构建系统后发生一些轻微的变化,但内在的思想是类似的。
我需要提醒的是,如果你发现自己引入了一些不是所有用户都能使用到的特性,你应该认真地考虑把那些特性变为你的 library 的一部分。稍后会有更多关于这个的说法。
另外一个你可能想引入可选依赖的原因是:虽然 Android Framework 已经提供某个功能的实现,但是在外部 library 中有一个更高效的实现。已经依赖了这个 library 的用户,或者是那些想引入额外增加的方法来获得更高性能的用户可以引入该 library。
最近我就在 PlacesAutocompleteTextView library 遇到了这个问题——内置的 HTTP client 可以是 OkHttpClient 或者是 HttpURLConnection。前者拥有更高的性能,但需要引入 OkHttp 作为依赖。如果用户不愿意引入 OKHttp 的话,它将会自动用回标准库的 HttpURLConnection。
为了实现这个特性,在运行时,一个叫做 "resolver"的类被用来确定使用哪个依赖。举个例子,这就是决定使用哪个 HTTP client 的类:
public final class PlacesHttpClientResolver {
public static final PlacesHttpClient PLACES_HTTP_CLIENT;
static {
boolean hasOkHttp;
try {
Class.forName("com.squareup.okhttp.OkHttpClient");
hasOkHttp = true;
} catch (ClassNotFoundException e) {
hasOkHttp = false;
}
PlacesApiJsonParser parser = JsonParserResolver.JSON_PARSER;
PLACES_HTTP_CLIENT = hasOkHttp ? new OkHttpPlacesHttpClient(parser) : new HttpUrlConnectionMapsHttpClient(parser);
}
private PlacesHttpClientResolver() {
throw new RuntimeException("No Instances!");
}
}
当该类加载的时候,会通过完整的类名去检测 OkHttpClient 是否是可用的。如果抛出了 ClassNotFoundException 的异常,我们就知道 OKHttp 并没有被用户加入到项目中去,此时将会用回 HttpURLConnection。PlacesHttpClient 以普通接口的方式,封装了两种实现,如此一来,在整个代码库里,它们都可以交换地使用。同样的方法也用在了 JSON 解析上,使得 Gson 成为了可选的依赖。
当性能和包大小之间的权衡是有意义的时候,这种方法是非常好的。在备选实现方式使用起来更麻烦的情况下(例如 JSON 解析),我建议优先使用外部 library 来节省时间,然后考虑在后续的 release 中加入备选的实现。
在此前我提到了你应该睿智地决定哪个特性需引入你的library。 如果一个功能特性并没有被几乎所有的用户都使用到,那么最好就不要把引入它。这使得第一种方法——使用可选依赖的变得不太可靠。再以Retrofit 作为一个例子,在2.x的 release 版本的核心 library 里将不再提供反应式调用 REST 的功能。这个功能被转移到了一个分离的模块,并以它的 maven artifact 的形式来发布。
同样的,不同的响应转换器也被分离到了各自的依赖里。例如,那些需要转换 JSON 响应而且已经依赖了Gson 的 Retrofit 用户可以把以下依赖加入到他们的 build.gradle 文件:
dependencies {
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
}
那些用了不同 JSON库(如 Jackson)的用户或者需要解析不同格式数据(如 XML, 协议缓存区等)的用户,也可以通过类似的方式去解决,而无需被额外的依赖所负累。同等重要地,核心库将不会被那些额外的功能影响,可以保持专注在它打算解决的主要问题上。
如果你发现自己在写一个Android开发者用得上的library, 请在设计它的时候把这几条策略牢记于心。不要把你的library的体积大小单纯看待成一个属性,而是作为一个特性。你的用户将会因此而感激你的!
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。