Android开发技术周报 Issue#105

马严子 8年前
   <h3><strong>新闻</strong></h3>    <ol>     <li> <p><a href="/misc/goto?guid=4959725000401958164" rel="nofollow,noindex">Night Mode有望回归Nexus设备</a></p> </li>     <li> <p><a href="/misc/goto?guid=4959725000520407242" rel="nofollow,noindex">谷歌模块手机Project ARA上手图赏:像掰巧克力一样</a></p> </li>     <li> <p><a href="/misc/goto?guid=4959725000624199655" rel="nofollow,noindex">CyanogenMod 14.1 Nightly Builds发布:基于Android 7.1</a></p> </li>     <li> <p><a href="/misc/goto?guid=4959725000724722250" rel="nofollow,noindex">Android Nougat新彩蛋:可实现任意部分截图</a></p> </li>     <li> <p><a href="/misc/goto?guid=4959725000826034813" rel="nofollow,noindex">发布两个月之后 Android N安装率达到0.3%</a></p> </li>     <li> <p><a href="/misc/goto?guid=4959725000924756965" rel="nofollow,noindex">为Android/Chrome融合打基础? 谷歌收购模拟器团队</a></p> </li>    </ol>    <p> </p>    <h3><strong>教程</strong></h3>    <ol>     <li> <p><a href="/misc/goto?guid=4959725001035723454" rel="nofollow,noindex">Android 复杂的列表视图新写法: MultiType 详解篇</a></p> <p>在开发我的 TimeMachine 时,我有一个复杂的聊天页面,于是我设计了我的类型池系统,它是完全解耦的,因此我能够轻松将它抽离出来分享,并给它取名为 MultiType.从前,比如我们写一个类似微博列表页面,这样的列表是十分复杂的:有纯文本的、带转发原文的、带图片的、带视频的、带文章的等等,甚至穿插一条可以横向滑动的好友推荐条目。不同的 Item 类型众多,而且随着业务发展,还会更多。如果我们使用传统的开发方式,经常要做一些繁琐的工作,代码可能都堆积在一个 Adapter 中:我们需要覆写 RecyclerView.Adapter 的 getItemViewType 方法,罗列一些 type 整型常量,并且 ViewHolder 转型、绑定数据也比较麻烦。一旦产品需求有变,或者产品设计说需要增加一种新的 Item 类型,我们需要去代码堆里找到我们原来的逻辑去修改,或者找到正确的位置去增加代码。这些过程都比较繁琐,侵入较强,需要小心翼翼,以免改错影响到其他地方。</p> </li>     <li> <p><a href="/misc/goto?guid=4959725001128298353" rel="nofollow,noindex">如何构建Android MVVM 应用框架</a></p> <p>说到Android MVVM,相信大家都会想到Google 2015年推出的DataBinding框架。然而两者的概念是不一样的,不能混为一谈。MVVM是一种架构模式,而DataBinding是一个实现数据和UI绑定的框架,是构建MVVM模式的一个工具。之前看过很多关于Android MVVM的博客,但大多数提到的都是DataBinding的基本用法,很少有文章仔细讲解在Android中是如何通过DataBinding去构建MVVM的应用框架的。View、ViewModel、Model每一层的职责如何?它们之间联系怎样、分工如何、代码应该如何设计?这是我写这篇文章的初衷。</p> </li>     <li> <p><a href="/misc/goto?guid=4959725001233404763" rel="nofollow,noindex">WebP原理和Android支持现状介绍</a></p> <p>目前网络中图片仍然是占用流量较大的一部分,对于移动端更是如此,因此,如何在保证图片视觉不失真前提下缩小体积,对于节省带宽和电池电量十分重要。然而目前对于JPEG、PNG、GIF等常用图片格式的优化已几乎达到极致,因此Google于2010年提出了一种新的图片压缩格式 — WebP,给图片的优化提供了新的可能。WebP为网络图片提供了无损和有损压缩能力,同时在有损条件下支持透明通道。据官方实验显示:无损WebP相比PNG减少26%大小;有损WebP在相同的SSIM(Structural Similarity Index,结构相似性)下相比JPEG减少25%~34%的大小;有损WebP也支持透明通道,大小通常约为对应PNG的1/3。</p> </li>     <li> <p><a href="/misc/goto?guid=4959725001338264660" rel="nofollow,noindex">一触即发——App启动优化最佳实践</a></p> <p>其实最早的时候,闪屏是用来在App未完全启动的时候,让用户不至于困惑App是否启动而加入的一个设计。而现在的很多App,基本上都把闪屏当做一个广告、宣传的页面了,貌似已经失去了原本的意义,但闪屏,不管怎么说,在一个App启动的时候,都是非常重要的,设计的事情,交给UE吧,开发要做的,就是让App的启动体验,做到最好。</p> </li>     <li> <p><a href="/misc/goto?guid=4959725001463210578" rel="nofollow,noindex">微信mars 的高性能日志模块 xlog</a></p> <p>mars 是微信官方的终端基础组件,是一个使用 C++ 编写的业务性无关,平台性无关的基础组件。目前接入平台:Android、iOS、Mac、Windows、WP等 。现正在筹备开源中。可以这么说,接入 mars 之后,开发一个应用只需要把开发重心放在业务层和 UI 层上,底层的日志模块和网络模块在 mars 中都已经提供。在使用用户数上有月活跃8亿的微信用户帮忙背书(数据来源于财报)。 在数据监控上,纯网络监控,长连接有18项 短连接7项。接下来我重点讲今天的主角mars的 xlog 部分。我们先来思考一下为什么需要日志,日志什么时候能显示其作用。</p> </li>     <li> <p><a href="/misc/goto?guid=4959725001597539716" rel="nofollow,noindex">携程 React Native 实践与性能优化</a></p> <p>React Native(下文简称 RN)开源已经一年多时间,国内各大互联网公司都在使用,携程也在今年 5 月份投入资源开始引入,并推广给多个业务团队使用,本文将会分享我们遇到的一些问题以及我们的优化方案。</p> </li>     <li> <p><a href="/misc/goto?guid=4959725001707266949" rel="nofollow,noindex">大幅提高Android开发效率之Android项目模板化(下)</a></p> <p>在《 <a href="/misc/goto?guid=4959725001810962988" rel="nofollow,noindex">大幅提高Android开发效率之Android项目模板化(上)</a> 》中我们了解了如何用 Android Studio Template 大幅减少写业务代码前的工作量,同时也稍微提了下用 Live Template 减少写业务代码过程中的“样板式代码”。可能有朋友会问,我们这么紧张这点效率真的必要么?这个问题我先不回答,我们先来看看一个场景:写一个单例。单例模式应该是开发过程中最常见的设计模式之一了。写单例前总得先纠结一下吧,单例模式这么多种实现方式该用哪种好呢?选定了实现方式后,老老实实写一堆代码,然后你会突然发现除了类名不一样外,其他代码都是一模一样,这时你心里会不会隐隐约约觉得这是可以优化的?</p> </li>     <li> <p><a href="/misc/goto?guid=4959725001906111960" rel="nofollow,noindex">微信 Tinker 热不丁修复框架分析 -- Diff</a></p> <p>从微信公众号介绍 Tinker 开始就一直关注 Tinker,自己也一直在做热修复相关的开发,但一直都是在踩坑的状态,在 MDCC 的时候也和邵文同学聊了一下,从看到框架代码开始就觉得其稳定性相当的好,而整个框架里我在意的几部分是: 1. DexDiff 我觉得这是最体现微信做事风格的一个模块:要把一个技术做到极致,像之前开源的几种方案里 Andfix 的补丁粒度是方法,像 nuwa、rocoofix 类似的补丁粒度是类,其他有很多采用 bsdiff 的,其实上述的方法都会由于一些的情况造成补丁包变得很大(这个后面会讲原因),而 Tinker 是基于 Dex 的文件结构来下手,将产生变化的结构提取出来,产生的补丁非常小,而且在 diff 的过程中也处理了一些会造成补丁包很大的场景,这个后续再谈。之前有同学跟我说这个是反编译过程,其实并不是如此。</p> </li>     <li> <p><a href="/misc/goto?guid=4959725002008761680" rel="nofollow,noindex">Android 7.1 新特性之 Shortcuts 介绍</a></p> <p>Android 7.1 允许 App 自定义 Shortcuts,类似 iOS 的 3D touch。通过在桌面长按 App 弹出 Shortcut 列表,点击某个 Shortcut 快速进入某项操作,同时 Shortcut 可以拖动到桌面进行固定,由于 7.1 SDK 的 Sources 尚未开放,目前大部分内容还是根据官方 API 文档而来,还有些细节和可能的 Bug 还得等 Sources 开放。Shortcuts 全面介绍分为两篇,本文是基础介绍,关于 Shortcuts 一些不错的实践和目前的问题可访问 trinea.cn 最新文章。</p> </li>     <li> <p><a href="/misc/goto?guid=4959725002107120982" rel="nofollow,noindex">OKHttp3源码解析</a></p> <p>鉴于一些关于OKHttp3源码的解析文档过于碎片化,本文系统的,由浅入深得,按照网络请求发起的流程顺序来讲解OkHttp3的源码。在自己学习的同时,给大家分享一些经验</p> </li>     <li> <p><a href="/misc/goto?guid=4959725002219686347" rel="nofollow,noindex">安卓AOP三剑客:APT,AspectJ,Javassist</a></p> <p>AOP:面向切面编程(Aspect-Oriented Programming)。如果说,OOP如果是把问题划分到单个模块的话,那么AOP就是把涉及到众多模块的某一类问题进行统一管理。Android AOP就是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,提高开发效率。</p> </li>     <li> <p><a href="/misc/goto?guid=4959725002337758062" rel="nofollow,noindex">途牛APK压缩最佳实践</a></p> </li>     <li> <p><a href="/misc/goto?guid=4959725002446420848" rel="nofollow,noindex">The key concepts of app tracking for developers</a></p> <p>Valuable information for Android developers about mobile analytics</p> </li>    </ol>    <h3><strong>开源库 & App</strong></h3>    <ol>     <li> <p><a href="/misc/goto?guid=4959725002537374205" rel="nofollow,noindex">XLog</a></p> <p>一个易用可扩展的 Android 日志库。在实现主流日志库几乎所有功能的前提下,专注于代码架构和扩展性方面的设计,堪称史上最强的 Android 日志库。</p> </li>     <li> <p><a href="/misc/goto?guid=4958961145273295585" rel="nofollow,noindex">DeepLinkDispatch</a></p> <p>A simple, annotation-based library for making deep link handling better on Android</p> </li>     <li> <p><a href="/misc/goto?guid=4959725002673652448" rel="nofollow,noindex">tinker-manager</a></p> <p>微信tinker补丁管理,后端代码+客户端sdk</p> </li>     <li> <p><a href="/misc/goto?guid=4959725002759185022" rel="nofollow,noindex">ReView</a></p> <p>一个辅助设计师方便 review UI 的 view 组件集合</p> </li>     <li> <p><a href="/misc/goto?guid=4959725002852328226" rel="nofollow,noindex">BigImageViewer</a></p> <p>Big image viewer supporting pan and zoom, with very little memory usage and full featured image loading choices. Powered by Subsampling Scale Image View, Fresco, Glide, and Picasso.</p> </li>     <li> <p><a href="/misc/goto?guid=4959725002939864143" rel="nofollow,noindex">FastAccess</a></p> <p>A tiny launcher or as Samsung likes to call it Floating Toolbox.</p> </li>     <li> <p><a href="/misc/goto?guid=4959725003028587087" rel="nofollow,noindex">ActivitySwitcher</a></p> <p>一个基于 Activity 视图操作管理库,可以实现 Activity 之间任意跳转、关闭任意一个 Activity 以及结束应用程序等功能</p> </li>     <li> <p><a href="/misc/goto?guid=4959725003114183556" rel="nofollow,noindex">dynamic-load-view</a></p> <p>能够动态加载外部apk中的View以及资源,能够热修复线上View,以及模块化更新</p> </li>     <li> <p><a href="/misc/goto?guid=4959725003195893565" rel="nofollow,noindex">RippleLayout</a></p> <p>A layout that implemented ripple effect for transition animation.</p> </li>     <li> <p><a href="/misc/goto?guid=4959725003280432064" rel="nofollow,noindex">GetWordTextView</a></p> <p>一个可以取词的TextView</p> </li>     <li> <p><a href="/misc/goto?guid=4959725003368166552" rel="nofollow,noindex">SQLiteOnWeb-Android</a></p> <p>一个可以让你在浏览器里管理应用 SQLite 数据库的库</p> </li>    </ol>    <h3><strong>工具</strong></h3>    <ol>     <li> <p><a href="/misc/goto?guid=4959725003456577128" rel="nofollow,noindex">Android Studio 2.3 预览版发布啦</a></p> <p>Bug Fixes、IntelliJ 2016.2.5、URL Assistant、Lint Enhancements(Many new checks, and baseline support)、WebP Support、Pixel & Pixel XL device definitions、Search for Vector Asset Wizard、ConstraintLayout Editor support - Ratio and Chains support。</p> <p>墙内下载地址: <a href="/misc/goto?guid=4958867433293361345" rel="nofollow,noindex">http://www.androiddevtools.cn/#android-studio</a></p> </li>     <li> <p><a href="/misc/goto?guid=4959725003571892258" rel="nofollow,noindex">gradle-build-properties-plugin</a></p> <p>External properties files support for your build scripts.</p> </li>    </ol>    <h3><strong>设计</strong></h3>    <ol>     <li> <p><a href="/misc/goto?guid=4959725003659654473" rel="nofollow,noindex">不要只给你的 Android 应用准备一个圆形图标</a></p> <p>随着 Google Pixel 的发布, 很多应用都已经 (或者开始考虑) 给自己添置了一个圆形的 launcher icon. 加入圆形图标后, 在 Google Pixel 的主屏上就产生了还算不错的一致性. 这个圆形图标至少目前是只在 Google Pixel 上支持的, 所以就算你没做这样一个图标, 大部分情况其实也是无所谓的。</p> </li>     <li> <p><a href="/misc/goto?guid=4959725003747140495" rel="nofollow,noindex">UI设计中下拉刷新有什么讲究?</a></p> <p>最早的下拉刷新设计源自于Tweetie 这款应用的设计,设计师Loren Brichter 是这种令人欲罢不能的交互的缔造者。现在,下拉刷新的交互几乎无处不在,但即便如此也让人无法轻易忽视它带来的快感。从推ter 到 Gmail,从QQ到新浪微博,它几乎存在于你触手可及的每一个应用当中。</p> </li>     <li> <p><a href="/misc/goto?guid=4959723989466845774" rel="nofollow,noindex">移动端用户体验:底部导航</a></p> <p>设计师都知道,设计不只是为了好看。设计也决定用户如何融入一个产品,无论是网站还是app。这是一种交谈。导航就是一种交谈。因为如果用户不明白使用方式,你的网站或app再漂亮都没用。</p> </li>    </ol>    <h3><strong>活动</strong></h3>    <ol>     <li> <p><a href="/misc/goto?guid=4959725003862823356" rel="nofollow,noindex">北京GDG DevFest 2016 开放报名!</a></p> <p>北京 GDG 一年一度的开发者大会 DevFest 2016 再度来袭,现已正式开放报名!今年是北京 GDG 第五次举办 DevFest 大会,最近四届一直保持 500 人的规模。DevFest 是完全由社区组织者、志愿者独立筹备的活动,是国内少数高质量、无广告、免费的开发者大会。本次大会分两个会场主要面向 Android 和 Web 开发者,由国内资深工程师给大家带来分享。此外,还有 TensorFlow 的介绍内容。</p> </li>    </ol>    <h3><strong>书</strong></h3>    <ol>     <li> <p><a href="/misc/goto?guid=4959725003943210772" rel="nofollow,noindex">我的Java后端书架 (2016年暖冬版)</a></p> </li>     <li> <p><a href="/misc/goto?guid=4959725004034811459" rel="nofollow,noindex">一堆免费的开发相关的书</a></p> </li>    </ol>    <h3> </h3>    <p> </p>    <p>来自:http://www.androidweekly.cn/android-dev-weekly-issue-105/</p>    <p> </p>