前言

看到很多人提问非科班该如何学习编程,其实科班也基本靠自学。有句话叫“师傅领进门修行靠个人”,再厉害的老师能教你的东西都是很有限的,真正的修行还是要靠自己。博主本科是数学专业,虽研究生是计算机专业,但研究生往往是做研究工作(偏学术型研究),编程只是工具,可能很多时候Matlab就搞定了基本需求,再或许用一些科研型仿真软件就可完成课题研究中涉及的编程模块,学业上不太需要很多编程。

我的学习总结

关于编程(比如Java)完全是靠挤时间自学的,而Android则更是参加工作后才开始自己倒腾。不少人认为我学习能力强、博客产出高,是如何做到的? 一份兴趣 + 一份坚持,很简单,只是把大家用来娱乐、游戏等闲散时间,挤出来用于学习技术、写博客而已。

如何高效学Android?

关于如何学习Android系统, 这就好比读书, 是经由一个由薄读厚,再由厚读薄的过程. 前者是指刚接触一个新领域, 知之甚少,开始不断努力钻研探索, 慢慢地随着时间地积累, 当你会发现自己钻研得越来越多, 自己掌握得知识体系非常庞大, 但当遇到一个新问题需要从大脑检索很久,甚至需要重新review一下曾经看过的已知东西, 那么说明自己以完成了”由薄读厚”;

接下来, 需要进行一个”由厚读薄”的过程, 用程序员都能理解的一个词就是知识归纳与建立索引的过程, 通过思考将所有相关联的知识 整理到一起, 形成自己大脑体系的完整知识目录.进而你会发现自己大脑里面留下得便是整个知识架构, 架构里面的每一层只要拉开抽屉就能取出所有完整的知识点. 到此,我觉得才是完成一个知识的学习的过程.

接下来从基础篇和高级篇两个层次来说说如何学习Android, 在学习过程中所读过的部分较经典的一些书籍才推荐给大家。
我的【GitHub】里有进阶技能脑图,500多个详细分支知识点,由于图片清晰度问题可以查看我的GitHub!

一. Java篇

Java是Android的语言基础,建议初学者一定要先学习Java基本知识,进而再学习Android,循序渐进,只有扎实的基础才能建造牢固的上层建筑。

当然,这里说的要有一定Java基础,而并非让大家上来先精通Java。作为Android开发者来说,完全没有必要一开始都对Java理解得那么深,只有要看过一两本Java基本书,掌握Java面向对象的思想的核心要义即万物皆为对象,掌握Java基本语法,基本就可以开启Android的学习之路。在后续对Android也有一定理解后,如遇不懂可再回过头看看Java高级知识点,慢慢地同步提升Java和Android水平。

Java书籍

Java虚拟机,这是作为进阶Java高手必需有所了解:

有朋友私信我觉着这个java书难度有点高,可能是本人在看Java书籍之前,还看过些许C和C++的入门书的缘故,所以看的第一本书《Java编程思想》。如果你真的是零基础,第一次接触编程,想以Java作为自己的入门语言,那么你可以先看看《Java语言程序设计》(基础篇) 或者《Java从入门到精通》,作为初学者要先掌握Java基本语法,平时遇到不熟悉的方法,多查看API文档即可,慢慢地就熟悉了。

为了方便小白或者正在准备进阶的Android开发者更好的学习,我把文中提到的网上能收集整理的资料,书籍都分享在我的【GitHub】里面,需要系统Android进阶学习资料可以自行领取收藏!

二、Android基础篇

**高效看书的姿态:**学习过程会需要看书,网上一搜,往往会有一大推的书推荐给大家去阅读,面对这么多书,该如何选择,如何阅读的呢,对于同一个层级的书籍选择一本精读,其余的粗读、略读即可,大同小异,对于精读书籍需要反复的阅读。

2.1 入门级别

