前言:

      华为发布鸿蒙,分布式微内核全场景新一代操作系统,多终端一次开发,余承东宣布鸿蒙系统随时可用于手机,现有android应用全兼容,而且完全开源。鸿蒙在发布会上最为人称道的一点是‘开源’,毕竟能经得起世人检验的代码,才是靠谱的产品。

      当然在发布会上有支持鸿蒙的,也有给鸿蒙泼冷水的,鸿蒙需要开发者加入,开发者也需要通过代码更深入的了解鸿蒙。一边自称开源,一边一行代码也看不到,会让人高度怀疑鸿蒙项目的完成度。

      笔者站在一个Android系统开发工程师角度去怎么看待鸿蒙呢?,笔者只是更加得期待有国产自研的智能操作系统,不管好与坏 毕竟都是国产智能的操作系统新的开端,我们应该用美好长远的眼光去看待它。

     文章的开始让我们致敬华为,致敬鸿蒙。

分享

       Android7.0 系统(framework)定制、修改、移植 总结

      Android7.X 源码下载、编译、运行系统详解(ubuntu 16.0.4)

      Android - [MT6737] MTK 编译环境搭建

      Android 高通8909 系统之路之 裁剪系统 一

      Android-MTK系统- 系统常用修改点

      Android - MTK系统源码结构

 仅仅是分享给那些做应用层不知道怎么切入Android framework/kernel 的工程师。

      其实笔者进入Android 系统开发的时间也就3年,笔者给自己定位的一名产品研发工程师,为此笔者不想极度的去深入研究,但是一定要熟练,但是笔者还是能够分享出一些微不足道的经验给基于需要此篇文章所讲述的经验。

      笔者最先开始其实是做嵌入式、单片机、Qt C++ ,由于很喜欢C++ 这门语言,这可能也源于我在大学里对C、C++ 培养的喜好,特别是喜欢C直接操作内存,能够透彻明白,原来内存是这么变化的。但是由于前几年移动互联网的兴起,笔者是个‘随波逐流’ 的工程师,于是我最后打算进入Android开发领域,为什么是学Android 而不是IOS?

       1:IOS设备成本高,不便于研发。

       2:笔者在学Android之前有特地初步的了解Android架构,学Android最重要的原因是 Linux。

       3:当前如果一直都处在Application 层开发的 对Linux的接触会没那么深,并且系统编译都是要在Linux下进行。

       4: Android系统开源,意味着不像IOS一样,基本都在应用开发,并不能去了解整个系统的架构。

       5:对于Android在学习上的拓展性极强,Application->framework->kernel +Linux 学习的方向相当明确,而且在当时已经想到未来将会是物联网的天下,而Android设备将会是物联网设备的首选之一,其原因为Android系统开源,定制性强。

       6:学完以上,会顺带的加强Linux操作系统的使用,以及一些脚本的使用,摸通了Linux 一些规则加上时间经验的沉淀,熟悉了之后可以做些什么? Linux作为目前主流云服务器的系统 ,好了 ,机会来了。

       7:好处N多,说不完,在此省略。。。

     笔者在移动互联网高峰期混了一波后,终于踏上了物联网设备研发之路,这个过程很艰辛,笔者从头到尾都是自学得,有人教当然事半功倍。人们常说,学好Linux 到哪里都饿不死,后面想下这句说的真的很对。

     直接进入主题,那么现在问题来,App开发后如何转framework,做什么?怎么做?

