如何学习Android的源代码
做了1年2年的android app开发好多人觉得自己陷入了瓶颈期,这个时候感觉自己一般的app都可以开发出来,完成领导想要的功能,各种第三方库基本都熟练使用了,感觉没什么可学习的了,我也有过一段时间的迷茫,那时感觉各种app so easy,由于我做的项目对内存啊、流量啊、电量啊并不是特别关注,虽然我也会了解这方面的东西,可以感觉只要用户能正常使用app,多费点电也无所谓,内存高点只要不崩溃就好吧,其实我觉得这些和app多定位有直接关系,app或许在中高端手机没有问题,可在低端手机就无法使用,比如我做过一款app只要能在s7上跑就可以,因为设计到非常复杂的计算。但是有的app就要求非常严格,比如微信,如果没事就crash,流量很高,电量刷刷单跑,我想很多人就会卸载了它,然后另一个微信就诞生了,哈哈跑题了,拽回来,其实这段迷茫期我们很多人都想学习源代码来提高自己的技术,可一看那么庞大的代码就蒙了,而且涉及到技术太多了,不知道从何入手,查了很多文档和这方面的书籍,大部分都是介绍都是偏底层的,甚至要先看看linux方面的书籍,我一个app开发真的需要了解这些吗?我想如果你是一个开发系统的,那就需要了,而我至少目前是不需要的。
那么对于我们一个普通的app开发者需要怎么学习呢?我们先来看下整个Android的框架图:
从上往下看:
System Apps (系统应用)
Android本身自带的一套核心应用,比如相机、邮件、蓝牙等,这些app和我们开发的app一样。国内很多手机厂商都做了自己的核心app,比如小米、华为等。
Java API Fragmework
包含整个Android功能集,我们app开发就是在这个基础上开发的,这部分包含了View、Services等。
Native C/C++ Libraries
许多核心 Android 系统组件和服务(例如 ART 和 HAL)构建自原生代码,需要以 C 和 C++ 编写的原生库,我们所说的JNI(NDK)开发就是这部分。我们经常把一些核心算法这里写,主要有以下几个原因:
- 安全:相对来说这部分不容易被反编译,毕竟懂c++的android开发者相对少一些。
- 效率高:c++要比java效率高。
- 很多算法库是c++写的,我们可以直接用。
Android Runtime
官方给的解释是:
对于运行 Android 5.0(API 级别 21)或更高版本的设备,每个应用都在其自己的进程中运行,并且有其自己的 Android Runtime (ART) 实例。ART 编写为通过执行 DEX 文件在低内存设备上运行多个虚拟机,DEX 文件是一种专为 Android 设计的字节码格式,经过优化,使用的内存很少。编译工具链(例如 Jack)将 Java 源代码编译为 DEX 字节码,使其可在 Android 平台上运行。ART 的部分主要功能包括:
- 预先 (AOT) 和即时 (JIT) 编译
- 优化的垃圾回收 (GC)
- 更好的调试支持,包括专用采样分析器、详细的诊断异常和崩溃报告,并且能够设置监视点以监控特定字段
在 Android 版本 5.0(API 级别 21)之前,Dalvik 是 Android Runtime。如果您的应用在 ART 上运行效果很好,那么它应该也可在 Dalvik 上运行,但反过来不一定。
Android 还包含一套核心运行时库,可提供 Java API 框架使用的 Java 编程语言大部分功能,包括一些 Java 8 语言功能。
硬件抽象层 (HAL)
官方解释:
硬件抽象层 (HAL) 提供标准界面,向更高级别的 Java API 框架显示设备硬件功能。HAL 包含多个库模块,其中每个模块都为特定类型的硬件组件实现一个界面,例如相机或蓝牙模块。当框架 API 要求访问设备硬件时,Android 系统将为该硬件组件加载库模块。
Linux 内核
依靠 Linux 内核来执行底层功能,比如驱动等。
从平台框架图中我们不难看出一般的app开发人员只要用到的是Java API Fragmework,部分会用到Native C/C++ Libraries,系统开发人员才会用到Linux 内核这一层,所以到底学习哪部分因人而异,比如我平时的工作就是app开发,不会涉及到底层,所以就学习Java API Fragmework,有人又说了Java API Fragmework怎么入手呢?从哪看起呢?我个人觉得学习源代码是为解决我们工作中遇到的问题,而不是为了看代码而看代码,那你很快就会失去兴趣。所以我们看代码时要解决以下几个问题:
- 目标:你看代码的目标是什么?你要明确你的目的。
- 取舍:开代码时千万不要扎进去出不来,源代码太复杂了,很有可能一进去就出不来了,所以要有取舍,有写东西暂时不明白就记住,不一定非要理解原理。
- 输出:看了代码有什么问题一定要通过demo实验出来,明白了一部分也要demo出来。多看多些才能进步更快。
举个例子来说有一个自定义View,这个时候我们要怎么解决这个问题呢?
- 先到网上查找相关资料,可能解决也可能未解决。
- 不管是否解决我们都应该了解自定义View的基本不住。
- 这个时候我们在看下系统自带View的实现。
- 完善我们自己的View
其实总结起来就是先会用然后再了解基本原理。
希望这篇文章能够帮助到大家,后面我们就会先从Android UI开始学起。
如何学习Android的源代码相关推荐
- Android闹钟动画,学习Android闹钟源代码(三)-AlarmClock类分析(part1)
android的时钟,也就是闹钟应用,从桌面的widget直接点进去的会打开AlarmClock这个Activity. 好像我平常都不上图的,今天就上两张图先. 一张是应用界面图如下:(改天再上传了, ...
- 学习android 画板源代码,Android实现画画板案例
郑州app开发画画板案例.布局代码是三个button和一个imagesview下面是图片. 布局代码就不展示了.下面是java代码. package cn.xhhkj.image; import an ...
- 中国移动开发者社区专访:学习Android的两大法宝
本文为原创,如需转载,请注明作者和出处,谢谢! 近日,接受了中国移动开发者社区的专访,谈了关于Android的一系列问题 http://dev.10086.cn/upload/developers_m ...
- Android菜鸟如何学习Android系统开发?
如何做好Android学习前的准备? 如果你已经确定了学习Android的目标,那么,应该提前做好哪些工作.先打下哪些基础呢? 首先,你最好先熟悉一门编程语言,现在大学里面和计算机相关的专业甚至理工类 ...
- 如何学习Android及如何利用android来赚钱
先说说本人的情况,09年底开始学习手机开发,先从Brew到Mobile再到Android,android是今年过年回来才算真正开始学的,一边学习一边做原先Brew项目到android的移植,5月中旬的 ...
- 老罗的《Android系统源代码情景分析》翻了10遍还看不懂?因为你用错了
最近老朽又把罗升阳老师的<Android系统源代码情景分析>拿出来啃了一番. 为什么要加个"又"呢?因为从老罗的第一版开始到迄今为止尚未更新的第三版为止,每年有学习冲动 ...
- Android菜鸟如何学习Android系统开发?(
如何做好Android学习前的准备? 如果你已经确定了学习Android的目标,那么,应该提前做好哪些工作.先打下哪些基础呢? 首先,你最好先熟悉一门编程语言,现在大学里面和计算机相关的专业甚至理工类 ...
- 内嵌SDK(学习Android必看)
一.如何学习Android android开发(这里不提platform和底层驱动)你需要对Java有个良好的基础,一般我们用Eclipse作为开发工具.对于过多的具体知识详细介绍我这里不展开,我 ...
- Android系统源代码情景分析:基础知识
老罗(罗升阳)发表在的InfoQ上的好文,最新在学习Android,转载一下,方便学习. 老罗的CSDN blog链接:http://blog.csdn.net/Luoshengyang/ 原文链接: ...
最新文章
- AI Studio下C语言编程:一道简单的C语言作业题目
- 【转】 LINQ TO SQL中的selectMany
- Daily Scrum4 11.6
- 新的一年,想发有关对话系统的paper?快关注时下最大热点:智能化与个性化...
- SAP UI5 global configuration interface
- ember.js mysql_用AWS部署ember.jspadrino应用系列之一
- 理解eos区块链的eosio.token合约
- java类和对象数组传参_Java 练习(替换数组元素, 将对象作为参数传递给方法)
- Mapping Text to Knowledge Graph Entities using Multi-Sense LSTMs
- python-gui-pyqt5的使用方法-4--自定义信号的初识--多参数的使用
- 苹果手机解压缩软件_「 神器 」用得贼舒服的压缩/解压缩工具
- 微信电脑版调整字体大小的办法
- 平板边界层内的流速分布实验
- word to latex 2.56安装方法
- python刷今日头条访问量_python爬虫实战:刷某博客站点的访问量(转)
- TC8:IPv4_REASSEMBLY_01-13
- 如何使用阿里云的NAS云文件存储服务
- *UVALive 6657 - GCD XOR(数学)
- ip地址合不合法怎么看_怎样判断IP地址的非法性?
- 视频监控录像机默认端口 34567 修改为37420
热门文章
- html5赛车小游戏,H5赛车游戏大全_h5赛车小游戏大全_好玩的赛车h5游戏_爱手游网...
- Google Earth Engine —— 西非沿海地区脆弱性数据集(社会脆弱性、人口风险、以及贫困和适应能力)
- 让windows xp、2003的桌面图标透明
- java计算机毕业设计BS架构考研交流学习平台设计与实现源码+数据库+系统+lw文档
- LeetCode系列538—把二叉搜索树转换为累加树
- 分布式系统的一些基础理论
- JavaScript学习笔记_5 Map
- App灰度发布实现路径之小程序容器
- prerender ajax,Vue Prerender.io 预渲染seo优化
- 使用U盘启动方式安装Windows10系统