<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[每个片段都值得深深纪念]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Check_Out</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Check_Out]]></copyright><item><title><![CDATA[系统启动流程分析之SystemServiceManager的startService函数流程分析]]></title><link>https://blog.youkuaiyun.com/Check_Out/article/details/122574635</link><guid>https://blog.youkuaiyun.com/Check_Out/article/details/122574635</guid><author>Check_Out</author><pubDate>Wed, 19 Jan 2022 10:07:39 +0800</pubDate><description><![CDATA[在SystemServer的启动流程中，初始化了一个SystemServiceManager对象，然后使用这个对象的startService启动了多个服务对象，因此，今天我们单独将这个函数拎出来分析一下
SystemServiceManager初始化
SystemServiceManager的初始化时在SystemServer的run函数中
// Create the system service manager.
mSystemServiceManager = new SystemServiceManag]]></description><category></category></item><item><title><![CDATA[安卓源码中打印调用堆栈的方法]]></title><link>https://blog.youkuaiyun.com/Check_Out/article/details/122493780</link><guid>https://blog.youkuaiyun.com/Check_Out/article/details/122493780</guid><author>Check_Out</author><pubDate>Sat, 15 Jan 2022 09:30:00 +0800</pubDate><description><![CDATA[Native层打印调用堆栈

首先，先进入需要添加堆栈的进程代码，并在其Android.bp中添加shared_libs libutilscallstack


cc_library {
    name: "libbinder",
    ......
    shared_libs: [
        "liblog",
        "libcutils",
        "libutils",
		"libutilscallstack",
    ],
    ......
}

然后在对应的]]></description><category></category></item><item><title><![CDATA[ServiceManager添加的系统服务汇总]]></title><link>https://blog.youkuaiyun.com/Check_Out/article/details/111704951</link><guid>https://blog.youkuaiyun.com/Check_Out/article/details/111704951</guid><author>Check_Out</author><pubDate>Sat, 26 Dec 2020 20:59:03 +0800</pubDate><description><![CDATA[SystemServer.java

ServiceManager.addService("sec_key_att_app_id_provider", new KeyAttestationApplicationIdProviderService(context));

ServiceManager.addService("scheduling_policy", new SchedulingPolicyService());

telephonyRegistry = new TelephonyRegistr.]]></description><category></category></item><item><title><![CDATA[C基础文件输入输出操作之write和read函数]]></title><link>https://blog.youkuaiyun.com/Check_Out/article/details/109655069</link><guid>https://blog.youkuaiyun.com/Check_Out/article/details/109655069</guid><author>Check_Out</author><pubDate>Thu, 12 Nov 2020 20:13:40 +0800</pubDate><description><![CDATA[一、 write函数

1 函数头文件

&lt;unistd.h&gt;

2 函数原型

ssize_t write(int handle, void * buf, int len);

3 参数说明

handle----文件句柄，主要是通过open函数打开指定文件得到的对应指定文件的索  引
void * buf----表明要写入指定文件的数据，如char *型字符数组
int len----写入指定文件的数据大小（数据的长度）

4 返回值说明

返回写入指定文件操作的结果，代表实际写...]]></description><category></category></item><item><title><![CDATA[C Prime Plus编程练习（第十一章）]]></title><link>https://blog.youkuaiyun.com/Check_Out/article/details/84845533</link><guid>https://blog.youkuaiyun.com/Check_Out/article/details/84845533</guid><author>Check_Out</author><pubDate>Wed, 09 Jan 2019 21:19:05 +0800</pubDate><description><![CDATA[1. 设计并测试一个函数，从输入中获取下n个字符（包括空白、制表符、换行符），把结果储存在一个数组里，它的地址被传递作为一个参数


#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;string.h&amp;gt;

#define STRLEN 20

int main(void) {
    char words[STRLEN];

    int spaceNum = 0...]]></description><category></category></item><item><title><![CDATA[C Prime Plus编程练习（第十章）]]></title><link>https://blog.youkuaiyun.com/Check_Out/article/details/84642310</link><guid>https://blog.youkuaiyun.com/Check_Out/article/details/84642310</guid><author>Check_Out</author><pubDate>Wed, 05 Dec 2018 23:32:21 +0800</pubDate><description><![CDATA[1. 修改程序清单10.7的rain.c程序，用指针进行计算（仍然要声明并初始化数组）


/*
 * rain.c
 * 计算每年的总降水量、年平均降水量和5年中每月的平均降水量
 */
#include &amp;lt;stdio.h&amp;gt;

#define MONTHS 12
#define YEARS 5

const float rain[YEARS][MONTHS] = { { 4.3, 4...]]></description><category></category></item><item><title><![CDATA[C Prime Plus编程练习（第二章）]]></title><link>https://blog.youkuaiyun.com/Check_Out/article/details/84642054</link><guid>https://blog.youkuaiyun.com/Check_Out/article/details/84642054</guid><author>Check_Out</author><pubDate>Fri, 30 Nov 2018 00:06:38 +0800</pubDate><description><![CDATA[1.