分享点1: 记住:【开发很简单,只是开发的环境差异,只要熟悉了这个环境,你会发现原来是这样】

     做什么?怎么做?:

            首先要明白应用层转framework层需要学习一些什么,路线步骤是怎么样的。这边大概列一些需要学习的点

            1:下载源代码进行编译(编译前需要搭建环境,如你开发应用需要 SDK,JDK一个道理 ) 【看 -> 9】

            2:如何使用Linux服务器(虚拟机上运行Ubuntu& centos  或者 自搭建的都行)

            3:阅读代码工具的使用 source insight 导入源码,Android Studio导入源码  

            4:编译环境,网上寻找资料,根据Android的系统版本搭建对应环境如4.4 和 5.1以上可能就会存在环境的差异,如JDK使用的版本不一样,而且学会如何在Linux下搭建不同 JDK环境,系统源码很庞大,他需要用到各种库,  不懂的话百度一下你就知道。

            5:可能在编译中会存在各种各样的问题,编译命令?如何烧写,百度谷歌基本为你们都解决了这个问题或者其他方式来解决都可以。你会发现在解决问题的时候你是在积累经验以及在潜移默化的学习Linux的一些命令操作和系统的使用。

            6:编译成功后,切记一定要有真机来调试, 修改代码在进行运行对比下结果,你应该初步了解下Android系统整个源码的每个目录对应的作用是什么? 编译后out   目录下产生的一些文件夹、文件 是什么作用。

            7:刚从App转到Framework 可以从系统应用层入手,因为他们基本和App开发一样,只是编译的方式不同。这些应用在哪里?手机连上USB 通常 adn shell  -> cd system    下 一般会有 app 或者 priv-app 里面的应用都是系统应用级别,而system目录下的framework文件夹里 才是framework的核心。

            8:学习需要循序渐进,从应用->系统应用->系统框架,这里面重点再讲一下,必须要有真机或者开发板来实践操作,只一味地阅读系统源代码并不能快速地提升。

            9:有一些没有真机或者开发的开发者来说怎么办?可以网上购买一些Android 开发板,一般开发板都会配套 开发板的资料以及编译环境,开板板源码齐全的资料等,卖家也会提供一些比较优质的服务器。

           10:总结一句话,开发很简单,难的只是开发的环境差异,只要你熟悉了这个环境,你也就知道就这么回事。

           基本的环境,编译命令熟悉之后,通过时间去研究,修改,编译 Android的各个模块,很快就能找到一些规律性 。

 分享点2: 由于系统源码相当庞大,系统修改点各处都有,在Linux上需要git来管理整个源码。如修改了哪些,在哪个路径,想回滚到某个版本   非常便于系统源码的管理。

 学习过程:

       Android framework的系统性知识网上是极少的,零散性的比较多,后续可能会碰到很多需求也会发现网上搜不到或者根本没有这个参考答案,那怎么办?通过时间的学习项目的积累+技术的沉淀 慢慢得摸透了规律其实你会发现,按照自己发现的套路规律来,很简单。

       其实Android系统整个系统的贯穿的,笔者认为学习的工程师应该给自己规划路线,清楚需要学哪些,模块化的去学习,可能Android framework它太庞大了,甚至会发现根本学不完,应该说是真的学不完,那么接下来我建议刚从Application转framework 的学习过程,模块要怎么划分:

 【学习的时候一定要建立在编译环境能够顺利搭建,Linux基本命令熟悉并且有真机或者模拟器调试】

   第一阶段:

         1:系统应用(服务)的初识

[在阅读修改源码前 不妨先了解一下每个应用下Android.mk  脚本中每行代码对应的作用] ,接下来你会发现代码和应用层基本类似,区别在哪里?   1:系统应用通过Android.mk 进行编译  2:可能部分系统应用结构极其复杂,模块很多  3:系统的编码规范,各种设计模式的运用和App有点差异化   

          在这里只是简单描述并不进行技术上的深入,笔者建议必须深入研究的系统应用:

           1:framework/base/package/apps/SystemUI

           2:package/apps/Settinggs

          基本常用的系统应用:

          1:package/apps/Dialer(依赖于InCallUI)

          2 : ackage/apps/Launcher*

          部分系统应用会依赖于一些服务应用 如 Dialer 依赖于 \packages\services\Telephony  (frameworks\base\services 下的)

          后续只要用源代码浏览工具就可以轻松知道调用的是哪个模块。

         [注:有的源码可能目录不一样,但基本相似]

     当你研究了系统应用一段时间后,慢慢就会找到感觉,接下来可以尝试着修改一些系统性的一些和应用层比较相似的代码块以及编辑块。

           阅读系统源码代码  一定要记住一点,要有有头有目的开始 慢慢追溯代码,如果随便打开一个文件夹,可能会让人摸不着头脑,举个例子:

          framework/base/ 一些目录下点开了一些代码文件,你会发现可能会无从入手,看得懂源码,但是没有没有头没有结尾得去看,并不能得到很好的效果。

           在framework/base/core/res/res  定义了很多类似应用层一样的 资源文件,虽然是系统应用、模块、框架 的资源集合,但是其实和应用层也没什么差别,基本一样,直接看可能看得懂,但是有什么用?可能会摸不着头脑。

分享点3:空余时间多去了解Android.mk的语法

   2:系统应用结合框架的了解 

          怎么定义系统的框架呢?笔者有着自己的见解,因为Android源码极其庞大,模块异常的多,因此笔者只有需要的时候才会去深入研究某个模块,那有的人会问,这模块是什么?