有了一定的Java基础(不需要精通Java),就可以开始入门Android。建议初学Android者,一定要先搭建自己的开发环境,先准备jdk和Android Studio环境,现在就不要再用Eclipse了,对于Android开发者来说过时。在看书的过程一边看知识点一边写着示例程序,一来加深印象,二来提高动手能力。

Android基本书籍,只需一两本即可,没有必要看太多基础书籍,不同能力就该有不同层级的追求,这里就不再介绍其他基础书籍。 另外,Android开发过程中总是需要各种开发环境、工具的下载,再这里推荐一个不错的网站 AndroidDevTools.cn,收集整理了 Android开发、设计等相关的各种工具大集合,非常全面,而且速度也不错哦,最重要的不用翻墙就可下载到最新的工具。

有朋友好奇私信我是否即将要出书了,目前没有相关计划,自觉能力尚不及很多前辈,还需加深内功修为,将更多的知识写成文章来分享大家。

2.2 一手资料

何为Android一手资料?那就是Google官方给出的资料,这里往往是英文版的,营养价值极高。其实只要英文还可以(不行就是在线翻译工具)+翻墙工具,强烈建议你直接看Android官网的资料,千万别被英语所吓倒,因为很多专业名称,大家一看就明白比如Activity/Service/Thread等这些代码名称本身就是英语,剩下的都是较基础语法,不懂可以随时翻译,我一般都是用Chrome浏览器+Google翻译插件,哪里不会点哪里,妈妈再也不用担心我的英语了。

言归正传,如果你能看完并理解以下内容,那么你完全可以没有必要再看前面介绍的书籍,并且对于Android已有相当熟悉。

  • developer.android.com:Android开发官网,下面列举常用的资料:

    • Android training:Android培训文档;相应地,国内有一个中文翻译文档Android培训课程中文版;
    • Android API指南:Android组件、Manifest配置文件,动画/图像等相关介绍;
    • Android Tools:性能、测试、Android Studio等各种工具说明文档;
    • source.android.com:介绍Android开源码相关的内容;
  • Android Performance Patterns:2015年Google陆续在Youtube上发布的Android性能优化的视频,目前已更新第4季。
    • 国内Google组织在优酷上发布了相应的中文视频 (中文)Android 性能模式 第四季;
    • 对官方视频进行翻译并整理:Android性能优化典范中文版文档;
  • android-developers.googleblog.com:Android官方博客,有一些比较不错的feature,博客会第一时间呈现。

2.3 开源资源

到这里,那么你已经具备开发App的本领。平时需要自己动手多写写App,另外就是看看别人优秀的App是如何写的,下面列举一些开源库、工具以及App:

此处本文提及的网址与博客,当然还有很多优秀的博客和网站值得推荐,这里就不一一介绍。

三、Android高级篇

作为程序员,不去阅读源码,仅仅看API文档,只是浮于表象,这是远远不够的。真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读Andoid系统源码,也包括阅读各种优秀的开源库。

如果想成为Android系统工程师,那么阅读Android系统源码便是必修课。

如果想成为高级App开发工程师,那么阅读Android系统源码算是选修课,阅读一些优秀的开源框架库算是必修课。

如果你是刚刚入门,建议先打好基础,千万不要一上看源码,一来看得费劲,二来你可能在代码间来回跳转,可能会迷失在某一个环节,更甚是理解错误,记住一定要循序渐进。

3.1 阅读源码的重要性

借用Linux之父Linus Torvalds的一句名言:Read the fucking source code。不管是阅读Andoid系统源码还是优秀的开源框架,对能力那都会有一个很大提升;首先,能学习到优秀的代码风格和设计思想;其次,能真正做到“知其然,还知其所以然”;最后,能指导自己更加灵活的使用API,能更加快速地找到系统bug的根源。