#include &amp;lt;stdio.h&amp;gt;

int main(void) {
	printf(&quot;Gustav Mahler\n&quot;);
	printf(&quot;Gustav \nMahler\n&quot;);
	printf(&quot;Gustav&quot;);
	printf(&quot; Mahler\n&quot;);
    return 0;
}


3.


#include &amp;lt;stdio.h&amp;gt;

int ]]></description><category></category></item><item><title><![CDATA[（O）Settings分析之主界面加载流程]]></title><link>https://blog.youkuaiyun.com/Check_Out/article/details/81319903</link><guid>https://blog.youkuaiyun.com/Check_Out/article/details/81319903</guid><author>Check_Out</author><pubDate>Tue, 31 Jul 2018 20:57:17 +0800</pubDate><description><![CDATA[1.    前言
本篇主要是为了记录Settings主界面的加载流程,为以后深入分析和记录在Settings应用做准备

2.    流程
    2.1    Settings 文件分析
    首先,我们要分析Settings应用主界面的加载工作,需要先确认哪个文件为此应用的主Activity,从AndroidManifest.xml文件中


&amp;lt;activity-alias andro...]]></description><category></category></item><item><title><![CDATA[（O）Settings分析之DrawerLayout布局分析]]></title><link>https://blog.youkuaiyun.com/Check_Out/article/details/81297983</link><guid>https://blog.youkuaiyun.com/Check_Out/article/details/81297983</guid><author>Check_Out</author><pubDate>Tue, 31 Jul 2018 11:12:13 +0800</pubDate><description><![CDATA[DrawerLayout是添加在v4包中的一个布局类

Google官方对于DrawerLayout的解释如下：


DrawerLayout acts as a top-level container for window content that allows for interactive &quot;Navigation Drawer.drawer&quot; views to be pulled out f...]]></description><category></category></item><item><title><![CDATA[（O）Telephony分析之通话流程分析（三）拨打电话流程分析（下）]]></title><link>https://blog.youkuaiyun.com/Check_Out/article/details/79064850</link><guid>https://blog.youkuaiyun.com/Check_Out/article/details/79064850</guid><author>Check_Out</author><pubDate>Mon, 15 Jan 2018 15:22:58 +0800</pubDate><description><![CDATA[三.Call的建立和传送
先来看下代码

static void processOutgoingCallIntent(
        Context context,
        CallsManager callsManager,
        Intent intent) {
    ......
    // 拨打电话状态依旧为语音通话
    final int videoS]]></description><category></category></item><item><title><![CDATA[（O）Telephony分析之通话流程分析（二）拨打电话流程分析（上）]]></title><link>https://blog.youkuaiyun.com/Check_Out/article/details/79046387</link><guid>https://blog.youkuaiyun.com/Check_Out/article/details/79046387</guid><author>Check_Out</author><pubDate>Fri, 12 Jan 2018 17:46:54 +0800</pubDate><description><![CDATA[拨打电话，是从通话的拨号盘开始的，而拨号盘的界面是在DialpadFragment，因此，需要从这个地方进行分析
一.拨号盘界面拨号流程
public void onClick(View view) {
    ......
    if (resId == R.id.dialpad_floating_action_button) {
        view.performHapticFee]]></description><category></category></item><item><title><![CDATA[（O）Telephony分析之通话流程分析（一） TelecomManager的getTelecomService方法解析]]></title><link>https://blog.youkuaiyun.com/Check_Out/article/details/79034877</link><guid>https://blog.youkuaiyun.com/Check_Out/article/details/79034877</guid><author>Check_Out</author><pubDate>Thu, 11 Jan 2018 15:43:37 +0800</pubDate><description><![CDATA[这段时间，在研究Telephony相关的通话流程，虽然从书上看到通话流程，但是自己在分析Google 8.0的代码的时候，发现依旧有些复杂，现在就将自己的研究成果记录一下，以备后续查阅。
