自定义博客皮肤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)
  • 收藏
  • 关注

原创 connect方法分析

2,connect方法HttpURLConnectionImpl的connect方法如下,public final void connect() throws IOException { initHttpEngine(); boolean success; do { success = execute(false); } while (!succ

2017-09-20 20:34:21 5997 1

原创 HttpURLConnection对象的获取

1,获取HttpURLConnection对象获取HttpURLConnection对象有不同的方法.1,通过URL对象获取,getUrl = new URL("http://•••/");mSocketAddress = new InetSocketAddress(•••,mProxyPort);Proxy proxy = new Proxy(Proxy.Type.HTTP,mS

2017-09-20 20:21:13 1343

原创 AsyncQueryHandler分析

作用: 对DB数据库进行异步操作,加快其数据处理的速度. 例如几千联系人的数据读取,按正常的处理速度会非常的慢,使用AsyncQueryHandler,这就会大大的加快速度,增加用户的良好体验。为什么会有AsyncQueryHandler?1,若不用AsyncQueryHandler,直接在UI 线程调用ContentResolve去操作数据库,比如查询.如果数据库的数据很少,无需

2017-09-13 19:16:42 408

原创 通话记录分析

1,通话记录1.1 初始化在Dialer中,通话记录信息都是通过CallLogActivity 显示,实际上,真正完成的是CallLogFragment 。CallLogActivity的内部类ViewPagerAdapter的getItem方法如下,public Fragment getItem(int position) { switch (getRtlPositio

2017-09-13 18:55:20 2001

原创 Broadcast 分析 --- 之二

3,发送广播对应不同的广播,发送方法如下:public void sendBroadcast(Intent intent, String receiverPermission)public void sendOrderedBroadcast(Intent intent, String receiverPermission)public void sendStickyBroadcas

2017-08-21 21:34:14 502

原创 service 小结

前言:服务是android中实现程序后台运行的解决方案,非常适合去执行那些不需要和用户交互而且还要求长期运行的任务。服务的运行期不依赖于任何用户界面,即使被程序切换到了后台,或者启动了另外一个进程,服务依然保持正常运行。1,服务所在进程依赖于创建服务的进程,当一个进程被杀掉时,所有依赖于该进程的服务所在进程也会停止运行。2,服务中的代码默认在主线程中执行,如果有耗时操作,必须手动开

2017-08-19 08:39:34 443

原创 bindService 分析---之二

1.2 requestServiceBindingLocked直接看ActiveServices的requestServiceBindingLocked方法,private final boolean requestServiceBindingLocked(ServiceRecord r, IntentBindRecord i, boolean execInFg,

2017-08-19 08:31:58 332

原创 startService 分析--之二

3,服务所在进程服务所在进程调用流程图如下,3.1服务已启动服务已启动,则直接调用sendServiceArgsLocked方法,private final void sendServiceArgsLocked(ServiceRecord r, boolean execInFg, boolean oomAdjusted) throws Tra

2017-08-19 08:14:41 728

原创 Activity 小结

Activity是Android系统中的四大组件之一,是可以包含用户界面的组件,主要用于和用户进行交互,一般的一个应用程序可以包含0个到多个Activity。 1, 生命周期Activity的生命周期如下所示,OnCreate方法:首次创建 Activity 时调用,主要执行一些初始化操作,比如调用setContentView方法加载界面布局资源等,但是不要做一些耗

2017-08-19 07:53:57 558

原创 ContentProvider 源码分析---之三

3, ContentProvider实现调用数据库的方法如下,ContentResolver resolver = getContentResolver();Cursor phoneCursor = resolver.query(Phone.CONTENT_URI,•••实际步骤如下,1,调用getContentResolver方法获取ContextImpl的内部类Applic

2017-08-18 22:03:10 1159

原创 ContentProvider 源码分析---之二

2.1 AMS获取ContentProviderAMS中的ContentProvider方法调用流程图如下,AMS的getContentProviderImpl主要逻辑如下,1,安全检查if ((msg = checkContentProviderPermissionLocked(cpi, r, userId, checkCrossUser))!= null) {

2017-08-18 21:50:36 952

原创 挂断界面流程分析

3,挂断界面分析无论数本地主动挂断还是远程挂断,最后都会finish通话界面。在远程挂点电话流程分析已论述, CallsManager的setCallState方法会更新界面,在此就是finish通话界面。同样的,消息流也会从services telecom走到InCallUI。3.1 services telecomCallsManager的setCallState方

2017-08-16 22:06:23 1043

原创 来电界面以及响铃分析

2,来电界面以及响铃来电时,除了有来电界面,还有响铃。2.1 来电界面在前面已经论述过,也是调用InCallController的onCallAdded方法启动来电界面,大体流程和去电界面相同。不同的是CallList之后的onCallAdded方法,调用流程图如下,CallList之后的onCallAdded方法如下,public void onCallAdd

2017-08-16 22:00:12 2514

原创 去电界面启动分析---之二

1.3启动去电界面在InCallController的onCallAdded方法中有关去电界面的代码如下,inCallService.addCall(parcelableCall);通过binder跨进程调用Incall 的InCallService内部类InCallServiceBinder的addCall方法,public void addCall(ParcelableCall

2017-08-16 21:54:02 865

原创 去电界面启动分析---之一

1,去电界面启动分析在去电流程中论述过,会调用CallsManager的startOutgoingCall启动拨号界面,在该方法中会调用addCall方法,此时还处于services telecom进程中。addCall(call);addCall方法如下,for (CallsManagerListener listener : mListeners) { if (L

2017-08-16 21:36:03 925

原创 远程挂断电话流程分析

3,远程挂断电话流程分析3.1 services Telephony当远程挂断/拒接电话时,GsmCallTracker的handlePollCalls 方法有关代码如下,if (mDroppedDuringPoll.size() > 0) { mCi.getLastCallFailCause( obtainNoPollCompleteMessage(EVENT_G

2017-08-15 21:36:08 2096

原创 远程来电流程分析---之二

2.4 services TelephonyConnectionService的createConnection调用流程图如下,方法代码如下,1,首先根据电话的状态创建一个连接,Connection connection = isUnknown ? onCreateUnknownConnection(callManagerAccount, request): isInc

2017-08-14 21:50:59 759

原创 远程来电流程分析---之一

2,远程来电流程分析2.1 opt telephonyhandlePollCalls中有关notifyNewRingingConnection调用流程图如下,最后会调用GSMPhone的notifyNewRingingConnection方法,if (newRinging != null) { mPhone.notifyNewRingingConnection

2017-08-14 21:46:32 983

原创 主动上报电话信息流程分析

1,主动上报电话信息流程分析和打电话,主动接听,挂断相对应的分别是远程来电,远程挂断电话等等,这时候消息的流程处理刚好相反。首先接收到消息的是Modem层,然后Medoem再上传给RIL层,RIL进程通过sokcet将消息发送给RILJ(framework层的RIL),进入RILJ的processUnsolicited方法.当有来电或者远程挂断时, RIL层发送的是RIL_UNSO

2017-08-13 20:22:38 1307

原创 挂断电话流程分析

4,挂断电话流程分析4.1 InCallUI点击通话界面的挂断按钮,就会调用CallCardFragment的如下代码,mFloatingActionButton.setOnClickListener(new View.OnClickListener() {@Override public void onClick(View v) { getPresenter()

2017-08-13 20:17:37 2524

原创 拒接电话流程分析

3,拒接电话流程分析当有来电时,在来电界面,一般向左滑动是拒接电话,向右滑动是接听电话.因此,拒接的流程和接听的流程几乎完全相同。3.1 InCallUI在InCallUI当中的流程图如下,AnswerFragment的onDecline方法如下,public void onDecline(Context context) { getPresenter()

2017-08-13 20:08:03 1722

原创 接听电话流程分析

2,接听电话流程分析2.1 InCallUI当有来电时,在来电界面,一般向左滑动是拒接电话,向右滑动是接听电话.在AnswerFragment.java中,接听电话会调用到onAnswer方法,调用流程图如下,onAnswer方法如下,public void onAnswer(int videoState, Context context) { Log.d(

2017-08-13 19:55:11 4817

原创 去电流程分析---之二

1.3 services TelephonyTelephony的AndroidManifest有关定义如下,package="com.android.phone"coreApp="true"android:sharedUserId="android.uid.phone"android:sharedUserLabel="@string/phoneAppLabel"Telephon

2017-08-13 19:44:50 681

原创 去电流程分析---之一

1,去电流程分析1.1 app dialer拨号盘界面有关拨号的部分由DialpadFragment.java实现,无论是单卡还是双卡,当点击拨号按键时,最后都会调用handleDialButtonPressed方法进行处理,调用流程图如下,在handleDialButtonPressed方法中,首先进行号码的有效性检查,然后调用DialerUtils的startAct

2017-08-13 19:38:28 1849 1

原创 短信接收流程分析

5,短信接收如果有信息,RIL层会主动上报消息,RIL.java 的processUnsolicited方法会进行分发,根据网络制式,信息分为GSM和CDMA,在此就以GSM信息为例论述, processUnsolicited方法对RIL_UNSOL_RESPONSE_NEW_SMS消息处理逻辑如下,1,调用responseString方法从ril层读取消息内容,case RIL_

2017-08-09 21:22:22 4043

原创 多收件人发送流程分析

4,多收件人发送和长短信发送类似,多收件人发送也是逐条发送,不同的是,多收件人发送是一条短信发送完成之后才发送另外一条。在第二章的最后,一条短信发送完成之后,最后会调用SMSDispatcher的handleSendComplete方法,主要是根据发送的结果分别进行处理,主要逻辑如下,1,首先获取发送结果和intent,SmsTracker tracker = (SmsTrac

2017-08-09 21:21:59 569

原创 长短信发送

3,长短信发送在上个章节的论述中, SmsManager的sendMultipartTextMessage方法中有关长短信的发送代码如下,ISms iccISms = getISmsServiceOrThrow();if (iccISms != null) { iccISms.sendMultipartTextForSubscriberWithOptions(getSubsc

2017-08-09 21:12:24 1699

原创 普通短信发送流程

2,普通短信发送流程在此仅分析普通短信的发送流程, SmsManager 的sendTextMessage方法如下,ISms iccISms = getISmsServiceOrThrow();if (iccISms != null) { iccISms.sendTextForSubscriberWithOptions(getSubscriptionId(), Ac

2017-08-09 21:08:52 3043

原创 短信在Mms中处理流程

1,短信发送流程本文基于Android 6.0.在Android 系统的Mms中, ComposeMessageActivity发送短信最后都会调用confirmSendMessageIfNeeded方法,调用流程图如下,主要逻辑如下,1,首先进行SIM卡检测,int slot = SubscriptionManager.getSlotId(SmsManager.g

2017-08-09 21:03:26 2149

原创 Resources Hook

8, Resources Hook由于资源做过分区,则在Android L后直接将插件包的apk地址 addAssetPath 之后就可以使用该插件的资源。LoadedPlugin的createResources方法如下,Resources resources = new ResourcesManager().createResources(context, apk.getAbsolu

2017-08-02 20:36:50 787

原创 BroadcastReceiver Hook

6,BroadcastReceiver HookBroadcastReceiver过程在插件加载时论述过,并且在插件加载的过程中完成。LoadedPlugin的构造方法中有关BroadcastReceiver方法如下,Map receivers = new HashMap();for (PackageParser.Activity receiver : this.mPackage.r

2017-08-02 20:31:48 849

原创 ContentProvider Hook解析

5, ContentProvider Hook解析ContentProvider和service一样,也是通过代理分发机制进行Hook,并且比service更简单,没有周期的处理,只有几个简单的方法,例如, query/insert/delete/update等,在AndroidManifest中注册了一个多进程的ContentProvider,<provider andro

2017-08-02 20:31:23 2163

原创 Service Hook解析

4,Service Hook解析Service/ContentProvider由于没有Activity那么复杂的启动过程,并且Activity的生命周期是由用户交互决定的,而Service的声明周期是主动通过代码调用的。因此虽然也有替换/还原过程,但是有点不同,是采用代理分发技术。就是启动宿主的Service/ContentProvider对象,然后管理插件的Service/Conte

2017-08-02 20:23:30 2544

原创 Activity Hook解析

3, Activity Hook解析VirtualAPK框架中的Activity Hook主要包括以下步骤:1,穿马甲(替换)过程2,脱马甲(还原)为什么有这些过程,因为组件需要在AndroidManifest中注册的,而插件apk中的组件是不可能预先知晓名字,提前注册中宿主apk中的,所以首先替换成在AndroidManifest中注册的组件,在system_server进程

2017-08-02 20:15:22 1104

原创 插件加载

2,插件加载插件加载调用的是PluginManager的loadPlugin方法,该方法主要逻辑如下,1,利用LoadedPlugin来解析和加载插件LoadedPlugin plugin = LoadedPlugin.create(this, this.mContext, apk);2,将插件的包名和LoadedPlugin对象放入哈希表mPlugins中,this.mPlu

2017-08-02 20:04:18 858

原创 PluginManager分析

1, PluginManagerPluginManager框架的初始化以及插件的加载都在PluginManager中, PluginManager的getInstance方法调用流程图如下,PluginManager的getInstance方法如下,public static PluginManager getInstance(Context base) {

2017-08-02 19:55:09 3861

原创 VirtualAPK 框架简介

前言:    VirtualAPK是滴滴出行自研的一款优秀的插件化框架,主要有如下几个特性:1, 功能完备支持几乎所有的Android特性;2,四大组件四大组件均不需要在宿主manifest中预注册,每个组件都有完整的生命周期。Activity:支持显示和隐式调用,支持Activity的theme和LaunchMode,支持透明主题;Service:支持显示和隐式调用,

2017-08-02 19:50:25 3888

原创 RemoteCallbackList 机制分析

前言:RemoteCallbackList主要用于aidl的跨进程通信,并且主要是服务端回调客户端的方法。回调的aidl文件如下,package com.•••;interface ICallback { void onGetservice(String info);}主要分为2步,private final RemoteCallbackList mRemote

2017-08-02 18:44:50 9401

原创 插件进程死亡检测

3插件进程死亡检测插件进程死亡时,宿主是如何知道的呢?通过RemoteCallbackList机制。还有万一宿主挂掉了呢,插件进程是如何知道的?插件进程启动的时候,创建宿主Application并调用其onCreate(),因此会调用到PluginHelper的applicationOnCreate()方法。前面论述过,除了进行Hook 初始化之外,还进行了启动并绑定PluginM

2017-08-02 18:43:50 762

原创 进程管理--之三

2.4 进程垃圾回收2.4.1 进程回收MyActivityManagerService的runProcessGC主要逻辑如下,1,调用ActivityManager的getRunningAppProcesses方法获取当前宿主框架的运行进程,ActivityManager am = (ActivityManager) mHostContext.getSystemService(C

2017-08-01 08:03:38 441

空空如也

空空如也

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

TA关注的人

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