Android Support Library 编译过了!

到了2018年,作为Android开发者,倘若没看过一些Android源码,都不好意思说自己是Android工程师了吧?

之前一直是在GrepCode(http://grepcode.com/)上看的。这是一个相当老牌的Android源码在线查看网站。虽然上面缺少了近几个新版本的Android 源码,但胜在源码种类多,除了Android,还有其他软件的源码可以阅读;易上手,代码之间能相互索引,查看方法引用、继承关系、类的结构和跳转这些功能都很好用,还能方便在切换同一个文件的不同版本的源码。令人悲伤的是,它已经挂了好长一段时间了。: - (

另一个源码阅读网站AndroidXRef(http://androidxref.com/)也很老牌,但用的不多。这个网站专注于Android源码,从远古版本到最新版本都能在上面找到。功能够用,可以查看方法应用、类的结构和跳转这些。继承关系、版本间跳转这些就没有。目前还活着,只是受限于国内的网络环境,访问起来有点慢。

选择在线的方式阅读源码,主要是嫌麻烦。一来是不经常看,主要是查疑难bug的时候看;二来是不方便,Android 发展了十年,源码相当庞大,有十几个G之多,前几年尝试过clone,结果拉了几天才拉完;三来是编译环境不好配,官方的源码编译说明看着不多,实际操作没那么简单,之前的尝试都失败了;最后则是这两个在线查看代码的网站都能满足看代码的需求,也没编译的需求,也就一直这么过来了。

然而看源码最舒服的方式莫过于直接用IDE(如Android Studio),功能多,用起来顺手,而且还可以编辑。等等,编辑?还想改代码不成?并不是这样滴。架不住年纪大了,一些看过的源码慢慢的就遗忘了。俗话说好记性不如烂笔头,编辑的需求,也就是给源码加注释加批注罢了。如果仅仅是看代码的话,Android Studio通过SDK Manager下载Source Code就可以了。

需求变了,在线看源码的法子,就行不通了。真是应了那句话:天道好轮回,苍天绕过谁。不对,应该是躲得了初一躲不过十五,之前那些避开的麻烦,还是需要去面对的。

Clone Android Repository的全部源码,这辈子肯定是不可能的。近期想看的是Support Library的源码,所以我在程序员的网站GitHub上找到了AOSP-Mirror这个Organization,clone了一份support library (https://github.com/aosp-mirror/platform_frameworks_support)的源码。

拉代码的过程挺顺利,用Android Studio打开,完了,Gradle没法build过去。Build不通过就没生成索引,没索引就Android Studio就从IDE沦为普通编辑器,那些强大的功能全都用不上,还不如用understand。

好在,在某个风和日丽月黑风高的晚上,借着天时地利人和,通过命令行运行Gradle得到的错误输出,一点点地改各类.gradle文件,最终把Gradle Sync这一步搞定了。后面又精简了一下改动范围,然后把这些改动,push到了自己fork的 platform_frameworks_support项目的buildable分支里。有需要的可以到这里(https://github.com/SR1s/platform_frameworks_support/tree/buildable)自取。

改动的地方不多,涉及5个文件。改动的内容总结起来就是:

  1. 修改buildscript使用的maven库,引入了jcenter和google这两个公共的maven库
  2. 修改 dependencies 使用的maven库,引入了几个公共的maven库,去掉了源码里指向android源码工程里prebuilts文件夹的那几个maven库
  3. 去掉settings.gradle里配置的几个module,一类是外部module,即代码不在platform_frameworks_support里的module;另一类是依赖的这些外部module的module,这几个的代码现在不关心,所以先挪去它们在settings里的配置(源码还在)
  4. 修改gradle wrapper使用的gradle的下载地址,源码里指向的是本地,也就是android源码工程里防止prebuilts文件夹下的gradle的地址,这里改成网上公共的gradle版本的地址。

涉及的5个文件如下:

  1. buildSrc/build.gradle
  2. buildSrc/init.gradle
  3. buildSrc/repos.gradle
  4. gradle/wrapper/gradle-wrapper.properties
  5. settings.gradle
  1. build.gradle
    给buildscript添加了jcenter和google这两个maven库。源码里指向的是源码中的prebuilts目录,这个目录不在这个repo里,我去翻了翻,prebuilts目录里东西非常多,也就是很大,拉下来不现实,另外自己一个个单独下也不现实,还是直接用jcenter这类公共maven库方便。添加google的maven库是因为google现在把自家库往里放,没有发布在jcenter里了。(后面我试了下,不加google的这个maven库也是可以的)

  2. buildSrc/init.gradle
    这里改动一个是注释掉了enableDoclavaAndJDiff这个方法内的实现代码,这个是给project添加jdiff和doclava这两个依赖和配置,一个是diff工具,一个是文档工具,这两个依赖都是android源码里的其他工具的project,只是为了看代码,用不着这两个,注释掉也不影响。
    另一个就是去掉project.ext.androidJarprops.write这两句,前者把androidJar指向了prebuilts目录内的最新的android.jar,后者往local.properties文件里写入配置。前者去不去掉其实无所谓,不影响,后面那个因为会往local.properties写入android.dir的路径配置,从而覆盖掉ide内设置的android.dir,那个配置指向的是当前工程的父级目录,正常情况下,我们的sdk肯定不放哪里,因而build就找不到相关的工具出错了,所以要把这个写入注释掉,用Android Studio设置里的那个就行了。

  3. buildSrc/repos.gradle
    这个文件定义了一堆本机上的依赖库的地址,实际上就是android源码里的prebuilts目录内的一些具体的目录。地址都放在ext.repoNames这里,然后通过下面addMavenRepositories方法,给RepositoryHandler加上这些maven库。牢记我们没有prebuilts目录,这些maven库指向的地址自然也是无效的。因此这里再加了一句ext.repoNames = [],把列表重置成空列表,这样后面加这些maven库的代码就无效了。
    另一个是要让Repository能找到依赖。原来官方代码是让gradle去prebuilts下找,现在我们把这个配置去掉了,依赖也就找不到了(不去掉也找不到啊哈哈),那么就要跟之前对buildscript做的事情一样,加上公共库。刚好下面有个if语句,在符合条件下,会给Repository加外部maven库,所以就注释掉if判断,让内部的代码强制执行,也就自然加上了外部maven库,依赖就能被找到了。

  4. gradle/wrapper/gradle-wrapper.properties
    这个很简单,把wrapper依赖的gradle的下载的地址改成网络上的,之前的配置指向的是android repo的tools目录,再次的,我们没有这个。所以,改成从网络上可下载的地址:https://services.gradle.org/distributions/gradle-4.4-bin.zip

  5. settings.gradle
    这里做的事情简单概括起来就是:

  6. 去掉了项目里的support-emojisupport-emoji-bundledsupport-emoji-appcompatsupport-emoji-demos这几个module的定义,原因是它们或直接或间接的依赖了另一个不属于这个repo的noto-emoji-compatmodule,这块代码目前没想着去看,先不管。

  7. 去掉不属于这个repo的module的定义,分别是doclavajdiffnoto-emoji-compat这三个,他们的源码都在Android大项目的源码的external文件夹里,是在想引入这几个的,可以去down下来,然后配置。

相关的代码变更都在这个commit(https://github.com/SR1s/platform_frameworks_support/commit/a23529ad2ca019624af9213daf2836e78ce579a2)里,大家都是工程师,一看就懂。

终于可以好好看代码了,欧耶。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342