跟Android初学者分享几点经验:该如何自学Android开发?-程序员宅基地

技术标签: 2024年程序员学习  android  

2.1 阅读源码的重要性

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

2.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. Eclipse:熟悉常用快捷键,工欲善其事必先利其器;虽然Source Insight很方便,但由于对Eclipse的熟悉感,对于framework Java层面的代码,我还是更习惯用Eclipse来看,对于Native代码以及linux代码则采用Source Insight来看;
8. Android Studio:这是Google官方支持的App开发环境,关于Android Studiod使用教程;
9. Google Drawings:这是画图工具。
10. StarUML:这是类图工具。

2.3 阅读源码的姿态

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

阅读Android源码:

下面是我以Android开机过程为主线,展开一系列的文章 Android开篇中的一副流程图,在公司内部分享时我曾多次以下图为流程整个Android架构,如下图:

Android系统源码

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

• android/platform/packages/apps:Android自带的app,比如Email,Camera, Music等,对于应用开发工程师主要关注的目录;
• android/platform/frameworks/base: Java framework,这是framework工程师看得最多的目录;
• android/platform/frameworks/native:Native framework;
• android/platform/art:Art虚拟机;
• android/kernel/common:Android内核,这是驱动工程师最关注的模块;
• android/platform/system/core:核心系统;
• android/platform/libcore:平台的lib库;

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

2.4 优秀资源

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

Android 系统源码分析

• Innost的专栏

邓凡平前辈所写博客,条例有序,覆盖了Android系统大部分内容;

《深入理解Android》 (卷I,卷II,卷III)

• 老罗的Android之旅

罗升阳前辈所写博客,从各个层面介绍Android系统;

《Android系统源代码情景分析 》

对于邓凡平和罗升阳两位前辈的博客基于Android 2.x或4.x,目前Android已发展到Android 6.0。不管Android如何变化,其核心思维变化并没有很大,所以两位前辈的博客还是很有值得学习和参考的地方。

2.5 进阶书籍

• 深入理解Linux内核
• 深入Linux内核架构
• Linux内核设计与实现
• Linux设备驱动程序
• 重构 改善既有代码的设计
• 编程珠玑 (卷1, 卷2)
• 设计模式
• 设计模式之禅
• 人月神话

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

三、有效的学习经验分享

一、看Android开发视频:我刚开始接触android的时候,主要是跟着网上Android开发视频入的门,自己跟着一点一点的敲代码,就这样算是简单的入门,现在在电驴上面有很多的视频资源,记得很多前辈说过类似的话:学技术,有Google和电驴足够了。(呵呵,可能自己是太懒了,看视频可能是最容易的了,但是也很费时间)。认识一个高手,说从来不看什么视频,用到什么时候找什么资料,个人感觉这样效率可能高些。

二、看Android开发书:在论坛上面经常看到,初学者到处问,学android有什么好书?我买的第一本Android书是杨丰盛老师的《android应用开发揭秘》,个人感觉不错,当然自己也看了不少android书籍的电子版,发现入门级书都差不多,都是简单介绍下概念,然后给你一个小例子,个人建议是:如果想买哪本书,先在网上找下这些书的评论,看看别人的评价,这样可能能使你少花些冤枉钱。

三、写代码:想学好一个技术,这一点必不可少,一定要自己动手写。。。

四、看代码:多看别人的代码,多学习下别人的设计思路,其实学习最好的教材就是android的源代码了,看看那些大牛们的设计思路和设计方法。在Android sdk文件夹下的samples文件夹里面有很多的常用控件的demo,看了你会发现,活动入门级书和视频里面的demo,都是从samples里面的demo做了个简单的修改。

五、提问:有那么多的好的论坛,还有那么多的开发群,但是遇到问题先不要着急提问,自己先想办法解决,去google上搜一下,或者对比下你的代码和你参照的代码,找下问题根源,然后自己尝试下修改,实在解决不了再去问别人,同时提醒一句,提问的时候请语气谦逊些,毕竟别人不欠你。

六、看Log:一定要学会看log,因为很多时候,log会把你的错误信息很详细的显现给你,同时,会把出现问题的代码提示给你,很方便解决问题。

