自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(369)
  • 收藏
  • 关注

原创 SurfaceFlinger处理vsync信号

surfaceflinger创建Connection对象的过程前面已经论述过,在此就不赘述了。Surfaceflinger中接收vsync信号的入口为MessageQueue的cb_eventReceiver方法,调用流程图如下,cb_eventReceiver方法如下,直接调用eventReceiver方法,MessageQueue* queue = reinterpret_cast<Me...

2018-03-28 22:11:20 2057 1

原创 Looper 监听文件描述符

还是以SurfaceFlinger为例论述。SurfaceFlinger的init方法会调用MessageQueue的setEventThread方法创建Connection对象,并且还会调用Looper的addFd方法将BitTube对象的文件描述符添加到Looper中进行监听,mEventThread = eventThread;mEvents = eventThread->creat...

2018-03-28 22:08:03 1729

原创 EventThread 分析

在SurfaceFlinger的init方法中,构造了2个EventThread类型的线程,mEventThread = new EventThread(vsyncSrc, *this, false);sp<VSyncSource> sfVsyncSrc = new DispSyncSource(&mPrimaryDispSync, sfVsyncPhaseOffse...

2018-03-28 22:01:58 3295

原创 DispSync 分析

在SurfaceFlinger的构造方法中调用了DispSync的init方法对DispSync进行初始化,mPrimaryDispSync.init(hasSyncFramework, dispSyncPresentTimeOffset);调用流程图如下,DispSync的构造方法如下,DispSync::DispSync(const char* name) : mName(name),...

2018-03-28 20:58:02 2293 1

原创 vsync信号

上个小节说明了HWC模块的加载等操作,并且也说明了HWC模块主要用于产生vsync信号,现在的问题是, vsync信号是如何产生的呢? 又是如何传输到SurfaceFlinger 中,处理的呢?在上面的论述中,HWComposer 的构造方法在加载完FB模块打开设备文件以及加载HWC模块之后,会注册vsync信号,mHwc->registerProcs(mHwc, &mCBConte...

2018-03-28 20:46:03 3052

原创 HWComposer 分析

HWComposerVsync信号的产生有两种来源,一种是硬件,也就是显示模块产生;另外一种是软件模拟,因为目前基本都是硬件产生的,所以软件模拟的代码就没有分析的必要了。接下来分析由硬件产生的vsync是怎么传到surfaceflinger的。这个硬件源就是HWComposer,它一方面管理这composer的hal模块,composer模块是厂商定制UI合成的接口,通常不会直接操作HWCompo...

2018-03-28 20:34:59 11965

原创 surfaceflinger 进程启动

surfaceflinger进程surfaceflinger是一个守护进程,开机启动。surfaceflinger代码的路径如下,frameworks\native\services\surfaceflinger在android 8.1系统中, surfaceflinger进程对应的配置不是在init.rc中,而是在surfaceflinger.rc中,如下,service surfaceflin...

2018-03-28 20:24:41 2813

原创 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 2119

原创 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 1986

原创 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 881 1

原创 sensor中间层 --- CalibrationManager

2, sensor中间层HAL的中间层通过几个类来描述和管理每个sensor,类CalibrationManager管理sensor用到的校正算法模块,NativeSensorManager类则起承上启下的作用,  framework层访问标准的HAL接口,然后这些HAL接口再通过NativeSensorManager类接口访问到具体的sensors,同时所有sensor信息也是由这个

2018-03-25 10:06:05 788

原创 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 2627

原创 sensor驱动层 --- light sensor

概述:Android的硬件抽象层,简单来说,就是对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节。也就是说,把对硬件的支持分成了两层,一层放在用户空间(User Space),一层放在内核空间(Kernel Space),其中,硬件抽象层运行在用户空间,而Linux内核驱动程序运行在内核空间。为什么要这样安排呢?把硬件抽象层和内核驱动整合在一起放在内核空间不可行吗?从技术实现的角度...

2018-03-25 09:57:36 6125

原创 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 1701

原创 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 625

原创 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 1635

原创 SIM卡 --- IccCardProxy

6.2 IccCardProxy在phone进程初始化过程中, PhoneProxy的构造方法中会构造IccCardProxy对象,mIccCardProxy = new IccCardProxy(mContext, mCommandsInterface, mActivePhone.getPhoneId());IccCardProxy的构造方法注册SIM卡状态变化的代码如下,mUi

2018-01-04 22:11:32 1002

原创 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 7979

原创 合并联系人分析 --- 之二

一键合并联系人的MergeContacts方法调用流程图如下,MergeContacts方法如下,mMergeTask = new QueryContactDetailAndMergeTask(this);mMergeTask.execute(mSubGroupContactsIds);构造QueryContactDetailAndMergeTask对象并调用execu

2018-01-04 21:59:18 1085

原创 合并联系人分析 --- 之一

5.2显示查询完成之后, QuerypartRepeartContactsTask 的onPostExecute方法调用流程图如下,onPostExecute方法主要逻辑如下,((MergeallActivity)target).updateAdapterData(result);MergeallActivity的updateAdapterData方法如下,mAda

2018-01-04 21:52:27 752

原创 联系人合并分析 --- 查找

5,合并联系人合并联系人有2个界面,只是一个是自动合并,一个是手动合并而已,查询以及合并流程完全相同。界面如下,架构图如下,5.1 查找过程MergeallActivity是在PeopleActivity中启动的,startActivity(new Intent(PeopleActivity.this, MergeallActivity.class));

2018-01-04 21:45:38 1058

原创 数据库中同步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 1511

原创 数据库中删除SIM卡联系人

4,SIM卡联系人Contacts2.db数据库中联系人其实包括2部分,手机上面的联系人以及SIM卡中的联系人。当然, SIM卡中的联系人是保存在单独的数据库中,其对应的Provider为IccProvider,在packages\services\Telephony 路径下,也就是phone进程中。AndroidManifest.xml对应的定义如下,<provider andr

2018-01-04 21:27:56 2477

原创 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 468

原创 MultiPickContactActivity 分析 --- 之一

4.3 MultiPickContactActivity首先,这个类长达2000多行,写的的确好。主要是将几个相似的功能合在一起,因此使用了大量的if选择。在AndroidManifest.xml中,有关 MultiPickContactActivity配置如下,<activity android:name=".activities.MultiPickContactActivity"

2018-01-03 22:29:46 842

原创 联系人导入导出分析

4,导入导出单卡的导入导出界面如下,导出到SIM卡的过程界面如下,在联系人主界面(PeopleActivity)点击右上角的导入导出菜单, 就会出现界面1, PeopleActivity 的onOptionsItemSelected方法对导入导出菜单的点击事件处理如下,case R.id.menu_import_export: { ImportExpor

2018-01-03 22:23:45 2738

原创 ContactSaveService分析

3.3 ContactSaveServiceContactSaveService类继承自IntentService,实现了onHandleIntent方法。当然,另开一个子线程执行异步任务,主要对联系人(包括手机联系人和SIM卡联系人)进行添加,删除,修改,合并等操作。AndroidManifest.xml有关ContactSaveService配置如下,<service andr

2018-01-03 22:02:05 669

原创 删除联系人分析

3.2 删除联系人Contacts相关模块中,有很多地方可以删除联系人,并且有单个删除联系人也有多个删除联系人。以QuickContactActivity为例论述删除单个联系人的详细流程, QuickContactActivity的界面如下,QuickContactActivity界面点击Delete菜单时,会弹出一个对话框,点击对话框的OK才会删除该联系人。QuickCo

2018-01-03 21:53:32 738

原创 新建联系人分析

3,联系人编辑3.1 新建联系人新建联系人界面如下,对应的activity为CompactContactEditorActivity,在CompactContactEditorActivity的onCreate方法中,mFragment = (CompactContactEditorFragment) getFragmentManager().findFragmentB

2018-01-03 21:52:58 1774

原创 contact 结果显示

7.结果显示   问题:1,加载联系人时,联系人前面有 A,B,C等等,查询时的结果都没有       2,联系人前面ABC的大写字母颜色不一样       3,加载联系人仅显示姓名,Dialer查询时还会显示号码,Contacts查询时,       如果邮箱和号码匹配,才显示,否则仅仅显示姓名。什么,邮箱也可以查询?7.1联系人前面的ABC字符字符查询流程Conta

2018-01-03 21:43:33 1637

原创 查询关键代码解析

5,查询关键代码解析bindView ( )ContactEntryListAdapter.java              疑惑1: 在bindView( )函数中,直接将itemView 直接转化为 ContactListItemView?解答:在父类 CompositeCursorAdapter 的 getview 函数中,首先调用 newView() 然后才调用 bind

2018-01-03 18:57:07 943

原创 contact 基础知识总结与类图

4.基础知识总结与类图三要素基本关系如下:Fragment(Activity),LoaderManager, AsyncLoader等类Fragment1,创建并且管理LoaderManager:   getLoaderManager().initLoader(i, null,this);2, 实现的LoaderManager回调callback接口函数: 

2018-01-03 18:56:04 998

原创 contacts加载联系人分析

3,contacts加载联系人Contacts加载和搜索联系人都是同一个MultiSelectContactsListFragment。架构图如下,3.1 初始化MultiSelectContactsListFragment的createListAdapter方法如下,DefaultContactListAdapter adapter = new MultiSele

2018-01-03 18:19:52 1296

原创 拨号盘搜索联系人

2,拨号盘搜索联系人拨号盘搜索联系人流程图如下,拨号界面对应的fragment为DialpadFragment,并且DialpadFragment实现了TextWatcher接口,afterTextChanged方法如下,if (mDialpadQueryListener != null) { mDialpadQueryListener.onDialpadQuer

2018-01-02 22:46:05 2071

原创 拨号盘搜索联系人数据库更新分析 --- 之二

1.2 insertNamePrefixesDialerDatabaseHelper的insertNamePrefixes方法调用流程图如下,insertNamePrefixes方法主要逻辑如下,1,从smartdial_table表单中获取联系人的姓名和id,final int columnIndexName = nameCursor.getColumnIndex(

2018-01-02 22:37:28 511

原创 拨号盘搜索联系人数据库更新分析 --- 之一

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 644

原创 联系人界面分析

2.3联系人界面其实,原生android 系统中,一共有2个联系人显示界面,2个联系人搜索界面,分别属于dialer和contacts中。在Dialer的拨号盘界面如下,可以进行模糊匹配的方法进行搜索,1,例如,输入1时,会搜索出所有号码为1开头的联系人。2,例如,输入6时,不仅会搜索出所有号码为1开头的联系人,还会搜索出联系人首字母为M,N,O的联系人信息

2018-01-02 22:21:08 1110

原创 Dialer 联系人加载

2,联系人加载联系人加载主要是Dialer中的联系人加载,界面如下,界面对应的Fragment为AllContactsFragment,在ListsFragment的内部类ViewPagerAdapter的getItem方法部分代码如下,case TAB_INDEX_ALL_CONTACTS: mAllContactsFragment = new AllContac

2018-01-02 22:04:47 763

原创 通话记录分析 --- 删除 之二

6.2删除通话记录当点击确认按钮时,就开始删除选择的通话记录。MultiPickContactActivity的onClick对MODE_DEFAULT_CALL模式处理如下,showDialog(DIALOG_DEL_CALL);调用流程图如下,MultiPickContactActivity的onCreateDialog对DIALOG_DEL_CALL类型处理如下,

2018-01-02 18:30:55 907

原创 通话记录分析 --- 删除 之一

1.6 批量删除在CallLogActivity中进入批量删除界面的onOptionsItemSelected方法如下,case R.id.delete_all: onDeleteCallLog(); return true;onDeleteCallLog方法如下,startActivity(new Intent(SimContactsConstants.ACTI

2018-01-02 18:30:44 759

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除