3.2 阅读源码的准备

  1. Java基础:上层framework以及App层都是采用Java语法;
  2. C/C++基础:Android的jni/native层代码采用C++,Linux 采用C;
  3. Linux内核:Android内核基于Linux的,了解Linux相关知识对深入掌握Android还是很有必要。
  4. Git工具:Android源码采用git和repo进行管理;
  5. Make:Android源码采用Make系统编译,源码系统中会看到很多Android.mk之类的文件;
  6. Source Insight:这绝对是看源码的神器;可以在Java、C++、C代码之间无缝衔接;
  7. Android Studio:这是Google官方支持的App开发环境,另外,能方便地阅读framework Java层面的系统源码。
  8. Atom: 是Github推出的开源文本编辑器,支持linux、window等多平台,可能不是最好用的,但我已习惯Atom.
  9. Google Drawings:这是画图工具,Gityuan博客中的文章都是采用Google Drawing完成,比如Binder开篇文中的图。
  10. StarUML:这是类图,Gityuan博客文章的类图和流程图都是采用StarUML完成,比如理解Android进程创建流程文中时序图。

3.3 阅读源码的姿态

阅读源码绝不是从源码工程按顺序一个个的文件,从首行看到尾行。正确而高效地阅读源码的姿态应该是以某一个主线为起点,从上层往底层,不断地追溯,在各个模块、文件、方法之间来回跳转,反复地阅读,理清整个流程的逻辑。同时带着思考去看源码,尝试去揣测作者的用意,去理解代码的精妙之处,去思考代码可能存在的缺陷,去总结优秀的代码设计思想。下面说说我在阅读Android源码过程常涉及的库。

阅读Android源码:

如下以Android系统启动为主线,展开一系列的文章Android开篇中的流程图,在公司内部分享时我曾多次以下图为流程,来阐述Android架构,如下图:

点击查看大图

Android系统源码

android.googlesource.com:Google官方源码,国内无法直接访问,需要翻墙,对于一个程序员来说具备翻墙的能力是有必要的。Android源码中包含的库非常之多,下面列举我在看Android源码过程中涉及较多,也是比较常看的一些库:

另外,对于无法翻墙的朋友来说,还可以通过上Github通过 Android主页 下载Android源码,这些都是定时从Google官方源码的镜像同步而来的。还可以从androidxref来直接查看Android系统源码。

3.4 优秀资源

牛顿曾说过:“如果我看得更远一点的话,是因为我站在巨人的肩膀上”,这句话很具有实用价值,看完前面的介绍,你千万不要一上来就一头扎进源码的世界,小心你会进入二次元世界,处于混沌状态,最后崩溃乃至放弃求知之路,一定要合理利用现有的优秀资源。

Android 系统源码分析:邓凡平和罗升阳都是我的好朋友,对于Android方面的理解有着很多共通之处,下面推荐给大家。

  • Innost的专栏

    • 邓凡平前辈所写博客,条例有序,覆盖了Android系统大部分内容;
    • 《深入理解Android》 (卷I,卷II,卷III)
  • 老罗的Android之旅
    • 罗升阳前辈所写博客,从各个层面介绍Android系统;
    • 《Android系统源代码情景分析 》
  • Gityuan源码分析
    • 前面两位的博客基于Android 2.x或4.x,目前Android已发展到Android 6.0。不管Android如何变化,核心思维变化并不大,两位前辈的博客还是值得学习和参考的地方。但是Android经过几个大版本迭代,无论是从代码结构还是整体逻辑仍有很多变化。故博主(Gityuan)撰写了Android 6.0源码系列的博文。

3.5 进阶书籍

前4本书都是关于Linux,如果你不是需要从事Linux相关开发,只想提升对Android整体的理解,那么只需看一到两本,对Linux的进程、内存、IO以及驱动有所了解,对CPU调度、进程间通信有所熟悉就基本可以。另外,优秀的书还有很多,这里只介绍/列举我看过的书,目前还在看一些优秀的书,后续再更新。

