在我写这篇笔记的时候,Android已经诞生了12年之多,想想自己当初在刚上大学那会(12-13)还在用Nokia的 N51,其实那个时候安卓系统已经很厉害了,之所以自己这么顽固不化主要还是因为自己的经济状况。导致自己发誓入手一台智能机的原因是: 驾考科目四被挂了,这才不得已使用智能机了。那时候已经是大三了,用的是华为麦芒。
研究生毕业后来到这家公司后,直接上手了Android源码,真的很奇怪,我好想学什么都是先底层然后再上层,这次的Android也是。现在也别管 Android以后的发展怎么样,因为它就在这里,自己必须在最短的时间内去熟悉它。
前言部分一般是无用的,可以直接跳过。
这里,我就是简单地回忆下自己思考的,根本没有从代码 其他书籍去考证这些东西的正确性,当然,后面随着熟悉的深入,也需要进行一些修改。
众所周知,我们安卓使用的应用的打包形式为APK文件,当launch 安装这个应用是,AOSP(Android Open Source Platfrom,用来简称安卓)会维持一个名为installd
的守护进程,他会自动监听应用程序包的安装情况。
在这一通道上,有一个名为PackageManagerService
的服务进行包安装。这是AOSP中一个较为核心的服务。
在aosp的源码中,external/avb
目录下包含了这个工具,特指 Android Verified Boot 2.0,该目录
包含有tools和相关的库函数。
avb
如果想弄清楚一个文件的作用,要知道三个方面的内容:
就我目前接触到的aosp的soong系统,这三个对我而言并不是特别的清晰。当然,如果
真要说这块的大体位置,我可以绝对保证,相关的中间文件位于out/.相关的目录
。
soong有一个自带的logger,可以看一下下面这个目录:
看一下 build\soong\cmd\soong_ui\main.go 这个文件中如何使用logger.
这里先铺垫一下go的基本使用方法。 关键词 package main
是指定了
由这个main.go文件生成了一个main的包,这样,在其他go文件中,只要
使用import命令,就比如android/soong/ui/logger
的引用方式,我们
就可以直接使用main.xx()的方式使用main文件定义的方法。
很明显,main.go把logger模块(感觉包不如模块熟悉些)引入到main.go 中,比如:
我们可以看到log.verbosef()方法已经生效,那么这个log文件位于什么地方呢?具体应该可以在代
码中定位到的,不过我现在没有去查找,据我了解的是在out/soong.log
文件下。
但是这个方法对于某些文件并不能凑效,比如,我想调试下build/soong/cc/cmakelists.go
的某些具体量,但是不知道为什么根本加不进去logger模块,报错的:
非常简答,只能是作为过渡方法:
这样自定义输出log文件的好处是: 清晰 只打印自己想要的内容,但缺点是输出的内容难以控制, 需要适配,比如:某个模块的某个方法到底能返回什么样类型的值,还需要看代码去确定。
但是,先这样凑合着使用吧。
c++的虚函数与面向对象的多态
的思想紧密结合,这篇文章
简单介绍了多态的一些概念,这个值得下面进行总结。
多态主要有两种:
目前,本博客已经就编译时多态进行了一些总结,这篇文 章主要总结运行时多态的用法,也就是虚函数的用法。
举个简单的例子热身.
为了更好的说明虚函数的用法,先看一个最基本的例子:
输出结果为:
这里最显著的一个地方在于,在同一个派生类(有地址引用)调用有无
virtual修饰的方法是不一样的。
如果用我自己的话说就是,虚函数改变了基类的成员函数,这还是在不修改
基类代码的情况下。那么,在已有继承的方法前提下,这个特点还有意义吗?
或者说,虚函数到底是做什么的?这不仅仅对我这样的初学者是一种疑惑,
同样的,stackoverflow
也有类似的疑惑。Task is cheap,show me the code.
example 1
:
都没问题吧,但是,如果利用一个中间函数去调用情况又不一样了,比如:
这个时候就出现问题了,全部输出了基类的方法。如果还有dog pig monkey
啥的都能乱死了,那怎么办?
关键就是在基类的方法加上virtual
就可以了。
其实,在我看来,加上这个关键词并不能有助于真正理解这个问题:问题的 关键在于怎么使用基类和派生类才会导致这个问题的产生。
如果在func(Animal *xyz)
使用 cat 去定义函数参数类型则是失败的。
这是一个编程题目大体的意思是:
一个基类: Person, 内含 name age两个成员变量,getdata()和putdata()两个方法,负责分别得到和输出两个成员变量。
派生类Professor多加一个publications的变量,两个成员方法不变,只不过在putdata方法中 还需要自动展示一个id号。
派生类Student需要一个marks[6]去存储6门课程成绩,最后输出。
代码如下:
需要说明的一点是:
类中的静态成员变量必须在类外定义
,这一点是由于static变量的生存周期决定的。
我自己的代码与这份代码已经具有85%的相似性了,但是就是输出不对。
首先提前反思下,这个操作很有必要吗?正常来说,我们都应该是在开发分支上开发, 然后验证 最后合入到 master,最后再git push.
我用到这个场景的原因是:我的博客在好几个平台上都有,自己的云主机、公司的工作站或者 还有自己的笔记本上偶尔也有git push。这东西一多的问题就是:master分支经常忘记git pull. 这样导致如果直接在master分支上开发,下载下来的代码经常冲突。
继承的特性丰富了c++的使用,当然也有一定的使用门槛,现在简单介绍一点 这方面的知识,以备将来使用。
下面的程序代码是一个最简单的使用继承的案例,我们来看一下:
这一个是使用子类的实例化对象,继承了父类的方法。注意,这里没有解释一
些细节的问题,比如说public
的属性什么的,只是在感官层面上进行一个概
括。
当然,还可以继续继承下去.
其实这里面对有关权限的制约还是非常复杂的,我这里暂时不打算讲述这些,毕竟我自己没有 尝试这些东西,那就先整下自己已经涉及到的内容。
这是什么意思?比如说,我的父类中有一个方法display ()
,这个方法就是用来展示父类内部
的成员变量,但是呢,父类不提供构造方法,而是通过子类去给父类的成员变量赋值,这听起
来很变态,但是,这是hackeranker的一道题目
技巧在于在子类中使用keyword using
,这个时候,你在子类中父类的变量(这个变量必须设置
为 public
)在子类中就可以自由的使用了.
对于这个方案的处理,我不知道还有没有更好的处理呢?