- 博客(369)
- 收藏
- 关注
原创 SurfaceFlinger处理vsync信号
surfaceflinger创建Connection对象的过程前面已经论述过,在此就不赘述了。Surfaceflinger中接收vsync信号的入口为MessageQueue的cb_eventReceiver方法,调用流程图如下,cb_eventReceiver方法如下,直接调用eventReceiver方法,MessageQueue* queue = reinterpret_cast<Me...
2018-03-28 22:11:20
2176
1
原创 Looper 监听文件描述符
还是以SurfaceFlinger为例论述。SurfaceFlinger的init方法会调用MessageQueue的setEventThread方法创建Connection对象,并且还会调用Looper的addFd方法将BitTube对象的文件描述符添加到Looper中进行监听,mEventThread = eventThread;mEvents = eventThread->creat...
2018-03-28 22:08:03
1823
原创 EventThread 分析
在SurfaceFlinger的init方法中,构造了2个EventThread类型的线程,mEventThread = new EventThread(vsyncSrc, *this, false);sp<VSyncSource> sfVsyncSrc = new DispSyncSource(&mPrimaryDispSync, sfVsyncPhaseOffse...
2018-03-28 22:01:58
3429
原创 DispSync 分析
在SurfaceFlinger的构造方法中调用了DispSync的init方法对DispSync进行初始化,mPrimaryDispSync.init(hasSyncFramework, dispSyncPresentTimeOffset);调用流程图如下,DispSync的构造方法如下,DispSync::DispSync(const char* name) : mName(name),...
2018-03-28 20:58:02
2400
1
原创 vsync信号
上个小节说明了HWC模块的加载等操作,并且也说明了HWC模块主要用于产生vsync信号,现在的问题是, vsync信号是如何产生的呢? 又是如何传输到SurfaceFlinger 中,处理的呢?在上面的论述中,HWComposer 的构造方法在加载完FB模块打开设备文件以及加载HWC模块之后,会注册vsync信号,mHwc->registerProcs(mHwc, &mCBConte...
2018-03-28 20:46:03
3150
原创 HWComposer 分析
HWComposerVsync信号的产生有两种来源,一种是硬件,也就是显示模块产生;另外一种是软件模拟,因为目前基本都是硬件产生的,所以软件模拟的代码就没有分析的必要了。接下来分析由硬件产生的vsync是怎么传到surfaceflinger的。这个硬件源就是HWComposer,它一方面管理这composer的hal模块,composer模块是厂商定制UI合成的接口,通常不会直接操作HWCompo...
2018-03-28 20:34:59
12167
原创 surfaceflinger 进程启动
surfaceflinger进程surfaceflinger是一个守护进程,开机启动。surfaceflinger代码的路径如下,frameworks\native\services\surfaceflinger在android 8.1系统中, surfaceflinger进程对应的配置不是在init.rc中,而是在surfaceflinger.rc中,如下,service surfaceflin...
2018-03-28 20:24:41
3030
原创 HAL接口层 --- hardware模块接口
下面分析一个文件hardware/libhardware/hardware.c,这个文件提供了一些函数,上层通过这些函数可以用来查找加载HAL库,以及获取指定HAL库的模块变量;load方法如下,static int load(const char *id, const char *path,const struct hw_module_t **pHmi){int status;
2018-03-25 10:28:34
2228
原创 HAL接口层 --- 硬件接口
3, HAL接口层所有的HAL moudle需要涉及如下三个关键结构体:struct hw_module_t;struct hw_module_methods_t;struct hw_device_t;用户一般需要基于上面这些结构体设计如下两个结构体:struct xxx_module_t {struct hw_module_t common;.};自定义一个模块
2018-03-25 10:22:32
2083
原创 sensor中间层 --- NativeSensorManager
NativeSensorManagerNativeSensorManager定义如下,class NativeSensorManager : public Singleton {friend class Singleton;NativeSensorManager();~NativeSensorManager();struct sensor_t sensor_list[MAX_SEN
2018-03-25 10:15:41
1043
1
原创 sensor中间层 --- CalibrationManager
2, sensor中间层HAL的中间层通过几个类来描述和管理每个sensor,类CalibrationManager管理sensor用到的校正算法模块,NativeSensorManager类则起承上启下的作用, framework层访问标准的HAL接口,然后这些HAL接口再通过NativeSensorManager类接口访问到具体的sensors,同时所有sensor信息也是由这个
2018-03-25 10:06:05
904
原创 sensor驱动层 --- virtual sensor
virtual sensorVirtualSensor是由实际的sensor 虚拟出来的,所有的Virtual Sensor都是class VirtualSensor类的一个实例;VirtualSensor类的定义如下,class VirtualSensor : public SensorBase {sensors_event_t mLastEvent;bool reportL
2018-03-25 10:01:09
2881
原创 sensor驱动层 --- light sensor
概述:Android的硬件抽象层,简单来说,就是对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节。也就是说,把对硬件的支持分成了两层,一层放在用户空间(User Space),一层放在内核空间(Kernel Space),其中,硬件抽象层运行在用户空间,而Linux内核驱动程序运行在内核空间。为什么要这样安排呢?把硬件抽象层和内核驱动整合在一起放在内核空间不可行吗?从技术实现的角度...
2018-03-25 09:57:36
6471
原创 SIM卡 --- 联系人增加/删除/更新 分析
3.2 更新insert/ delete/ update 三个方法执行的流程几乎完全相同,以update方法为例进行论述。update方法主要逻辑如下,1,根据不同类型为参数赋值,case ADN: efType = IccConstants.EF_ADN; subId = SubscriptionManager.getDefaultSubId();break;
2018-01-05 19:23:18
1832
原创 SIM卡 --- 联系人查询过程回调处理
1.2回调处理回调主要是通过消息的形式,首先是IccFileHandler的EVENT_EFEXT1_LINEAR_RECORD_SIZE_DONE 消息,然后是AdnRecordCache的EVENT_LOAD_ALL_ADN_LIKE_DONE消息,最后处理IccPhoneBookInterfaceManager的EVENT_LOAD_DONE消息时唤醒子线程。 回调处理的
2018-01-05 19:19:13
705
原创 SIM卡 --- 联系人查询过程分析
6.3 联系人操作在前面已经论述过, SIM卡中的联系人是保存在单独的数据库中,其对应的Provider为IccProvider,在packages\services\Telephony 路径下,也就是phone进程中。并且,增删改查直接看jar包中的IccProvider类就可以了, IccProvider路径如下,frameworks/opt/telephony/src/java/co
2018-01-05 19:14:16
1780
原创 SIM卡 --- IccCardProxy
6.2 IccCardProxy在phone进程初始化过程中, PhoneProxy的构造方法中会构造IccCardProxy对象,mIccCardProxy = new IccCardProxy(mContext, mCommandsInterface, mActivePhone.getPhoneId());IccCardProxy的构造方法注册SIM卡状态变化的代码如下,mUi
2018-01-04 22:11:32
1132
原创 SIM卡 --- 状态变化
6,SIM卡SIM卡主要的内容包括,SIM卡信息的状态的变化。其中,状态的变化主要是从Modem到RIL守护进程最后上报给phone进程的RIL.java的。6.1 状态变化SIM卡状态的变化主要通过UiccController,这个类在phone进程初始化的时候会进行初始化。UiccController的构造方法如下,mContext = c; //进程上下文mCis =
2018-01-04 22:02:42
8375
原创 合并联系人分析 --- 之二
一键合并联系人的MergeContacts方法调用流程图如下,MergeContacts方法如下,mMergeTask = new QueryContactDetailAndMergeTask(this);mMergeTask.execute(mSubGroupContactsIds);构造QueryContactDetailAndMergeTask对象并调用execu
2018-01-04 21:59:18
1581
原创 合并联系人分析 --- 之一
5.2显示查询完成之后, QuerypartRepeartContactsTask 的onPostExecute方法调用流程图如下,onPostExecute方法主要逻辑如下,((MergeallActivity)target).updateAdapterData(result);MergeallActivity的updateAdapterData方法如下,mAda
2018-01-04 21:52:27
948
原创 联系人合并分析 --- 查找
5,合并联系人合并联系人有2个界面,只是一个是自动合并,一个是手动合并而已,查询以及合并流程完全相同。界面如下,架构图如下,5.1 查找过程MergeallActivity是在PeopleActivity中启动的,startActivity(new Intent(PeopleActivity.this, MergeallActivity.class));
2018-01-04 21:45:38
1160
原创 数据库中同步SIM卡联系人
4.2 同步联系人当重新插入SIM卡时, SimContactsService 的onCreate方法内的匿名Handler的handleMessage方法对应的处理如下,case MSG_SIM_REFRESH:•••if (mSimState[sub] == SimContactsConstants.SIM_STATE_READY || mSimState[sub] == S
2018-01-04 21:34:25
1635
原创 数据库中删除SIM卡联系人
4,SIM卡联系人Contacts2.db数据库中联系人其实包括2部分,手机上面的联系人以及SIM卡中的联系人。当然, SIM卡中的联系人是保存在单独的数据库中,其对应的Provider为IccProvider,在packages\services\Telephony 路径下,也就是phone进程中。AndroidManifest.xml对应的定义如下,<provider andr
2018-01-04 21:27:56
2588
原创 MultiPickContactActivity 分析 --- 之二
3.3选择有2种选择方式,逐条选择和全选。逐条选择时,会调用onListItemClick方法,MultiPickContactActivity的onListItemClick方法逻辑如下,1,获取CheckBox的选取状态,CheckBox checkBox = (CheckBox) v.findViewById(R.id.pick_contact_check);boolean
2018-01-03 22:35:55
507
原创 MultiPickContactActivity 分析 --- 之一
4.3 MultiPickContactActivity首先,这个类长达2000多行,写的的确好。主要是将几个相似的功能合在一起,因此使用了大量的if选择。在AndroidManifest.xml中,有关 MultiPickContactActivity配置如下,<activity android:name=".activities.MultiPickContactActivity"
2018-01-03 22:29:46
1086
原创 联系人导入导出分析
4,导入导出单卡的导入导出界面如下,导出到SIM卡的过程界面如下,在联系人主界面(PeopleActivity)点击右上角的导入导出菜单, 就会出现界面1, PeopleActivity 的onOptionsItemSelected方法对导入导出菜单的点击事件处理如下,case R.id.menu_import_export: { ImportExpor
2018-01-03 22:23:45
2943
原创 ContactSaveService分析
3.3 ContactSaveServiceContactSaveService类继承自IntentService,实现了onHandleIntent方法。当然,另开一个子线程执行异步任务,主要对联系人(包括手机联系人和SIM卡联系人)进行添加,删除,修改,合并等操作。AndroidManifest.xml有关ContactSaveService配置如下,<service andr
2018-01-03 22:02:05
748
原创 删除联系人分析
3.2 删除联系人Contacts相关模块中,有很多地方可以删除联系人,并且有单个删除联系人也有多个删除联系人。以QuickContactActivity为例论述删除单个联系人的详细流程, QuickContactActivity的界面如下,QuickContactActivity界面点击Delete菜单时,会弹出一个对话框,点击对话框的OK才会删除该联系人。QuickCo
2018-01-03 21:53:32
897
原创 新建联系人分析
3,联系人编辑3.1 新建联系人新建联系人界面如下,对应的activity为CompactContactEditorActivity,在CompactContactEditorActivity的onCreate方法中,mFragment = (CompactContactEditorFragment) getFragmentManager().findFragmentB
2018-01-03 21:52:58
2030
原创 contact 结果显示
7.结果显示 问题:1,加载联系人时,联系人前面有 A,B,C等等,查询时的结果都没有 2,联系人前面ABC的大写字母颜色不一样 3,加载联系人仅显示姓名,Dialer查询时还会显示号码,Contacts查询时, 如果邮箱和号码匹配,才显示,否则仅仅显示姓名。什么,邮箱也可以查询?7.1联系人前面的ABC字符字符查询流程Conta
2018-01-03 21:43:33
1787
原创 查询关键代码解析
5,查询关键代码解析bindView ( )ContactEntryListAdapter.java 疑惑1: 在bindView( )函数中,直接将itemView 直接转化为 ContactListItemView?解答:在父类 CompositeCursorAdapter 的 getview 函数中,首先调用 newView() 然后才调用 bind
2018-01-03 18:57:07
1116
原创 contact 基础知识总结与类图
4.基础知识总结与类图三要素基本关系如下:Fragment(Activity),LoaderManager, AsyncLoader等类Fragment1,创建并且管理LoaderManager: getLoaderManager().initLoader(i, null,this);2, 实现的LoaderManager回调callback接口函数:
2018-01-03 18:56:04
1580
原创 contacts加载联系人分析
3,contacts加载联系人Contacts加载和搜索联系人都是同一个MultiSelectContactsListFragment。架构图如下,3.1 初始化MultiSelectContactsListFragment的createListAdapter方法如下,DefaultContactListAdapter adapter = new MultiSele
2018-01-03 18:19:52
1386
原创 拨号盘搜索联系人
2,拨号盘搜索联系人拨号盘搜索联系人流程图如下,拨号界面对应的fragment为DialpadFragment,并且DialpadFragment实现了TextWatcher接口,afterTextChanged方法如下,if (mDialpadQueryListener != null) { mDialpadQueryListener.onDialpadQuer
2018-01-02 22:46:05
2307
原创 拨号盘搜索联系人数据库更新分析 --- 之二
1.2 insertNamePrefixesDialerDatabaseHelper的insertNamePrefixes方法调用流程图如下,insertNamePrefixes方法主要逻辑如下,1,从smartdial_table表单中获取联系人的姓名和id,final int columnIndexName = nameCursor.getColumnIndex(
2018-01-02 22:37:28
579
原创 拨号盘搜索联系人数据库更新分析 --- 之一
1,拨号盘搜索联系人数据库更新在论述拨号盘搜索联系人之前,首先看下dialer.db数据库的更新, dialer.db数据库路径如下,一般在data/data 目录下。dialer.db 数据库有4个表单,主要看smartdial_table和prefix_table 2个表单,smartdial_table是联系人信息,包括手机和SIM卡的联系人;pref
2018-01-02 22:30:17
767
原创 联系人界面分析
2.3联系人界面其实,原生android 系统中,一共有2个联系人显示界面,2个联系人搜索界面,分别属于dialer和contacts中。在Dialer的拨号盘界面如下,可以进行模糊匹配的方法进行搜索,1,例如,输入1时,会搜索出所有号码为1开头的联系人。2,例如,输入6时,不仅会搜索出所有号码为1开头的联系人,还会搜索出联系人首字母为M,N,O的联系人信息
2018-01-02 22:21:08
1198
原创 Dialer 联系人加载
2,联系人加载联系人加载主要是Dialer中的联系人加载,界面如下,界面对应的Fragment为AllContactsFragment,在ListsFragment的内部类ViewPagerAdapter的getItem方法部分代码如下,case TAB_INDEX_ALL_CONTACTS: mAllContactsFragment = new AllContac
2018-01-02 22:04:47
1268
原创 通话记录分析 --- 删除 之二
6.2删除通话记录当点击确认按钮时,就开始删除选择的通话记录。MultiPickContactActivity的onClick对MODE_DEFAULT_CALL模式处理如下,showDialog(DIALOG_DEL_CALL);调用流程图如下,MultiPickContactActivity的onCreateDialog对DIALOG_DEL_CALL类型处理如下,
2018-01-02 18:30:55
1309
原创 通话记录分析 --- 删除 之一
1.6 批量删除在CallLogActivity中进入批量删除界面的onOptionsItemSelected方法如下,case R.id.delete_all: onDeleteCallLog(); return true;onDeleteCallLog方法如下,startActivity(new Intent(SimContactsConstants.ACTI
2018-01-02 18:30:44
848
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人