**需要再次强调一下,**此处高级篇更主要的是针对系统工程师,对于android开发高级工程师的修炼之路,只需要掌握其中一部分即可,更核心的重点还是在app层面的知识。

四、复习知识

工作这么久要重新再去面试肯定是要将自己的知识储备重新拿出来,要把各个知识点复习到位,需要通过各个方式,选择自己最习惯的。无论是读电子书籍还是观看视频都是可以的,但要记得做好自己的学习笔记,能够起到总结的作用,再去复习起来就特别清晰了。

每个知识点都有左侧导航书签页,看的时候十分方便,需要的记得帮忙点赞评论支持一下,评论区,评论【666】即可来获取下面的大厂Android面试解析+技术知识点笔记”锦集了

4.1 Android快速面试指南

4.2 Android从入门到架构成长笔记

就拿我们移动开发人员来说,从初级程序员进阶到高级程序员,从初级架构师到资深架构师,应该如何构建自己的知识体系,成为移动架构师需要掌握哪些技能?

13年java转Android开发,在小厂待过,也去过华为,百度等,去年四月份辞职现在进了字节跳动。等大厂待过也面试过很多人。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

我们今年整理了一份阿里P8级别的Android架构师全套学习资料,特别适合有3-5年以上经验的小伙伴深入学习提升。

主要包括腾讯,以及字节跳动,华为,小米,等一线互联网公司主流架构技术。如果你有需要,拿走记得刷不要收藏夹里吃灰。

点击我的:【GitHub】免费领取Android高级教程和面试题PDF;需要的点击查看自行下载保存!

4.3 Android从入门到精通逆向学习视频

推荐一个B站up主,里面有Android系列学习视频,专题分类!
【实战MVVM和Jetpack的完美结合让页面开发不再烦恼】
【1.什么是插件化】
【2.插件化能解决的问题及与组件化的区别】
【3.常用插件化框架对比】
.
.
.
【13.手写实现插件的资源加载】

五、其他

5.1 开发书籍推荐

如果还想看更多关于开发书籍的推荐, 可以看看diycode发起的,由一群社区较活跃的Android人士(包括Gityuan在内)一起共同撰写的Android开发书籍推荐。

5.2 解决问题的方式

遇到问题,一定要先尝试自己解决,实在解决不了再请教他人。这是对自己的一个锻炼,也是对他人的一个尊重,可以有多种途径自行尝试解决:

另外,有空可以多逛逛github,多看看Google官方文档,多关注社区,定会收获不少;

5.3 番外篇

最后,再说说关于学习编程的番外篇:

