从问题出发学习Android:android5.0水波纹适配引出的源码学习方法

<h5>偶然和朋友聊到一款app的button上长按出现水波纹特效,由于手机系统是android5.0的,所以估计这款app是使用5.0自带的<ripple></ripple>tag来实现的。这时候有两种途径来学习水波纹实现原理:

  1. google官方文档和博客。
  2. 找源码。
  • 第一种方法适合临时查找学习立即实践,特别是第一次碰到这个问题,马上解决。这里推荐两个chrome浏览器的插件:Android SDK SearchAndroid Resource Navigator。这两个插件需要科学上网下载。

Android SDK Search是快速查找官方api的渠道,在chrome地址栏输入ad按tab键可进入api搜索模式如图1:

《从问题出发学习Android:android5.0水波纹适配引出的源码学习方法》 图1 这里输入api关键字如ripple可以跳转到官方文档直接阅读,非常方便。

Android Resource Navigator是快速查找framework层源码的渠道,同样的,可以在chrome地址栏输入arn按tab键可以进入framework源码搜索源码如图2:

《从问题出发学习Android:android5.0水波纹适配引出的源码学习方法》 图2

这里输入framework源码文件名关键字可以跳转到github framework base源码页查找,非常实用。如果出现如图3的情况试点击左侧的code,这地方我被坑过。

《从问题出发学习Android:android5.0水波纹适配引出的源码学习方法》 图3

比如搜索drawable的结果:

《从问题出发学习Android:android5.0水波纹适配引出的源码学习方法》 图4

点左侧xml、java等缩小搜索范围。这样可以初步确定与ripple水波文有关的源码文件。

现在问题来了:如何确定<ripple>tab是哪个文件实现的?这时候就需要使用到google了,我搜索”android ripple 实现原理”,搜出了很多自定义控件实现水波文的文章,这种情况经常出现在一些新技术和旧技术有衔接的情况,因为5.0之前官方没出这个效果就有需求了。一般google列出的前几项总能找到你想要的。比如android ripple 实现原理我就在图5

《从问题出发学习Android:android5.0水波纹适配引出的源码学习方法》 图5

<h5>这篇文章里找到了ripple是RippleDrawable.java这个文件实现的,原理可以在图4java文件里找源码看。但是新的技术呢?特别是刚出还没有相关blog的情况。那只有用方法2了:找源码。

  • android源码下载是个大工程,而且涉及到科学上网和unix-like环境,这里我简单提几个建议:
    ①.有mac、linux或虚拟机装linux环境的请使用国内源,google源科学上网也慢。参考清华大学TUNA镜像源
    ②.实在需求windows环境获取android源码,repo的方法尝试过,因为官方提供的repo工具使用python调用了linux的函数fcntl,且调用对象F_GETFD这都是window环境下没有的,暂时没法解决。所以windows环境下请使用github源,选取需要的文件夹下载,一般和应用层有关的我们下载platforme_framework_base就够了,应用层本身源码android studio里有,这里不赘述。

阅读源码的工具,windows下可以使用InsightSources3十分强大的工具,Ubuntu、mac环境下可以使用vim+ctags+cscope或者SublimeText+ctags有需求的可以google,这都是长期系统阅读源码所必须的这里也不赘述了。
而在Ubuntu、mac环境下阅读源码有一个比较简单快速的方法,也是临时需要了解原理去阅读源码的渠道,windows安装cygwin、Cmder也可以使用:在确保完整下载android源码后命令行cd到源码所在目录例如/aosp输入

   source ./build/envsetup.sh

可以加载官方提供的一个工具,如图6

《从问题出发学习Android:android5.0水波纹适配引出的源码学习方法》 图6

这个工具本是拿来编译模块的,不过用来临时查找源码也行。命令行输入

  hmm

可以查询工具的命令如图7,有些版本是help,具体命令以envsetup.sh里第一个函数为主。

《从问题出发学习Android:android5.0水波纹适配引出的源码学习方法》 图7

这里我们可以看到,查找c/c++文件使用cgrep命令、java文件使用jgrep、res/*xml文件使用resgrep命令,在找到所需文件后“godir 文件名”例如我们找RippleDrawable.java

  godir RippleDrawable.java

会跳转到RippleDrawable.java所在的文件夹下,使用croot会返回/aosp文件夹,十分方便。

找到源码后,我们会遇到一个问题:如何快速在结果中定位所需要的源码。这里以查找水波纹官方实现原理为例,我们需要以ripple这关键字查找具体实现的源码这个过程中,我们首先需要了解android系统架构和对应的android源码的结构(图8):

《从问题出发学习Android:android5.0水波纹适配引出的源码学习方法》 图8

具体目录树点我

应用层开发基本和application layer 、application framwork两层打交道,我们会涉及到的源码目录:build、development、external、frameworks、packages。

  • build、development、external是一些工具和范例。
    • frameworks是框架层的源码,里面包含base这个核心框架库也就是前面在github上搜索的android_framwork_base,一些应用层的根源都能在这里找到
  • 我们在android studio里连接的SDK源码对应的就是frameworks/base/core/java这里面的java文件。
  • frameworks/base/docs就是离线文档,脱机环境下查文档可以用。
  • packages就是所谓的上层源码,原生app都可以在里面找到如何实现的,我们有些时候想直接调用系统的控件,在这里面xml表里找对应tag即可,这里不赘述。

回到我们的问题,在源码目录里查找与ripple相关的文件,根据上面的归纳我们可以排除与/framwrok/base、/packages这些目录无关的结果,先找xml文件,即系统调用ripple tag的文件,这是我们在不了解一个控件时所找的范例。如图9

《从问题出发学习Android:android5.0水波纹适配引出的源码学习方法》 图9

<h5>我们发现ripple tag出现在/res/drawable文件夹里的一个xml文件里,根据开发经验在这个xml一定有一个对应drawable java文件来实现他,于是乎我们在/framework/base/文件夹下找到了RippleDrawable,这也可以在android studio或前文里 Android SDK Search里直达官方文档或在docs里查。

以上提供了一个解决问题的思路,在面对浩瀚的android源码时如何以问题为线索解读它,具体问题具体分析。也为以后系统学习android源码打下基础。如果迷茫了,不妨想想问题是什么我要得到什么。

<h3>参考<h3>

  • <h5>源码相关:
  • 下载:

清华镜像源
github android
google 官方git源

  • 查询工具:

Linux 平台下阅读源码的工具链
Android SDK Search
Android Resource Navigator

  • 源码结构:

Android源码结构(目录树)
Android 源代码结构

  • <h5>ripple:
  • android res加载

Attr、Style和Theme详解
Android 资源加载机制详解
Android资源文件res的使用详解(strings,layout,drawable,arrays等)

  • ripple、RippleDrawable

AndroidStudyDemo之Android5.x新控件介绍(一)
android developer traning
RippleDrawable

    原文作者:打豆豆的不要
    原文地址: https://www.jianshu.com/p/c23cf6525532
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