<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[怪蜀黍]]></title><description><![CDATA[A super lazy man....]]></description><link>https://blog.youkuaiyun.com/aa375809600</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; aa375809600]]></copyright><item><title><![CDATA[StrictMode分析Registion-StrictMode原理(4)]]></title><link>https://blog.youkuaiyun.com/aa375809600/article/details/125420274</link><guid>https://blog.youkuaiyun.com/aa375809600/article/details/125420274</guid><author>aa375809600</author><pubDate>Thu, 23 Jun 2022 08:56:56 +0800</pubDate><description><![CDATA[这里的Registion主要有两种，分别是Service、BroadCastReceiver:这里先补充一个前置知识点，stopService的流程:
我们需要的检测时机，在removeContextRegistrations，这里面用到了两个成员变量:]]></description><category></category></item><item><title><![CDATA[StrictMode带来的思考-StrictMode原理(5)]]></title><link>https://blog.youkuaiyun.com/aa375809600/article/details/125420239</link><guid>https://blog.youkuaiyun.com/aa375809600/article/details/125420239</guid><author>aa375809600</author><pubDate>Thu, 23 Jun 2022 08:55:30 +0800</pubDate><description><![CDATA[StrictMode总的来说，是一个插桩思想的体现，也是AOP常用到的技术，在系统的各个可能产生问题的函数埋上桩子，等问题发生，将问题暴露到StrictMode。同种思想可以运用到计算函数执行时间，超过某个数值即进行暴露常用的代码插桩方式有两种，分别是类似StrictMode这种的静态插桩，另一种这是在编译时，通过ASM等框架，自动插桩的。ASM动态插桩，可以避免开发者自己每个函数都进行插桩，还是举计算函数时间的例子，我们完全可以写好两个静态函数，之后再函数开始前与结束来插入。
类似此种，对于一些不需要统计]]></description><category></category></item><item><title><![CDATA[StrictMode分析Activity泄漏-StrictMode原理(3)]]></title><link>https://blog.youkuaiyun.com/aa375809600/article/details/125420073</link><guid>https://blog.youkuaiyun.com/aa375809600/article/details/125420073</guid><author>aa375809600</author><pubDate>Thu, 23 Jun 2022 08:37:34 +0800</pubDate><description><![CDATA[StrictMode对于Activity的泄漏检测也是有的。泄漏的日志:
StrictMode的activity泄漏检测，用的是引用计数法，大致思路分为三步:]]></description><category></category></item><item><title><![CDATA[StrictMode卡顿与泄漏检测-StrictMode原理(2)]]></title><link>https://blog.youkuaiyun.com/aa375809600/article/details/125420052</link><guid>https://blog.youkuaiyun.com/aa375809600/article/details/125420052</guid><author>aa375809600</author><pubDate>Thu, 23 Jun 2022 08:35:59 +0800</pubDate><description><![CDATA[StrictMode的关闭检测其实是比较简单的，基本上就是在开启的时候埋桩，释放的时候检测桩子是否有关闭，没有关闭则检测为泄漏。这里有一个预备知识，那就是CloseGuard，它是一个StrictMode专门为了处理此类事情的类，主要包括三个函数:
2.1 IO关闭检测
回顾一下之前的例子
埋炸弹 -首先来看看构造函数:
拆炸弹 - 关闭输出流
爆炸 - 没有调用close便被回收
同理推断其他的流也会有其他的机制来检测泄漏。看卡顿前，我们需要先准备点预备知识，IO读取与写出的预备知识:
我们需要关注的主要]]></description><category></category></item><item><title><![CDATA[使用StrictMode-StrictMode原理(1)]]></title><link>https://blog.youkuaiyun.com/aa375809600/article/details/125420033</link><guid>https://blog.youkuaiyun.com/aa375809600/article/details/125420033</guid><author>aa375809600</author><pubDate>Thu, 23 Jun 2022 08:33:29 +0800</pubDate><description><![CDATA[StrictMode如何使用，StrictMode原理，StrictMode入门]]></description><category></category></item><item><title><![CDATA[五、多路复用-Epoll]]></title><link>https://blog.youkuaiyun.com/aa375809600/article/details/123449141</link><guid>https://blog.youkuaiyun.com/aa375809600/article/details/123449141</guid><author>aa375809600</author><pubDate>Sat, 12 Mar 2022 19:58:42 +0800</pubDate><description><![CDATA[5. 基础函数介绍
先来介绍几个epoll函数的使用:
5.1.epoll_create - 创建文件描述符
#include &lt;sys/epoll.h&gt;
int epoll_create ( int size ); //创建文件描述符,size早期为hash的桶大小，目前无实际意义