笔者为什么要分阶段,因为有部分App工程师可能不会C、C++,这导致了一些 native源码看不懂,但是此阶段基本不会涉及到很多C、C++、JNI。

           举个例子:

           在App层开发的时候,onKeyDown为什么会上报键值? 为什么Android系统led灯、键盘灯 怎么亮的? 通知栏运行的机制和流程是怎么样,当然还有很多。

           有一些小伙伴可能会看一下 pdf、网上搜一些如:

  系统 init、zygote  过程 、Binder 机制、内核的一些机制、Runtime机制、虚拟机相关的、以及系统调度等。。

         那么笔者非常不建议那些刚转入framework  还不熟悉的工程师看这些,当然有能力除外,因为这个是第三阶段应该看的,在这第二阶段 应该看下 App层与Framework 相关联的一些东西,让学习更加的有动力,有自信,过于看一下复杂的东西,可能会导致失去兴趣以及动力。

             因此需要学习哪些才是正确的呢,由于笔者写出该篇分享文章主要是将做什么?怎么做体现的可能不会太多,需要小伙伴们自己去思考、琢磨。  

             在framework/base 下有一大堆的java源码,对了就是它,撸它。你想知道一个通知服务怎么上报通知的1:百度了解 2:搜索源码文件 [Linux 搜索命令] #:find  /framework/base/   -name  *Notification*    就会出现很多你想要的java文件,接下来就是阅读源码了,每个工程师的阅读源码能力可能不一致,这边要说的是,Android 之所以有的很复杂是因为 Api 调来调去,后面调晕了,在这个过程一定要多debug、log、流程 或者有其他更好的方法去学习沉淀。

              以此类推。 led       ->   1:百度了解 2:搜索源码文件 [Linux 搜索命令]   #:find  /framework/base/   -name  *Led*

分享点4: PhoneWindowManager.java  可以做很多和App相关的事情,不妨多研究一下它。find 命令 找到它。

        3:系统框架的深入

             有了前面几部基础,来到了此阶段,那么,你可以去搜索网上的 framework、HAL 、kernel  知识了,并且去深入研究。

注:此阶段需要有一定的 C、C++、JNI 的知识和了解。

             至于这个阶段学什么,笔者认为你可以自行安排,熟悉了前两个阶段,后面您自行安排,每个人的方向可能会不一致, 且掌握了前两个阶段这个阶段你应该已经掌握到了一些规律和学习方向。

             深入学习框架避免不了 系统编译环境以及脚本的修改,因此想要更深入的去了解框架,修改框架,定制框架,

那么一定要熟悉以下几个点:

 1: 熟悉.mk的用法

             2: shell脚本的熟练

             3: 熟练 Python脚本语言

             6: 熟练Android的框架构建思想

             5: 熟悉安卓Binder系统

     *7: 移植系统、驱动

分享点4:

             Linux(Ubantu,Centos) 命令、系统使用、教程汇总[不定期更新] 

第二阶段:

       1:Android framework 切入 kernel 需要做一些什么?

         当你学了一段时间framework后,你可能也掌握了一些其诀窍和规律, framework实在是太庞大了,有时候可能会让人觉得枯燥无味或者说只有一些项目修改才会去驱动 定制编码,因此观望的瓶颈很快就出现。

         如果你有C、C++ 基础 ,不妨进军Linux kernel、Android drivers。 有了编译Android源代码的知识,那么在编译内核上已经基本会了,知识编译模块的命令不一致,一般编译bootloader->  使用的是[Linux] #:make  aboot  ,kernel -> [Linux] #:make  bootimage, 而编译system 部分则是 [Linux] #:make systemimage  [Linux] #:mmm  等等。

        笔者喜欢先研究kernel再去研究 bootloader,  因为驱动可以快速的写出 HelloWorld!  .

韦东山的Linux驱动视频,Android framework

        笔者建议按照网上的资料以及 视频教程结合去看。 因为刚入门的工程师来说,可能找不到方向,而这时候应该要去寻找方向,寻找学习的切入点。韦东山老师的视频讲得很透彻 可以建议去购买学习。

        不管用任何一种方式去学习或者深入研究,必须要有开发板来配合学习,只是一味的观看源代码, 不编码,不编译   收获将减大半以上。所以一定要又开发板配套学习,所以一定要又开发板配套学习,所以一定要又开发板配套学习。 重要事情说三遍。 

        bootloader 与kernel 类似。

     

  2:学习方法

      到了这个阶段,经过一段时间的沉淀,相信已经基本掌握了系统学习的要领。那么应该如何去深入学习。这里再次强调一下,笔者没有去深入研究分析系统的各个源码,只是有需要的时候才会去专研,笔者并不是想一直处于framework或者kernel工作。但是,大致的学习方向,规划是有的,其实每个人的学习计划和学习路线学习方法都不一样,因人而异,笔者这边只是提出几点建议:

       1:模块化学习。系统源码过于庞大,建议进行模块化学习,通过模块化学习再去拓展。

       2:模仿式学习。代码 ctrl - c , ctrl - v  敲代码不可少。Android系统框架也很清晰,只是多个同样测试案例使用了同一套框架导致了代码"堆积"最后到了巨大庞大的项目。这里所说的测试案例是真实的程序。那么不妨参照着他的思路和步骤自己也写一个案例程序。这是模仿。

      3:真机实操学习。 这里在强调一遍,一味的看源代码而不用开发板去实践的获得收获那会是极少的。

  

    目前,安卓不同芯片对应的开发板搭载的系统版本,源码都存在的一定的差异,可多可少。 有经济条件可以多买多学多看。但是大体还是离不开整体框架的构建思想。学习过程中可以举一反三。

总结

      只要功夫深,铁杵磨成针。