如何学习Android的源代码 - Go语言中文社区

如何学习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开始学起。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/mengks1987/article/details/77584994
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-27 21:51:14
  • 阅读 ( 636 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