**七、写blog:**可以把自己遇到的问题,解决方法等,用blog记录下来,写出来,可能更能加深你对技术的理解,同时,别人遇到同样问题的时候,也可以从你的blog上面寻求到帮助,不要太自私,it行业就是个开放的行业,分享才快乐。

**八、逛论坛,看博客:**多去技术性论坛逛逛,多看看Android大牛们的博客,会学到很多。

九、兴趣:兴趣是最好的老师,别太急功近利,沉下心,以前看过一名著名黑客一句话:学好一门技术,一台计算机,网络和塞满冰箱的披萨就够了。

这九条经验不一定对你都适用,但你可以试试自己感兴趣的,肯定会对你有所帮助。

四、其他

最后,再说说关于学习Android开发的番外篇:

• 好奇心比雄心走得更远:很多人对未来空有满腔的雄心壮志,往往不如对技术要有一份好奇心,一份探索欲,再加上一份执着的人。

• 要有open的心态:曾经的我也只是把自己的所思所得都放入自己的云笔记,很少整理,这其实不利于技术发展,有空应该多整理自己零散的知识点,觉得不错的点可以拿出来写成博客,那是对能力的又一层提升。另外,在低头做技术的同时,还应该有空抬头看世界,不能闭门造车。

  • 天道酬勤:学历只能代表过去,能力代表现在,潜力代表未来! 你不把自己逼一把,你压根不知道自己有多优秀,只要努力去学习,去挖掘潜力,进而提升自我技术修为,未来不再是梦!共勉之!

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

  • 百度一下,很多时候还是能有所帮助的,不要过分强调google,完全抛弃百度,毕竟中文看起来比较快;

  • 先中文关键词google一下;再英文关键词google一下;

  • stackoverflow.com、知乎等技术问答网站内直接搜索;

  • 查看官方文档;

  • 如果有源码,尝试直接看源码,看能否解决;

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

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

写在最后

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从哪里入手去学习,对此我整理了一些资料

如果你熟练掌握以下列出的知识点,相信将会大大增加你通过前两轮技术面试的几率!这些内容都供大家参考,互相学习。

①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包,最后觉得有帮助、有需要的朋友可以点个赞

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img
63517381)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-WYa9fMIk-1712763517382)]

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/2401_83977385/article/details/137616102

智能推荐

Elasticsearch Java API 的使用(22)—实现桶聚合_es中聚合添加过滤条件 javaapi-程序员宅基地

文章浏览阅读2.3k次,点赞2次,收藏3次。分组聚合 使用terms时间分组集合public class EsTermsAgg throws UnknownHostException{ public void TermsAgg(TransportClient client){ AggregationBuilder agg = AggregationBuilders.terms("terms").field("ag..._es中聚合添加过滤条件 javaapi

SQL Server 2000常用命令_sql2000数据库检查命令-程序员宅基地

文章浏览阅读1.3k次。SQL Server 2000常用命令 (1) 数据记录筛选:sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]"sql="select * from 数据表 where 字段名 like '%字段值%' order by 字段名 [desc]"sql="select top 10 * from 数据表 where 字段名 order by 字段名 [desc]"sql="select _sql2000数据库检查命令

mininet,一个超级实用的 Python 库!-程序员宅基地

文章浏览阅读930次,点赞27次,收藏19次。Python Mininet是一个开源工具,用于创建、配置和仿真计算机网络。它允许用户在单个计算机上创建多个虚拟网络主机(Hosts)和交换机(Switches),并模拟它们之间的连接和通信。网络仿真:Mininet允许用户模拟网络中的实际数据流量,以测试和评估网络应用和协议的性能。这对于网络协议的开发和测试至关重要。自定义网络拓扑:Mininet提供了Python API,使用户能够以编程方式定义网络拓扑,包括主机、交换机、链路等。这意味着可以根据需要创建各种不同类型的网络。实验环境。

智慧旅游建设智能化景区管理系统方案_景区智慧管理系统方案-程序员宅基地

文章浏览阅读2.7k次。智慧旅游是应用新一代网络信息技术和装备,充分精确及时感知和应用各种旅游信息内容,进而完成旅游服务、旅游管理、旅游推广、旅游体验的智能化系统,推动旅游商圈向综合型和结合型转型发展提高,是旅客市场的需求与当代信息科技驱动旅游业自主创新发展的源动力和新发展趋势,是全方位提高旅游业发展水准、推动旅游业转型发展、提升旅游满意率的关键着力点,针对把旅游业建设成为人民大众更为满意的智能化服务行业,具备十分关键的实际意义。目前在我国的百分之八十的5A级景区能够在手机App和网上预订门票,占比创历史上新纪录。伴随着互联网_景区智慧管理系统方案

To display the conditions report re-run your application with ‘debug‘ enabled-程序员宅基地

文章浏览阅读7.2k次。SpringBoot初学者笔记当启动时遇到To display the conditions report re-run your application with ‘debug’ enabled.只需要在启动类上的注解@SpringBootApplication中加(exclude = {DataSourceAutoConfiguration.class})即可@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})_to display the conditions report re-run your application with 'debug' enable