5.2.epoll_ctl - 注册监控事件
1 #include &lt;sys/epoll.h&gt;
  /**
  参数
  fd：要操作的文件描述符
  op：指定操作类型
操作类型：
  EPOLL_]]></description><category></category></item><item><title><![CDATA[四、多路复用-Epoll]]></title><link>https://blog.youkuaiyun.com/aa375809600/article/details/123449099</link><guid>https://blog.youkuaiyun.com/aa375809600/article/details/123449099</guid><author>aa375809600</author><pubDate>Sat, 12 Mar 2022 19:53:19 +0800</pubDate><description><![CDATA[4.Epoll
前面讲了poll，还没有解决的两个问题是:

内核态到用户态的拷贝消耗
每次都需要遍历都需要o(n)的时间复杂度

4.1 Epoll示意图
那Epoll其实就是用来解决这两个问题的。我们先来看一下Epoll的一个内核示意图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gaHgvSa6-1647085915316)(./picture/4.epoll_create.png)]

当有连接到来时:

4.2 Epoll实例代码
#include &lt;st]]></description><category></category></item><item><title><![CDATA[三、多路复用-Poll]]></title><link>https://blog.youkuaiyun.com/aa375809600/article/details/123449079</link><guid>https://blog.youkuaiyun.com/aa375809600/article/details/123449079</guid><author>aa375809600</author><pubDate>Sat, 12 Mar 2022 19:51:24 +0800</pubDate><description><![CDATA[3. Poll
前面我们讲到Select的劣势:

rset不可重用，每次都会产生一个新的rset
用户态到内核态整体拷贝仍有较大开销
每次遍历fd数组，都需要o(n)的时间复杂度
rset这个bitmap是有上限的，默认是1024

3.1 Poll实例
那么Poll其实就是为了优化部分劣势的，我们也给出一个Poll的例子:
#include &lt;stdio.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;sys/socket.h&gt;
#includ]]></description><category></category></item><item><title><![CDATA[二、多路复用-selector]]></title><link>https://blog.youkuaiyun.com/aa375809600/article/details/123449041</link><guid>https://blog.youkuaiyun.com/aa375809600/article/details/123449041</guid><author>aa375809600</author><pubDate>Sat, 12 Mar 2022 19:50:02 +0800</pubDate><description><![CDATA[2.Selector
2.1 Selector的Socket示例
我们以Socket和Selector的一般使用为例子画一张图:

接下来看一下实际的代码:
#include &lt;stdio.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;netinet/in.h&gt;
#include &lt;wait.h&gt;
#include &lt;signal.h&gt;
#include &lt;]]></description><category></category></item><item><title><![CDATA[一、多路复用]]></title><link>https://blog.youkuaiyun.com/aa375809600/article/details/123449010</link><guid>https://blog.youkuaiyun.com/aa375809600/article/details/123449010</guid><author>aa375809600</author><pubDate>Sat, 12 Mar 2022 19:47:49 +0800</pubDate><description><![CDATA[1.什么是多路复用
数据通信系统或计算机网络系统中，传输媒体的带宽或容量往往会大于传输单一信号的需求，为了有效地利用通信线路,希望一个信道同时传输多路信号，这就是所谓的多路复用技术(Multiplexing)。采用多路复用技术能把多个信号组合起来在一条物理信道上进行传输，在远距离传输时可大大节省电缆的安装和维护费用。频分多路复用FDM (Frequency Division Multiplexing)和时分多路复用TDM (Time Division Multiplexing)是两种最常用的多路复用技术。
]]></description><category></category></item><item><title><![CDATA[三、mmap不同进程间通信]]></title><link>https://blog.youkuaiyun.com/aa375809600/article/details/122063496</link><guid>https://blog.youkuaiyun.com/aa375809600/article/details/122063496</guid><author>aa375809600</author><pubDate>Tue, 21 Dec 2021 15:38:27 +0800</pubDate><description><![CDATA[1.不同进程间通信
1.1 写进程:
#include &lt;sys/mman.h&gt;
#include &lt;unistd.h&gt;
#include &lt;fcntl.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;cstring&gt;
struct Person {
    int age;
    char name[256];
};
int main() {
    printf("write]]></description><category></category></item><item><title><![CDATA[二、mmap父子进程间通信]]></title><link>https://blog.youkuaiyun.com/aa375809600/article/details/122063358</link><guid>https://blog.youkuaiyun.com/aa375809600/article/details/122063358</guid><author>aa375809600</author><pubDate>Tue, 21 Dec 2021 15:35:28 +0800</pubDate><description><![CDATA[3.父进程与子进程
3.1 父进程与子进程用文件映射的方式来通信
#include &lt;sys/mman.h&gt;
#include &lt;unistd.h&gt;
#include &lt;fcntl.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;cstring&gt;
#include &lt;iostream&gt;
int main() {
    printf("read process");
 ]]></description><category></category></item><item><title><![CDATA[七、如何区分点击与滑动]]></title><link>https://blog.youkuaiyun.com/aa375809600/article/details/121643054</link><guid>https://blog.youkuaiyun.com/aa375809600/article/details/121643054</guid><author>aa375809600</author><pubDate>Tue, 30 Nov 2021 21:20:19 +0800</pubDate><description><![CDATA[Touch事件与TouchSlop
前置知识:坐标系统知识

package com.ifredomer.touchandclick

import android.annotation.SuppressLint
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.MotionEvent
import android.view.ViewConfiguration
import]]></description><category></category></item><item><title><![CDATA[六、View的坐标系统]]></title><link>https://blog.youkuaiyun.com/aa375809600/article/details/121624431</link><guid>https://blog.youkuaiyun.com/aa375809600/article/details/121624431</guid><author>aa375809600</author><pubDate>Tue, 30 Nov 2021 09:04:00 +0800</pubDate><description><![CDATA[View的事件体系
View的坐标系统

从Android3.0开始，View增加了额外的几个参数：

x、y :其中x和y是View左上角的坐标
translationX、translationY :  translationX和translationY是View左上角相对于父容器的偏移量。translationX和translationY的默认值是0

View的四个基本的位置(left、right、buttom、top)参数一样，View也为它们提供了get/set方法，这几个参数的换算关系如下所示。]]></description><category></category></item><item><title><![CDATA[一、ASM简单入门]]></title><link>https://blog.youkuaiyun.com/aa375809600/article/details/120452880</link><guid>https://blog.youkuaiyun.com/aa375809600/article/details/120452880</guid><author>aa375809600</author><pubDate>Fri, 24 Sep 2021 12:59:10 +0800</pubDate><description><![CDATA[1.ASM简介
动态修改Java的class字节码的框架
官网:https://asm.ow2.io/
1.1 ASM的作用

注解+注入：假设有一个判断登录功能，可以使用注解，在方法开始的地方，解析注解，然后插入代码
闭源代码修改:假设有一个闭源的代码内部有bug,可以通过修改字节码的方式来进行修改
统计功能：Android中可以在方法开始和方法结束，插入代码桩，来得出时间，找出anr

1.2 ASM简单使用
使用idea新建工程,首先导入asm:
    implementation("org.ow2]]></description><category></category></item><item><title><![CDATA[十六、View.post和Handler.post的区别]]></title><link>https://blog.youkuaiyun.com/aa375809600/article/details/120029524</link><guid>https://blog.youkuaiyun.com/aa375809600/article/details/120029524</guid><author>aa375809600</author><pubDate>Wed, 01 Sep 2021 00:02:30 +0800</pubDate><description><![CDATA[View.post和Handler.post
1.View.post的实现
首先我们还是先使用View.post的常用场景:
class MainActivity : AppCompatActivity() {
    private val TAG = "MainActivity"
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setCo]]></description><category></category></item><item><title><![CDATA[十五、HandlerThread的使用和源码]]></title><link>https://blog.youkuaiyun.com/aa375809600/article/details/119969175</link><guid>https://blog.youkuaiyun.com/aa375809600/article/details/119969175</guid><author>aa375809600</author><pubDate>Sat, 28 Aug 2021 17:32:59 +0800</pubDate><description><![CDATA[HandlerThread我们都知道是用来在子线程使用Handler的，那我们来看看，如果不用HandlerThread,我们怎么在子线程使用Handler呢？
示例代码片段:
自定义Thread开启Handler
    fun startHandlerWithThread() {
        Thread {
            Looper.prepare()
            mCustomThreadHandler = object : Handler(Looper.myLooper]]></description><category></category></item><item><title><![CDATA[三、内部类与外部类的引用关系]]></title><link>https://blog.youkuaiyun.com/aa375809600/article/details/119919612</link><guid>https://blog.youkuaiyun.com/aa375809600/article/details/119919612</guid><author>aa375809600</author><pubDate>Wed, 25 Aug 2021 21:10:34 +0800</pubDate><description><![CDATA[内部类引用外部类成员的情况
Java的内部类持有外部类的的引用，在字节码层面是怎么设计的呢？我们写一段代码来看看,假设有这么一个内部类Inner，访问了外部类Out，示例代码如下:
public class Outer {
	int outerField = 5;
	class Inner{
		public int InnerMethod(){
			//调用外部类的成员变量
			return outerField+1;
		}
	}
	public Inner getInnter(){
		retur]]></description><category></category></item><item><title><![CDATA[一、mmap使用入门]]></title><link>https://blog.youkuaiyun.com/aa375809600/article/details/119813174</link><guid>https://blog.youkuaiyun.com/aa375809600/article/details/119813174</guid><author>aa375809600</author><pubDate>Thu, 19 Aug 2021 23:17:14 +0800</pubDate><description><![CDATA[mmap是什么？

可以把文件映射到内存，也可以把内存写到文件

接下来我们看看用C++如何写入吧:
#ifndef MMAP_MMMAP_H
#define MMAP_MMMAP_H
#include &lt;string&gt;
#include &lt;sys/mman.h&gt;
#include &lt;unistd.h&gt;
#include &lt;string&gt;
#include &lt;fcntl.h&gt;
using namespace std;
class MMAPOpera]]></description><category></category></item><item><title><![CDATA[二、RandomAccessFile与NIO的读写操作]]></title><link>https://blog.youkuaiyun.com/aa375809600/article/details/119791922</link><guid>https://blog.youkuaiyun.com/aa375809600/article/details/119791922</guid><author>aa375809600</author><pubDate>Thu, 19 Aug 2021 00:12:17 +0800</pubDate><description><![CDATA[本文演示了普通的IO操作和NIO操作读取文件，NIO需要注意一下三点:

NIO是使用两个指针来读取文件，一个postion一个limit，read和write都会改变position的位置，每次使用完，需要交换position和limit
NIO的乱码问题
NIO配合channel使用，别忘了关闭Channel,clear Bytebuffer

package com.halfrest.nio.file;


import java.io.*;
import java.nio.Buffer;
impor]]></description><category></category></item></channel></rss>