做了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的源代码相关推荐

  1. Android闹钟动画,学习Android闹钟源代码(三)-AlarmClock类分析(part1)

    android的时钟,也就是闹钟应用,从桌面的widget直接点进去的会打开AlarmClock这个Activity. 好像我平常都不上图的,今天就上两张图先. 一张是应用界面图如下:(改天再上传了, ...

  2. 学习android 画板源代码,Android实现画画板案例

    郑州app开发画画板案例.布局代码是三个button和一个imagesview下面是图片. 布局代码就不展示了.下面是java代码. package cn.xhhkj.image; import an ...

  3. 中国移动开发者社区专访:学习Android的两大法宝

    本文为原创,如需转载,请注明作者和出处,谢谢! 近日,接受了中国移动开发者社区的专访,谈了关于Android的一系列问题 http://dev.10086.cn/upload/developers_m ...

  4. Android菜鸟如何学习Android系统开发?

    如何做好Android学习前的准备? 如果你已经确定了学习Android的目标,那么,应该提前做好哪些工作.先打下哪些基础呢? 首先,你最好先熟悉一门编程语言,现在大学里面和计算机相关的专业甚至理工类 ...

  5. 如何学习Android及如何利用android来赚钱

    先说说本人的情况,09年底开始学习手机开发,先从Brew到Mobile再到Android,android是今年过年回来才算真正开始学的,一边学习一边做原先Brew项目到android的移植,5月中旬的 ...

  6. 老罗的《Android系统源代码情景分析》翻了10遍还看不懂?因为你用错了

    最近老朽又把罗升阳老师的<Android系统源代码情景分析>拿出来啃了一番. 为什么要加个"又"呢?因为从老罗的第一版开始到迄今为止尚未更新的第三版为止,每年有学习冲动 ...

  7. Android菜鸟如何学习Android系统开发?(

    如何做好Android学习前的准备? 如果你已经确定了学习Android的目标,那么,应该提前做好哪些工作.先打下哪些基础呢? 首先,你最好先熟悉一门编程语言,现在大学里面和计算机相关的专业甚至理工类 ...

  8. 内嵌SDK(学习Android必看)

    一.如何学习Android   android开发(这里不提platform和底层驱动)你需要对Java有个良好的基础,一般我们用Eclipse作为开发工具.对于过多的具体知识详细介绍我这里不展开,我 ...

  9. Android系统源代码情景分析:基础知识

    老罗(罗升阳)发表在的InfoQ上的好文,最新在学习Android,转载一下,方便学习. 老罗的CSDN blog链接:http://blog.csdn.net/Luoshengyang/ 原文链接: ...

最新文章

  1. AI Studio下C语言编程:一道简单的C语言作业题目
  2. 【转】 LINQ TO SQL中的selectMany
  3. Daily Scrum4 11.6
  4. 新的一年,想发有关对话系统的paper?快关注时下最大热点:智能化与个性化...
  5. SAP UI5 global configuration interface
  6. ember.js mysql_用AWS部署ember.jspadrino应用系列之一
  7. 理解eos区块链的eosio.token合约
  8. java类和对象数组传参_Java 练习(替换数组元素, 将对象作为参数传递给方法)
  9. Mapping Text to Knowledge Graph Entities using Multi-Sense LSTMs
  10. python-gui-pyqt5的使用方法-4--自定义信号的初识--多参数的使用
  11. 苹果手机解压缩软件_「 神器 」用得贼舒服的压缩/解压缩工具
  12. 微信电脑版调整字体大小的办法
  13. 平板边界层内的流速分布实验
  14. word to latex 2.56安装方法
  15. python刷今日头条访问量_python爬虫实战:刷某博客站点的访问量(转)
  16. TC8:IPv4_REASSEMBLY_01-13
  17. 如何使用阿里云的NAS云文件存储服务
  18. *UVALive 6657 - GCD XOR(数学)
  19. ip地址合不合法怎么看_怎样判断IP地址的非法性?
  20. 视频监控录像机默认端口 34567 修改为37420

热门文章

  1. html5赛车小游戏,H5赛车游戏大全_h5赛车小游戏大全_好玩的赛车h5游戏_爱手游网...
  2. Google Earth Engine —— 西非沿海地区脆弱性数据集(社会脆弱性、人口风险、以及贫困和适应能力)
  3. 让windows xp、2003的桌面图标透明
  4. java计算机毕业设计BS架构考研交流学习平台设计与实现源码+数据库+系统+lw文档
  5. LeetCode系列538—把二叉搜索树转换为累加树
  6. 分布式系统的一些基础理论
  7. JavaScript学习笔记_5 Map
  8. App灰度发布实现路径之小程序容器
  9. prerender ajax,Vue Prerender.io 预渲染seo优化
  10. 使用U盘启动方式安装Windows10系统