编译器(Compiler)及c/c++编译器安装(c+安装)-程序员宅基地

文章浏览阅读6.4k次,点赞13次,收藏51次。文中主要讲述了常用编程语言的编译器的特点,GCC、MinGW、MinGW-w64 、TDM-GCC、Cygwin、MSYS、MSYS2的区别,MinGW-w64编译器套件下载及安装,安装后的环境变量配置(设置),编译器的运行及其与集成开发环境的关系、编译器的来源。_c++编译器

随便推点

bug: nerdtree 显示图标乱码-程序员宅基地

文章浏览阅读2.3k次。bug 复现。选择:nerd font解决原因是字体。droidsansmono nerd font book_nerdtree 显示图标

mitmproxy+Appium+安卓模拟器 抓取https请求失败的解决办法_安卓 mitmproxy证书有问题-程序员宅基地

文章浏览阅读1k次。最近学习爬虫时按照《python3 网络爬虫开发实战》步骤使用mitmproxy时,发现https请求无法抓取,部分app甚至一条请求都看不到。百度一手解决办法寥寥无几,实测并没有卵用。几天探索,发现问题还是出在证书上。 问题出现的原因:尽管可能你已经把证书导入手机,但是这始终是第三方证书,属于用户凭据。许多app都只信任系统证书,更有甚者只信任自带的证书。 解决办法:我们直接将第三方mitmproxy证书转为系统证书导入(需要ROOT权限)。 ..._安卓 mitmproxy证书有问题

如何在CSDN中免费下载资料_csdnvip文章怎么看不充vip-程序员宅基地

文章浏览阅读10w+次,点赞152次,收藏70次。如何在CSDN中免费下载资料下载积分攻略:1. 个人设置里进行手机绑定CSDN账户 奖励50分 (右上角设置-账户安全-手机绑定)2. 完成任务送若干分积分 http://task.csdn.net/3. 上传有效资源获取积分(上传非法,广告资源用户,将被扣除一定积分,严重者封号)。· 上传自己设分资源被下载,下载量×资源分,100分封顶。· 上传0分资源被下载,下载量×系统..._csdnvip文章怎么看不充vip

tron(波场)trc20离线签名广播交易(Java版本)_tron离线签名-程序员宅基地

文章浏览阅读4.6k次,点赞4次,收藏10次。前言由于在项目中需要,我们又为了节省服务器资源,决定不同步节点数据。也就说说,很多的一些API,我们是不能直接用的了,最直接的有创建地址、签名交易等等相关API修改地址生成TronUtils.java /** * 离线创建地址 * * @return */ public static Map<String, String> createAddress() { ECKey eCkey = new ECKey(random); String privateKey_tron离线签名

Altium Designer 20(AD20)新手小白详细教程-程序员宅基地

文章浏览阅读3.9w次,点赞90次,收藏651次。关于AD20的基础操作,小白可以学一学,方便操作_ad20

QML 基本类型_qml表示double-程序员宅基地

文章浏览阅读148次。QML 有许多基本类型,例如整型int或字符串类型string,这和 QML 对象类型形成对比,QML 对象类型是指具有属性、信号、方法等的对象,与对象类型不同的是,基本类型不能用于声明 QML 对象,例如不能声明 int{}对象或size{}对象。与对象类型的属性不同,基本类型的属性不提供它们自己的属性更改信号。相反,对象类型的属性发出它们自己的属性更改信号,并且仅在将属性重新分配给不同的对象值时才调用对象类型属性的属性更改信号处理程序。在 Qt 的全局对象提供有用的功能,用于操作基本类型的值。_qml表示double