一个千万量级的APP使用的一些第三方库

sypuqmgely 8年前
   <h2>.背景</h2>    <p>前段时间在调研第三方推送服务的时候,反编译了一部分市面上比较流行的APP。其中一个无论是在设计还是功能上都堪称典型,这款APP总用户数超千万(其官网数据),在国内某手机助手上支持率超97%。可见其受欢迎程度(APP的名字就不说了)。反编译这个APP后发现其使用的第三方库也很有代表性。这里介绍下他们使用的这些第三方库,给需要的童鞋一些参考。</p>    <h3>1.Android Design Support Library</h3>    <p>这个并不是一个第三方库,是谷歌官方出的支持库。之所以列出来除了上面说的这个APP有使用到它外,更多的是因为这个库很强大~</p>    <blockquote>     <p>这个库和github上的很多开源项目是有很大关系的,material design的很多效果,同一种效果在github上有太多的实现,现在官方把部分效果标准化了。<br> 这里注意不要和兼容库Android Support Library 混淆,虽然都是兼容库,但区别还是很大的。<br> <a href="/misc/goto?guid=4958965424364504755">Android Design Support Library详细介绍点这里</a><br> <a href="/misc/goto?guid=4959675442984187313">Android Support Library 官方文档翻译</a></p>    </blockquote>    <h3>2. <a href="/misc/goto?guid=4958873636818564987">butterknife</a></h3>    <p>这个库应该大家都耳熟能详了,<a href="/misc/goto?guid=4958961775931067718">大牛JakeWharton的作品</a>,github上star数量超一万,可见其受欢迎程度。</p>    <p>这个开源库可以让我们从大量的findViewById()和setOnclicktListener()解放出来,其对性能的影响微乎其微,其自定义注解的实现都是限定为RetentionPolicy.CLASS,也就是注解到编译出.class文件为止有效,在运行时不额外消耗性能。</p>    <blockquote>     <p>Instead of slow reflection, code is generated to perform the view look-ups. Calling bind delegates to this generated code that you can see and debug.</p>    </blockquote>    <p>有人觉得使用了这个库之后代码的可读性差一些,这个真心不认同,相反,使用过后反倒代码量少了好多,更清爽简洁了。</p>    <p>关于编译时注解效率的问题可以看下这篇文章<a href="/misc/goto?guid=4959675443126753837">关于java编译时注解你需要知道的二三事。解除你的顾虑!</a></p>    <p>这个库在Android Studio上配合<a href="/misc/goto?guid=4958875618985371190">android-butterknife-zelezny</a>使用更酸爽!</p>    <h3>3.<a href="/misc/goto?guid=4958988893478698129">fastjson</a>,<a href="/misc/goto?guid=4958964956010997959">gson</a></h3>    <p>这两个JSON序列化与反序列化库应该都熟悉的了,fastjson是阿里的,gson是Google的,基本功能都差不多,至于为什么两个库都出现在这个APP里面,应该是APP版本的各个开发者使用习惯不一样吧,也有可能是使用的一些第三方库依赖其中一种的原因。</p>    <p>这里要提一下的是fastjson号称是Java语言中最快的JSON库,而且有专门针对Android精简和优化的版本,体积减少了近一半。因为体积更大,为避免出现64K方法数限制而弃用fastjson的理由应该不再成立。<a href="/misc/goto?guid=4959675443299657740">fastjson Android版本</a></p>    <p>不过也许是因为gson是Google官方出的,文档什么的也更详细,gson在APP内出现的频率还是更高的。</p>    <h3>4.<a href="/misc/goto?guid=4958972548258164558">picasso</a></h3>    <blockquote>     <p>A powerful image downloading and caching library for Android</p>    </blockquote>    <p>这个是square 开源的一个强大的图片下载和缓存库。很受欢迎,许多项目都有在使用这个库。使用方式也很简单。</p>    <p>关于图片加载库现在比较流行的还有Glide和Fresco。</p>    <p><strong><a href="/misc/goto?guid=4958862736295244246">Glide</a></strong><br> Google员工私人项目,Google很多项目在用。picasso能做到的它都能做到,<strong>并且还支持gif</strong>。我在公司的项目中也使用的是这个库。不过注意在使用这个库给ImageView加载图片的时候,ImageView设置 Tag的Id必须显示指定。</p>    <p>关于Glide和Picasso这篇译文有一个比较详细的对比介绍 <a href="/misc/goto?guid=4959675443448375562">Glide VS Picasso</a>(打算使用Glide的话注意看下这篇文章下面的评论)</p>    <p><a href="/misc/goto?guid=4958869680969840391">Fresco</a><br> 这个是非死book的开源项目,上面链接中有中文的详细文档。这个库除了支持的图片格式很广泛外,最大的特性就是在内存优化这块,使用这个库能有效防止OOM情况的出现。</p>    <blockquote>     <p>在5.0以下系统,Bitmap缓存位于ashmem,这样Bitmap对象的创建和释放将不会引发GC,更少的GC会使你的APP运行得更加流畅。<br> 5.0及其以上系统,相比之下,内存管理有了很大改进,所以Bitmap缓存直接位于Java的heap上。<br> 当应用在后台运行时,该内存会被清空。</p>    </blockquote>    <p>不过这个库非主流强大的功能使得这个库体积有2M之大,使用起来也有点不太方便。</p>    <blockquote>     <p>最后,如果你还在用<a href="/misc/goto?guid=4958532889178784950">Android-Universal-Image-Loader</a>这个老牌库,建议尽早替换掉它,这个库已经停止更新了。而且无论是使用体验还是性能都没有以上库好。</p>     <p>Really have no time for development... so I stop project maintaining since Nov 27 :(</p>    </blockquote>    <h3>5.<a href="/misc/goto?guid=4959622823316866487">PullZoomView</a></h3>    <blockquote>     <p>An Android custom ListView and ScrollView with pull to zoom-in.</p>    </blockquote>    <p>这个直接上效果图了</p>    <p><img alt="一个千万量级的APP使用的一些第三方库" src="https://simg.open-open.com/show/18402c8d223861bec2a34d792fadd49e.gif"></p>    <p>PullZoomView效果图.gif</p>    <h3>6.<a href="/misc/goto?guid=4958988897536054229">SwipeBackLayout</a></h3>    <blockquote>     <p>An Android library that help you to build app with swipe back gesture.</p>    </blockquote>    <p>一个能帮我们轻松实现右滑退出当前页面功能的库,这个库也有使用在我们公司的项目中,不过花了不少时间在处理兼容性问题上(有时间的话会把填过的坑分享出来)。</p>    <p>这里有必要再提一下这个库在手势处理方面使用到的ViewDragHelper,非常有用的一个工具类。</p>    <blockquote>     <p>ViewDragHelper is a utility class for writing custom ViewGroups. It offers a number<br> of useful operations and state tracking for allowing a user to drag and reposition<br> views within their parent ViewGroup.</p>    </blockquote>    <p>具体可以看下这篇文章<a href="/misc/goto?guid=4958961792784979837">Android ViewDragHelper完全解析 自定义ViewGroup神器</a></p>    <p><img alt="一个千万量级的APP使用的一些第三方库" src="https://simg.open-open.com/show/981e05df3d0c85e4e6ca8bf51bbdd980.png"></p>    <p>swipeBackLayout.png</p>    <h3>7.<a href="/misc/goto?guid=4958964956476581901">okhttp</a> <a href="/misc/goto?guid=4958964956749751829">okio</a></h3>    <p>这个库也是square开源的一个网络请求库(okhttp内部依赖okio)。据说现在已被Google使用在Android源码上了,可见其强大。</p>    <p>这里有一个大神张鸿洋开源的okhttp封装库<a href="/misc/goto?guid=4958966287651011110">okhttp-utils</a></p>    <p>关于网络请求库,现在应该还有很多人在使用<a href="/misc/goto?guid=4958988891673756696">android-async-http</a>。他内部使用的是HttpClient,但是Google貌似在6.0版本里面删除了HttpClient相关API,可见这个库现在有点过时了。</p>    <p>不过我在android-async-http的官方Wiki上发现了这个:</p>    <p><img alt="一个千万量级的APP使用的一些第三方库" src="https://simg.open-open.com/show/5c09ab7ff4bc2e2d2323c781774a170f.png"></p>    <p>android-async-http_Wiki.png</p>    <h3>8.volley</h3>    <p>这个库也应该比较熟悉了,Google官方出的一个库,包含网络请求和图片加载缓存功能。在处理小而频繁的网络请求上有优势。</p>    <p>以前使用这个库一般都是添加第三方依赖,比如<a href="/misc/goto?guid=4958988894170670152">android-volley</a> 。现在已经有官方Gradle依赖了 。</p>    <blockquote>     <p>compile 'com.android.volley:volley:1.0.0'</p>    </blockquote>    <h3>9.<a href="/misc/goto?guid=4958988893073775819">PagerSlidingTagStrip</a></h3>    <blockquote>     <p>Interactive paging indicator widget, compatible with the ViewPager from the Android Support Library.</p>    </blockquote>    <p>这个库使用比较也比较广泛,实现ViewPage和顶部指示器联动滑动的效果。</p>    <p><img alt="一个千万量级的APP使用的一些第三方库" src="https://simg.open-open.com/show/8bf4094e44d0ad8c7f7fcc9758533fe8.png"></p>    <p>pagerSlidingTabStrip.png</p>    <h3>10.<a href="/misc/goto?guid=4958962583518373496">Android-PickerView</a></h3>    <blockquote>     <p>仿iOS的PickerView控件,有时间选择和选项选择并支持一二三级联动效果</p>    </blockquote>    <p>这个库的作者还有另外几个开源库也很不错的,有兴趣的可以点上面链接去他的github上看下。</p>    <p><img alt="一个千万量级的APP使用的一些第三方库" src="https://simg.open-open.com/show/cefb56049fc5c00378fe71f9cf5b2c8b.gif"></p>    <p>pickerdemo.gif</p>    <h3>11.<a href="/misc/goto?guid=4959647506714534417">packer-ng-plugin</a></h3>    <blockquote>     <p>下一代Android打包工具,1000个渠道包只需要5秒</p>    </blockquote>    <p>这个库的作者<a href="/misc/goto?guid=4959618257998485507">mcxiaoke</a>在下文还会出现的。</p>    <h3>12.<a href="/misc/goto?guid=4958532889080028088">NineOldAndroids</a></h3>    <blockquote>     <p>Android library for using the Honeycomb animation API on all versions of the platform back to 1.0!</p>     <p>NineOldAndroids is deprecated. No new development will be taking place. Existing versions will (of course) continue to function. New applications should use minSdkVersion="14" or higher which has access to the platform animation APIs.<br> Thanks for all your support!</p>    </blockquote>    <p>View的属性动画在Android API 11及其以后才支持,该库的作用就是让API 11以下的系统也能够正常的使用属性动画。不过该库作者Jake Wharton(是的,又是这位大神)认为现在APP支持的最低版本应该是4.0了,所以不再更新了。</p>    <h3>13.<a href="/misc/goto?guid=4958988896745342899">Logger</a></h3>    <blockquote>     <p>Simple, pretty and powerful logger for android</p>    </blockquote>    <p>像作者说的一样,简单,漂亮,强大的一款日志打印工具。</p>    <p><img alt="一个千万量级的APP使用的一些第三方库" src="https://simg.open-open.com/show/ab24ea00d992e6568da99b494ce750bc.png"></p>    <p>custom-tag.png</p>    <h3>14.<a href="/misc/goto?guid=4958873637166315610">materialish-progress</a></h3>    <blockquote>     <p>A material style progress wheel compatible with 2.3</p>    </blockquote>    <p><img alt="一个千万量级的APP使用的一些第三方库" src="https://simg.open-open.com/show/4d6e9d0c60603ee6722f5f5355ada451.gif"></p>    <p>spinningwheel.gif</p>    <h3>15.<a href="http://www.qiniu.com/?utm_campaign=baiduSEM&utm_source=baiduSEM&utm_medium=baiduSEM&utm_content=baiduSEM">七牛</a></h3>    <blockquote>     <p>七牛云存储,是专为移动时代开发者打造的数据管理平台,为互联网网站和移动App提供数据的在线托管、传输加速以及图片、音视频等富媒体的云处理服务。(来自百度百科)</p>    </blockquote>    <p>说到数据管理平台,我就会忍不住想到<a href="/misc/goto?guid=4958985221406502081">leancloud</a>,大学那会弄毕设有使用到它,文档对开发者非常友好,一直印象很深刻。</p>    <h3>16.<a href="/misc/goto?guid=4959675444136528205">shareSDK</a></h3>    <blockquote>     <p>ShareSDK是为iOS、Android的App提供社会化功能的一个组件,帮助开发者实现社会化分享、登录、关注、获得用户资料、获取好友列表等主流的社会化功能。</p>    </blockquote>    <h3>17.<a href="/misc/goto?guid=4959675444209425540">友盟+</a></h3>    <p>这里应该是用到了友盟的数据统计分析服务以及自动更新服务,不过要注意的是自动更新服务官方已经发声明表示停止新注册的APP和当前不再使用该功能的APP接入这项服务,已经在使用的在2016年10月15日之后也要停止服务了。</p>    <h3>18.<a href="/misc/goto?guid=4958973309849554310">ViewPagerIndicator</a></h3>    <blockquote>     <p>Paging indicator widgets compatible with the ViewPager from the Android Support Library and ActionBarSherlock.</p>    </blockquote>    <p>这个库的作者是Jake Wharton(没看错,还是这位大神),功能和上面介绍的PagerSlidingTagStrip类似,一般与viewpager组合使用。<a href="/misc/goto?guid=4959675444318205567">用法看这里</a></p>    <p><img alt="一个千万量级的APP使用的一些第三方库" src="https://simg.open-open.com/show/95f271009985c7092e86fcbd35157f6a.png"></p>    <p>viewPagerIndicator.png</p>    <h3>19.<a href="/misc/goto?guid=4958964958419303044">小米推送</a></h3>    <blockquote>     <p>小米推送服务支持所有Android平台,在MIUI上属于系统服务框架,共享系统级长连接。</p>    </blockquote>    <p>共享系统级连接可以这么理解,理论上不管应用是否在后台运行,只要有网,就能收到推送。这个应该是此APP选择小米推送的重要原因。在MIUI系统上,相比其它第三方推送有先天优势。</p>    <h3>20.<a href="/misc/goto?guid=4958848077537610631">greenDAO </a></h3>    <blockquote>     <p>greenDAO is a light & fast ORM solution for Android that maps objects to SQLite databases. Being highly optimized for Android, greenDAO offers great performance and consumes minimal memory.</p>    </blockquote>    <p>在所有将对象映射到 SQLite 数据库中的 ORM 库中,greenDAO 在性能方面占很大优势。而且文档也很详细。</p>    <p>不过最近有一个比较火的跨平台移动数据库引擎<a href="/misc/goto?guid=4958838689566194388">realm</a>,支持iOS、OS X(Objective-C和Swift)以及Android。性能比原生的SQLite还要好。目标是要取代SQLite。可以多关注下。</p>    <blockquote>     <p>Realm is a mobile database: a replacement for Core Data & SQLite</p>    </blockquote>    <h3>21.<a href="/misc/goto?guid=4958988894635463570">CircleImageView</a></h3>    <p>一个使用很广泛的圆形图片库</p>    <p><img alt="一个千万量级的APP使用的一些第三方库" src="https://simg.open-open.com/show/93e445eb3f676867cad6c2212bd25d63.png"></p>    <p>CircleImageView.png</p>    <h3>22.<a href="/misc/goto?guid=4958988895905980717">Crouton</a></h3>    <blockquote>     <p>I won't do any active development for Crouton any more. But I still do accept pull requests that fix bugs.<br> So long, and thanks for all the forks.</p>    </blockquote>    <p>这个库功能类似于SnackBar,因为官方已经出了SnackBar,所以作者停止了继续更新这个库。</p>    <p>关于SnackBar的用法 <a href="/misc/goto?guid=4959675444545338000">看这里</a></p>    <h3>23.<a href="/misc/goto?guid=4959554926086695129">BarcodeScanner</a></h3>    <blockquote>     <p>Android library projects that provides easy to use and extensible Barcode Scanner views based on ZXing and ZBar.<br> 一个基于ZXing和ZBar的容易使用和扩展的条形码扫描库</p>    </blockquote>    <p><img alt="一个千万量级的APP使用的一些第三方库" src="https://simg.open-open.com/show/a43b831122799565d3df03d911ad36d1.png"></p>    <p>scanner.png</p>    <h3>24.<a href="/misc/goto?guid=4959675444664598788">Rxjava</a></h3>    <p>从去年开始,RxJava+的文章就一直在国内网站各种刷屏了,最近还看到有公司招聘直接要求熟悉使用RxJava+Retrofit+OkHttp3了,可见其受欢迎程度。虽然这个库的学习成本有点大,好在现在关于它的学习资料也很丰富。</p>    <p>很多RxJava的初学者应该都有看过<a href="/misc/goto?guid=4959661271204039500">扔物线</a>的这篇文章 <a href="/misc/goto?guid=4958969493732027215">给Android 开发者的 RxJava 详解</a>。<br> 还有上面提到的<a href="/misc/goto?guid=4959618257998485507">mcxiaoke</a>组织翻译的文档<a href="/misc/goto?guid=4959675444813511648">ReactiveX/RxJava文档中文版</a>。</p>    <h3>25.<a href="/misc/goto?guid=4958822867993187894">PhotoView</a></h3>    <blockquote>     <p>Implementation of ImageView for Android that supports zooming, by various touch gestures.</p>    </blockquote>    <p>支持通过各种手势来缩放图片的一个库,现在很多的APP内都有使用到这个库,很受欢迎。</p>    <h2>最后</h2>    <p>以上就是这个优秀的APP内使用到的绝大部分第三方库了。希望对各位有帮助!<br> 要是喜欢的话,就点个赞鼓励下哈~<br> 最后也感谢一下这个APP的开发者们!</p>    <p><br> <a href="/misc/goto?guid=4959675444925790012">阅读原文</a></p>    <p> </p>