如何系统由高效的自学Android,字节大牛如实说道,记住这几个点超越90%的Android开发者相关推荐

  1. 字节大牛耗时八个月又一力作,详细的Android学习指南

    开头 互联网时代的到来,让我们获取知识变得更加简单,理论上讲只要你想学,便会有不尽的知识等你,只要方法得当,够努力,任何人都可以都有可能成为大牛. 自己在努力的基础上,还学习了一些高效的学习方法,让我 ...

  2. 字节跳动Android开发大牛:90% 成功率的 BATZ Offer 收割机是怎样练成的!

    都说今年的形势不好,各种找工作不顺利,但我身边就有一位同学,每次面试都拿到了offer,我特意邀请他来给大家分享下经验,虽然不同人的技术领域未必相同,但很多东西是相通的,希望本文能对大家有所帮助. 前 ...

  3. Android 字节码插桩全流程解析

    在Android进阶宝典 – Handler应用于线上卡顿监控中,我简单介绍了一下关于ASM实现字节码插桩来实现方法耗时的监控,但是当时只是找了一个特定的class文件,针对某个特定的方法进行插桩,但 ...

  4. 阿里P7大牛手把手教你!一眼就能看懂的Android自学手册,真香!

    前言 曾听过很多人说Android学习很简单,做个App就上手了,工作机会多,毕业后也比较容易找工作.这种观点可能是很多Android开发者最开始入行的原因之一. 在工作初期,工作主要是按照业务需求实 ...

  5. 字节大牛教你手撕Android学习,灵魂拷问

    背景 知乎客户端中有一个自己维护的 Hybrid 框架,在此基础上开发了一些 Hybrid 页面,当需要前端或者客户端开发接口的时候,就涉及到联调的问题. 和一般的 前端 <=> 服务端, ...

  6. Android字节跳动一面,被面试官吊打

    缘起 最近看到很多准备春招的童靴,面试被各种吊打.除了提升专业技术水平外.程序员招聘校招相关的注意事项也是大家需要熟悉的. 像下面这位同学,分享自己Android字节跳动一面,被面试官吊打! 实习项目 ...

  7. android 字节码指令集,进入Android Dalvik虚拟机之Dalvik指令集

    1. 指令特点 Dalvik指定在调用格式上模仿了C语言的调用约定.Dalvik指令的语法与助词符有如下特点: 参数采用从目标(destination)到源(source)的方式. 根据字节码的大小与 ...

  8. 【Java 虚拟机原理】动态字节码技术 | Dalvik ART 虚拟机 | Android 字节码打包过程

    文章目录 一.动态字节码技术 二.Dalvik & ART 虚拟机 三.Android 字节码打包过程 总结 一.动态字节码技术 动态字节码技术 就是在 运行时 , 动态修改 Class 字节 ...

  9. Android字节码插桩

    什么是字节码插桩 字节码插桩就是在构建的过程中,通过修改已经编译完成的字节码文件,也就是class文件,来实现功能的添加. 简单来讲,我们要实现无埋点对客户端的全量统计.这里的统计概括的范围比较广泛, ...

最新文章

  1. 编译-链接-运行-环境配置各种error汇总
  2. 媲美光纤!WiFi传输速度已可达100Gbps
  3. python可以干嘛知乎-一行Python代码能做什么?
  4. Rxjs takeWhile 和 filter 操作符的区别
  5. 前端学习(3297):effect的使用
  6. 6内置数据结构_set
  7. python3.5.2安装pygame_#Python3.6.2(32位) pip安装 和 pygame 环境配置
  8. 【elasticsearch】elasticsearch 精确匹配 与 全文搜索
  9. 随想录(easyx中的键盘输入和鼠标消息)
  10. linux的poll_wait函数,select() 与 poll()两个函数接口的作用
  11. Deep Learning学习随记(二)Vectorized、PCA和Whitening
  12. PicoDet网络结构在YOLOv5-Lite上的复现
  13. 结队编程之——阅读分析队友的代码(C++自动生成数学试卷)
  14. # 研究杂感 × VOSviewer(第一辑)
  15. 使用cloudcompare测量平面之间的距离
  16. JAVA 通过wContour和geotools实现等值面分析、裁切、出图
  17. 腕管综合征(鼠标手)的康复之路
  18. Dijskra迪杰斯特拉算法
  19. 433MHz通信 发F115 收SYN480R
  20. mysql locate用法,LOCATE()函数如何与MySQL WHERE子句一起使用?

热门文章

  1. 2017php免杀大马,cs 免杀 payload 绕过 360 全家桶
  2. 9微电网两阶段鲁棒优化经济调度方法(MATLAB程序)
  3. 整理:console的用法
  4. 在写论文的参考文献时,有的段落空格很大,有的段落则正常,原因及解决方法(wps)
  5. matlab中liccode函数,基于matlab车牌识别系统设计与实现(最终版)
  6. TeX/LaTeX 常用宏包
  7. 【ArcGIS微课1000例】0035:地图面状符号设计教程
  8. 环链电动葫芦出现下滑怎么办
  9. cocos2d-iphone之魔塔20层第五部分
  10. 【AD封装】芯片IC封装-QFP,TQFP,LQFP(带3D)