一.TelecomLoaderService的初始化
在此前的Android机器启动的流程中，分析过，SystemServer中启动系统的所有服务和进程，而在此文件中，我们会发现，TelecomLoaderS]]></description><category></category></item><item><title><![CDATA[Android实现圆角背景点击效果]]></title><link>https://blog.youkuaiyun.com/Check_Out/article/details/78658783</link><guid>https://blog.youkuaiyun.com/Check_Out/article/details/78658783</guid><author>Check_Out</author><pubDate>Tue, 28 Nov 2017 20:23:03 +0800</pubDate><description><![CDATA[Android实现圆角背景点击效果]]></description><category></category></item><item><title><![CDATA[ContentProvider分析（一）之TelephonyProvider的初始化]]></title><link>https://blog.youkuaiyun.com/Check_Out/article/details/78002908</link><guid>https://blog.youkuaiyun.com/Check_Out/article/details/78002908</guid><author>Check_Out</author><pubDate>Sat, 16 Sep 2017 13:38:58 +0800</pubDate><description><![CDATA[在Telephony分析系列中，我们分析过PhoneApp的启动，是通过ActivityThread中调用Instrumentation类的onCreate方法来逐步启动PhoneApp应用的，但是当我们在分析PhoneApp的时候，发现在PhoneGlobals的onCreate方法中，TelephonyProvider的数据库已经建立（在查找APN的相关数据的时候），那么TelephonyPr]]></description><category></category></item><item><title><![CDATA[（N）Telephony分析（七）之DataConnection建立]]></title><link>https://blog.youkuaiyun.com/Check_Out/article/details/77990922</link><guid>https://blog.youkuaiyun.com/Check_Out/article/details/77990922</guid><author>Check_Out</author><pubDate>Fri, 15 Sep 2017 15:19:19 +0800</pubDate><description><![CDATA[在前面，我们分析过DcTracker的初始化的时候，我们有看过，在DcTracker的构造方法中，调用有如下这个方法
private void registerForAllEvents() {
    mPhone.mCi.registerForAvailable(this, DctConstants.EVENT_RADIO_AVAILABLE, null);
    mPhone.mCi.re]]></description><category></category></item><item><title><![CDATA[（N）Telephony分析（六）之DcTracker的requestNetwork分析]]></title><link>https://blog.youkuaiyun.com/Check_Out/article/details/77986623</link><guid>https://blog.youkuaiyun.com/Check_Out/article/details/77986623</guid><author>Check_Out</author><pubDate>Thu, 14 Sep 2017 23:17:01 +0800</pubDate><description><![CDATA[在PhoneApp的初始化中，我们分析到，TelephonyNetworkFactory的初始化，最终会调用到DcTracker的requestNetwork方法
private void onNeedNetworkFor(Message msg) {
    NetworkRequest networkRequest = (NetworkRequest)msg.obj;
    boolean]]></description><category></category></item><item><title><![CDATA[（N）Telephony分析（五）之DcTracker的初始化]]></title><link>https://blog.youkuaiyun.com/Check_Out/article/details/77980173</link><guid>https://blog.youkuaiyun.com/Check_Out/article/details/77980173</guid><author>Check_Out</author><pubDate>Thu, 14 Sep 2017 14:37:50 +0800</pubDate><description><![CDATA[DcTracker对象的初始化，需要从前文中进行分析，我们来看看其的初始化
PhoneFactory.java
public static void makeDefaultPhone(Context context) {
    ......
    for (int i = 0; i < numPhones; i++) {
           Phone phone = null;]]></description><category></category></item><item><title><![CDATA[（N）Telephony分析（四）之PhoneApp初始化分析]]></title><link>https://blog.youkuaiyun.com/Check_Out/article/details/77971491</link><guid>https://blog.youkuaiyun.com/Check_Out/article/details/77971491</guid><author>Check_Out</author><pubDate>Wed, 13 Sep 2017 21:43:35 +0800</pubDate><description><![CDATA[从上一篇中，分析到，调用了PhoneApp的onCreate方法，从此进入了PhoneApp的世界，那么就需要看看其onCreate方法中究竟做了什么
public void onCreate() {
        if (UserHandle.myUserId() == 0) {
            // We are running as the primary user, so sh]]></description><category></category></item><item><title><![CDATA[Eclipse编译项目出现问题]]></title><link>https://blog.youkuaiyun.com/Check_Out/article/details/77716425</link><guid>https://blog.youkuaiyun.com/Check_Out/article/details/77716425</guid><author>Check_Out</author><pubDate>Wed, 30 Aug 2017 15:17:16 +0800</pubDate><description><![CDATA[今天在使用eclipse编译项目时，出现如下的问题

出现这个问题的原因是，在编译项目的时候，使用的buildtools为sdk最新的编译工具，只需要在project.properties文件中添加sdk.buildtools=23.0.1即可]]></description><category></category></item><item><title><![CDATA[（O）ServiceManager分析（一）之BinderInternal.getContextObject]]></title><link>https://blog.youkuaiyun.com/Check_Out/article/details/77368932</link><guid>https://blog.youkuaiyun.com/Check_Out/article/details/77368932</guid><author>Check_Out</author><pubDate>Fri, 18 Aug 2017 15:07:36 +0800</pubDate><description><![CDATA[1. Binder， JNI函数的注册

在分析BinderInternal的getContextObject函数之前，我们有必要先看一下Binder中JNI函数的注册情况
android_os_Binder.cpp
int register_android_os_Binder(JNIEnv* env)
{
	// Leo, 注册Binder的相关JNI函数
    if (int_reg]]></description><category></category></item></channel></rss>