Android开发技术周报 Issue#109
yeshuangjin
8年前
<p><img src="https://simg.open-open.com/show/42452b6e499cdb6c90009ec527f6a5d0.jpg"></p> <h3>新闻</h3> <ol> <li> <p><a href="/misc/goto?guid=4959729106677715751" rel="nofollow,noindex">官宣|谷歌开发者中文博客正式发布</a></p> </li> <li> <p><a href="/misc/goto?guid=4959729106773737020" rel="nofollow,noindex">官宣|Google Developers中国网站发布!</a></p> </li> <li> <p><a href="/misc/goto?guid=4958996280701870064" rel="nofollow,noindex">Google Pixel的积极意义:加快推动Android厂商部署Nougat</a></p> </li> <li> <p><a href="/misc/goto?guid=4958995980849613033" rel="nofollow,noindex">谷歌推出Android 7.1.1 增加对"图像键盘"的支持</a></p> </li> </ol> <h3>教程</h3> <ol> <li> <p><a href="/misc/goto?guid=4959729106990899598" rel="nofollow,noindex">使用 Unit Test 高效地玩转 RxJava 的操作符</a></p> <p>RxJava 博大精深,想要入门和进阶,操作符是一个切入点。 所以,我们希望寻找一种可以把操作符写得比较爽,同时可以快速验证输入输出是否准确的玩法。思路有以下两点:1.使用 UT 来对每一个操作符进行实现,如此一来可以脱离 Android 平台的依赖,专注于操作符本身。2.对于每一种操作符,使用 RX Marbles ,或者 RxJava 官方的弹珠图(marble diagrams)进行实现。</p> </li> <li> <p><a href="/misc/goto?guid=4959729107065119916" rel="nofollow,noindex">MultiDex工作原理分析和优化方案</a></p> <p>动态加载技术(插件化)系列已经坑了有一段时间了,不过UP主我并没有放弃治疗哈,相信在不就的未来就可以看到“系统Api Hook模式”和插件化框架Frontia的更新了。今天要讲的是动态加载技术的亲戚 —— MultiDex。他们的核心原理之一都是dex文件的加载。</p> </li> <li> <p><a href="/misc/goto?guid=4959729107144631198" rel="nofollow,noindex">Qzone视频下载如何做到多快好省?</a></p> <p>在Android手机上播放在线视频,最简单的方式就是实例化一个MediaPlayer, 将视频的URL通过setDataSource()设置给播放器,之后调用prepareAsync()和start()遍可以开始播放视频。这种方式非常简单,但其中最大的问题就是整个过程中的数据流完全由MediaPlayer控制,我们无法控制下载和播放的过程,也就导致我们没有办法提高成功率,优化用户体验。因此,Android侧的视频下载一般采用本地代理的方案实现。</p> </li> <li> <p><a href="/misc/goto?guid=4959729107224413534" rel="nofollow,noindex">理解Android ANR的处理过程</a></p> <p>无论是四大组件或者进程等只要发生ANR,最终都会调用AMS.appNotResponding()方法,下面从这个方法说起。当发生ANR时, 会按顺序依次执行:1.输出ANR Reason信息;2.收集并输出重要进程列表中的各个线程的traces信息,该方法较耗时; 【见小节2】;3.输出当前各个进程的CPU使用情况以及CPU负载情况;4.将traces文件和 CPU使用情况信息保存到dropbox,即data/system/dropbox目录;5.根据进程类型,来决定直接后台杀掉,还是弹框告知用户.</p> </li> <li> <p><a href="/misc/goto?guid=4959729107304836911" rel="nofollow,noindex">Native进程之Trace原理</a></p> <p>当发生ANR(Application Not Response,对于Java进程可通过kill -3向目标进程发送信号SIGNAL_QUIT, 输出相应的traces信息保存到目录/data/anr/traces.txt;而对于Native进程可通过 debuggerd输出traces信息。可通过一条命令来获取指定Native进程的traces信息,例如输出pid=17529进程信息: adb shell debuggerd -b 17529 //可指定进程pid</p> </li> <li> <p><a href="/misc/goto?guid=4959729107394427033" rel="nofollow,noindex">ART虚拟机之Trace原理</a></p> <p>Android 6.0系统采用的art虚拟机,所有的Java进程都运行在art之上,当应用发生ANR(Application Not Response,其中最终的一个环节便是向目标进程发送信号SIGNAL_QUIT, 传统的linux则是终止程序并输出core;而对于Android进程来说当收到SIGQUIT时,Java层面的进程都是跑在虚拟机之上的,ART虚拟机会捕获该信号,并输出相应的traces信息保存到目录/data/anr/traces.txt。</p> </li> <li> <p><a href="/misc/goto?guid=4959729107465041760" rel="nofollow,noindex">常见性能优化策略的总结</a></p> <p>之所以把代码放到第一位,是因为这一点最容易引起技术人员的忽视。很多技术人员拿到一个性能优化的需求以后,言必称缓存、异步、JVM等。实际上,第一步就应该是分析相关的代码,找出相应的瓶颈,再来考虑具体的优化策略。有一些性能问题,完全是由于代码写的不合理,通过直接修改一下代码就能解决问题的,比如for循环次数过多、作了很多无谓的条件判断、相同逻辑重复多次等。</p> </li> <li> <p><a href="/misc/goto?guid=4959729107547704197" rel="nofollow,noindex">玩转AppBarLayout</a></p> <p>AppBarLayout是一个垂直的LinearLayout,实现了Material Design中app bar的scrolling gestures特性。AppBarLayout的子View应该声明想要具有的“滚动行为”,这可以通过layout_scrollFlags属性或是setScrollFlags()方法来指定。AppBarLayout只有作为CoordinatorLayout的直接子View时才能正常工作,为了让AppBarLayout能够知道何时滚动其子View,我们还应该在CoordinatorLayout布局中提供一个可滚动View,我们称之为scrolling view。scrolling view和AppBarLayout之间的关联,通过将scrolling view的Behavior设为AppBarLayout.ScrollingViewBehavior来建立。</p> </li> <li> <p><a href="/misc/goto?guid=4959729107635953904" rel="nofollow,noindex">彻底搞懂CoordinatorLayout</a></p> <p>首先我们先来看看CoordinatorLayout究竟是个什么东东,它究竟是用来做什么的。官方文档对CoordinatorLayout是这样描述的:CoordinatorLayout是一个“加强版”FrameLayout,它主要有两个用途:1.用作应用的顶层布局管理器,也就是作为用户界面中所有UI控件的容器;2.用作相互之间具有特定交互行为的UI控件的容器;通过为CoordinatorLayout的子View指定Behavior,就可以实现它们之间的交互行为。 Behavior可以用来实现一系列的交互行为和布局变化,比如说侧滑菜单、可滑动删除的UI元素,以及跟随着其他UI控件移动的按钮等。</p> </li> <li> <p><a href="/misc/goto?guid=4959729107706781873" rel="nofollow,noindex">Redex初探与Interdex:Andorid冷启动优化</a></p> <p>早在去年10月份,非死book就发布了介绍redex的文章,这个据说可以直接对apk做处理,既提高启动性能,又可减少安装包的利器让安卓开发者们都心动不已。直到今年4月,redex终于开源了,我们也第一时间对redex做了研究(有观众可能要说我骗人,这都11月了怎么还第一时间呢?好把这个总结是拖了很久才写),虽然由于坑多,最终没有接入到项目构建中,但受Interdex启发,在应用冷启动速度优化方面有了新的收获。</p> </li> </ol> <h3>开源库 & App</h3> <ol> <li> <p><a href="/misc/goto?guid=4959729107782650878" rel="nofollow,noindex">tab-digit</a></p> <p>A Flip Clock Libray</p> </li> <li> <p><a href="/misc/goto?guid=4959729107871986114" rel="nofollow,noindex">FolioReader-Android</a></p> <p>A Java ePub reader and parser framework for Android</p> </li> <li> <p><a href="/misc/goto?guid=4959729107945865527" rel="nofollow,noindex">gifencoder</a></p> <p>A pure Java library implementing the GIF89a specification. Suitable for use on Android.</p> </li> <li> <p><a href="/misc/goto?guid=4959729108028300109" rel="nofollow,noindex">WaveLoading</a></p> <p>A wave-like loading drawable</p> </li> <li> <p><a href="/misc/goto?guid=4959729108108615133" rel="nofollow,noindex">RxDownload</a></p> <p>基于RxJava和Retrofit打造的下载工具, 支持多线程下载和断点续传, 智能判断是否支持断点续传等功能</p> </li> <li> <p><a href="/misc/goto?guid=4959672251968204671" rel="nofollow,noindex">OkLog</a></p> <p>Network logging interceptor for OkHttp. Logs an URL link with encoded network call data for every OkHttp call.</p> </li> <li> <p><a href="/misc/goto?guid=4959729108225126199" rel="nofollow,noindex">CircleAlarmTimerView</a></p> <p>圆形进度条</p> </li> <li> <p><a href="/misc/goto?guid=4959729108296229744" rel="nofollow,noindex">MyDiary</a></p> <p>In the Movie "-your name.-" (君の名は。, 你的名字) , "My Diary" of android version is</p> </li> <li> <p><a href="/misc/goto?guid=4959729108384922660" rel="nofollow,noindex">CaptchaImageView</a></p> <p>可以生成验证码图片的 ImageView</p> </li> </ol> <h3>工具</h3> <ol> <li> <p><a href="/misc/goto?guid=4959729108458482530" rel="nofollow,noindex">ApkChannelBuilder</a></p> <p>一个 Mac App,用于 Apk 多渠道打包</p> </li> <li> <p><a href="/misc/goto?guid=4959729108543161054" rel="nofollow,noindex">AndroidIconAnimator</a></p> <p>Android vector icon animation tool</p> </li> </ol> <h3> </h3> <p>来自:http://www.androidweekly.cn/android-dev-weekly-issue-109/</p> <p> </p>