- 博客(155)
- 资源 (5)
- 收藏
- 关注
原创 StrictMode分析Registion-StrictMode原理(4)
这里的Registion主要有两种,分别是Service、BroadCastReceiver:这里先补充一个前置知识点,stopService的流程:我们需要的检测时机,在removeContextRegistrations,这里面用到了两个成员变量:
2022-06-23 08:56:56
456
1
原创 StrictMode带来的思考-StrictMode原理(5)
StrictMode总的来说,是一个插桩思想的体现,也是AOP常用到的技术,在系统的各个可能产生问题的函数埋上桩子,等问题发生,将问题暴露到StrictMode。同种思想可以运用到计算函数执行时间,超过某个数值即进行暴露常用的代码插桩方式有两种,分别是类似StrictMode这种的静态插桩,另一种这是在编译时,通过ASM等框架,自动插桩的。ASM动态插桩,可以避免开发者自己每个函数都进行插桩,还是举计算函数时间的例子,我们完全可以写好两个静态函数,之后再函数开始前与结束来插入。类似此种,对于一些不需要统计
2022-06-23 08:55:30
266
原创 StrictMode分析Activity泄漏-StrictMode原理(3)
StrictMode对于Activity的泄漏检测也是有的。泄漏的日志:StrictMode的activity泄漏检测,用的是引用计数法,大致思路分为三步:
2022-06-23 08:37:34
828
原创 StrictMode卡顿与泄漏检测-StrictMode原理(2)
StrictMode的关闭检测其实是比较简单的,基本上就是在开启的时候埋桩,释放的时候检测桩子是否有关闭,没有关闭则检测为泄漏。这里有一个预备知识,那就是CloseGuard,它是一个StrictMode专门为了处理此类事情的类,主要包括三个函数:2.1 IO关闭检测回顾一下之前的例子埋炸弹 -首先来看看构造函数:拆炸弹 - 关闭输出流爆炸 - 没有调用close便被回收同理推断其他的流也会有其他的机制来检测泄漏。看卡顿前,我们需要先准备点预备知识,IO读取与写出的预备知识:我们需要关注的主要
2022-06-23 08:35:59
740
原创 五、多路复用-Epoll
5. 基础函数介绍先来介绍几个epoll函数的使用:5.1.epoll_create - 创建文件描述符#include <sys/epoll.h>int epoll_create ( int size ); //创建文件描述符,size早期为hash的桶大小,目前无实际意义5.2.epoll_ctl - 注册监控事件1 #include <sys/epoll.h> /** 参数 fd:要操作的文件描述符 op:指定操作类型操作类型: EPOLL_
2022-03-12 19:58:42
345
原创 四、多路复用-Epoll
4.Epoll前面讲了poll,还没有解决的两个问题是:内核态到用户态的拷贝消耗每次都需要遍历都需要o(n)的时间复杂度4.1 Epoll示意图那Epoll其实就是用来解决这两个问题的。我们先来看一下Epoll的一个内核示意图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gaHgvSa6-1647085915316)(./picture/4.epoll_create.png)]当有连接到来时:4.2 Epoll实例代码#include <st
2022-03-12 19:53:19
4470
原创 三、多路复用-Poll
3. Poll前面我们讲到Select的劣势:rset不可重用,每次都会产生一个新的rset用户态到内核态整体拷贝仍有较大开销每次遍历fd数组,都需要o(n)的时间复杂度rset这个bitmap是有上限的,默认是10243.1 Poll实例那么Poll其实就是为了优化部分劣势的,我们也给出一个Poll的例子:#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#includ
2022-03-12 19:51:24
725
原创 二、多路复用-selector
2.Selector2.1 Selector的Socket示例我们以Socket和Selector的一般使用为例子画一张图:接下来看一下实际的代码:#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <wait.h>#include <signal.h>#include <
2022-03-12 19:50:02
1171
原创 一、多路复用
1.什么是多路复用数据通信系统或计算机网络系统中,传输媒体的带宽或容量往往会大于传输单一信号的需求,为了有效地利用通信线路,希望一个信道同时传输多路信号,这就是所谓的多路复用技术(Multiplexing)。采用多路复用技术能把多个信号组合起来在一条物理信道上进行传输,在远距离传输时可大大节省电缆的安装和维护费用。频分多路复用FDM (Frequency Division Multiplexing)和时分多路复用TDM (Time Division Multiplexing)是两种最常用的多路复用技术。
2022-03-12 19:47:49
3123
原创 三、mmap不同进程间通信
1.不同进程间通信1.1 写进程:#include <sys/mman.h>#include <unistd.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <cstring>struct Person { int age; char name[256];};int main() { printf("write
2021-12-21 15:38:27
458
原创 二、mmap父子进程间通信
3.父进程与子进程3.1 父进程与子进程用文件映射的方式来通信#include <sys/mman.h>#include <unistd.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <cstring>#include <iostream>int main() { printf("read process");
2021-12-21 15:35:28
449
原创 七、如何区分点击与滑动
Touch事件与TouchSlop前置知识:坐标系统知识package com.ifredomer.touchandclickimport android.annotation.SuppressLintimport androidx.appcompat.app.AppCompatActivityimport android.os.Bundleimport android.view.MotionEventimport android.view.ViewConfigurationimport
2021-11-30 21:20:19
2441
原创 六、View的坐标系统
View的事件体系View的坐标系统从Android3.0开始,View增加了额外的几个参数:x、y :其中x和y是View左上角的坐标translationX、translationY : translationX和translationY是View左上角相对于父容器的偏移量。translationX和translationY的默认值是0View的四个基本的位置(left、right、buttom、top)参数一样,View也为它们提供了get/set方法,这几个参数的换算关系如下所示。
2021-11-30 09:04:00
1988
原创 一、ASM简单入门
1.ASM简介动态修改Java的class字节码的框架官网:https://asm.ow2.io/1.1 ASM的作用注解+注入:假设有一个判断登录功能,可以使用注解,在方法开始的地方,解析注解,然后插入代码闭源代码修改:假设有一个闭源的代码内部有bug,可以通过修改字节码的方式来进行修改统计功能:Android中可以在方法开始和方法结束,插入代码桩,来得出时间,找出anr1.2 ASM简单使用使用idea新建工程,首先导入asm: implementation("org.ow2
2021-09-24 12:59:10
1411
原创 十六、View.post和Handler.post的区别
View.post和Handler.post1.View.post的实现首先我们还是先使用View.post的常用场景:class MainActivity : AppCompatActivity() { private val TAG = "MainActivity" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setCo
2021-09-01 00:02:30
847
原创 十五、HandlerThread的使用和源码
HandlerThread我们都知道是用来在子线程使用Handler的,那我们来看看,如果不用HandlerThread,我们怎么在子线程使用Handler呢?示例代码片段:自定义Thread开启Handler fun startHandlerWithThread() { Thread { Looper.prepare() mCustomThreadHandler = object : Handler(Looper.myLooper
2021-08-28 17:32:59
121
原创 三、内部类与外部类的引用关系
内部类引用外部类成员的情况Java的内部类持有外部类的的引用,在字节码层面是怎么设计的呢?我们写一段代码来看看,假设有这么一个内部类Inner,访问了外部类Out,示例代码如下:public class Outer { int outerField = 5; class Inner{ public int InnerMethod(){ //调用外部类的成员变量 return outerField+1; } } public Inner getInnter(){ retur
2021-08-25 21:10:34
709
原创 一、mmap使用入门
mmap是什么?可以把文件映射到内存,也可以把内存写到文件接下来我们看看用C++如何写入吧:#ifndef MMAP_MMMAP_H#define MMAP_MMMAP_H#include <string>#include <sys/mman.h>#include <unistd.h>#include <string>#include <fcntl.h>using namespace std;class MMAPOpera
2021-08-19 23:17:14
682
原创 二、RandomAccessFile与NIO的读写操作
本文演示了普通的IO操作和NIO操作读取文件,NIO需要注意一下三点:NIO是使用两个指针来读取文件,一个postion一个limit,read和write都会改变position的位置,每次使用完,需要交换position和limitNIO的乱码问题NIO配合channel使用,别忘了关闭Channel,clear Bytebufferpackage com.halfrest.nio.file;import java.io.*;import java.nio.Buffer;impor
2021-08-19 00:12:17
555
原创 一、重写了equals为什么还要重写hashcode
一、为什么重写了equals要重写hashcode?有这么一个场景,当用户登录时,来了两个user,有name和age,并且还有手机号,手机号相同的我认为是一个用户。那么我们很容易得到以下代码:import java.util.HashMap;public class MockLogin { static class User { public int age; public String name; public String mobile;
2021-08-11 09:31:36
213
原创 七、JNI动态注册
JNI的静态注册就是Javah生成头文件,本章第一篇已经讲过,现在我们来讲讲第二种方式,JNI动态注册。首先是module的build.gradle:android { compileSdkVersion 30 buildToolsVersion "30.0.3" defaultConfig { applicationId "com.jhzl.a7_jni_2way" minSdkVersion 21 targetSdkVersio
2021-08-03 22:52:04
226
原创 五、INVISIBLE、GONE、VISIBLE的实现逻辑
INVISIBLE、GONE、VISIBLE这三个变量,应该是我们最常用的了,有没有思考系统是怎么实现的呢?ViewGroup首先要明确一点,通常使用的View都是放在ViewGroup以及其子类的。大小都是在父控件的onMeasure和onLayout来进行确定...
2021-01-31 19:56:47
3230
3
原创 四、增加横向逻辑
上一章我们已经增加了指定方向的attr.接下来,接下来我们来看一下,怎么横向测量和布局。先晒一下我们的xml <com.jhzl.customview.MineLineLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:background="@
2021-01-28 22:07:37
131
原创 三、自定义attr属性,指定方向
LinearLayout的orientationorientation是支持横向和竖向的,且是直接写在布局里面的,那么我们自定义的话是怎么来实现呢?这里就要延伸出一个自定义属性的东西。使用步骤在attr.xml里面配置<?xml version="1.0" encoding="utf-8"?><resources> <declare-styleable name="MineLineLayout"> <attr name="andro
2021-01-28 19:53:36
464
1
原创 十四、Android常用控件使用指南(持续更新)
Shape圆角矩形shape:<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <!-- rectangle表示为矩形 --> <!-- 填充的颜色 --> <solid android:color="#FAFAFA" /> <!-- 边框的颜色和粗细 -->
2021-01-07 23:52:06
246
原创 二、自定义垂直ViewGroup如何设置margin
ViewGroup设置margin累计分为三步:1.获取margin2.onMeasure里面加上margin3.onLayout布局设置margin获取margin首先呢,ViewGroup是自带的MarginLayoutParams的,但是在addView时,查看源码: public void addView(View child, int index) { if (child == null) { throw new IllegalArgu.
2020-12-19 06:01:45
1047
1
原创 一、自定义一个竖直Layout
垂直Layout我们想到的第一直觉肯定是ViewGroup,自定义一个ViewGroup通常包含onMeasure(测量),onLayout(布局)。onMeasureonMeasure是一个父往子依次measure的过程。当我们要画一个竖直的Layout.我们应该得到下图:父控件的高度是子控件的高度和。设自定义viewgroup有三个EditText<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android
2020-12-18 21:18:26
274
原创 十三、Android如何使用SystemTrace
SystemTrace解决的问题分析api耗时,解决应用程序卡顿的问题如何使用现在代码中埋点: Trace.beginSection("app onCreate");//开始点 Trace.endSection();//结束点python systrace.py -t 5 -o ~/Trace/mytrace3.html -a packagename需要说明的是位于android sdk/platform-tools文件夹里面,python版本为2.7需要安装的python插件pip
2020-11-17 14:37:14
1233
原创 十二、Android的沉浸与动态沉浸
Window的各种效果默认的效果导航栏显示,内容处于导航键上方style <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <it
2020-11-06 19:00:12
312
1
转载 十一、Android坐标系
前言Android View体系是界面编程的核心,他的重要性不亚于Android四大组件,在这个系列中我会陆续讲到View坐标系、View的滑动、View的事件分发等文章来逐步介绍Android View体系。1.View简介View是Android所有控件的基类,同时ViewGroup也是继承自View,看下面这张图我们就会有一个直观的了解:知道了View的层级关系有助于对View的理解...
2020-04-04 21:17:28
301
原创 粒子效果
粒子效果1.基本概念:Duration:粒子发射器,发射粒子的时间。单位为S(秒)。Looping:是否开启。如果开启了循环,Duration值只要大于最小值0.10即可。Prewarm:是否开启预热。只有在开启的循环的时候,预热才有效果,粒子量相似发射了一个粒子周期。Start Delay:预热延迟。游戏开始多长时间后,预热开启。单位为S。Start Lifetime:粒子从发射器...
2020-03-11 14:44:37
2360
原创 1.Unity 2D背景图轮换
2D游戏中,背景图轮换是一个非常常用的场景,轮换的方式现在有两种,一种是两张图片不断改变坐标另一种是使用shader,原理相同,同样都是坐标轮换方式一:两张图片不断改变坐标,当第二张到达第一张图片图片的位置,两个交换循环:布局如图代码绑定在BG上,代码如下:using System.Collections;using System.Collections.Generic;using...
2020-02-21 11:15:38
2435
原创 一、图片灰度算法
文章目录灰度算法简介一.opencv灰度实现二.灰度算法手动实现灰度算法简介在计算机领域中,灰度(Gray scale)数字图像是每个像素只有一个采样颜色的图像。这类图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以是任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑白两种颜色,灰度图像在黑色与白色之间还有许多级的颜色...
2019-07-03 19:44:45
5448
原创 五、选择排序
文章目录原理原理每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法package exercise.array;import java.util.Arrays;public class SelectSort {...
2019-02-13 12:59:27
794
原创 九、Python的可变参数
写在前面的话传递参数的行为对于现在编程语言来说,再寻常不过的概念参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。 - 来自 wikipedia先来看一个例子:# 来源于 https://docs.python.org/2/library/itertools.htmldef chain(*iterables): for...
2018-11-27 21:28:57
952
4
原创 四、常用的ffmpeg指令
1.抽取音频ffmpeg -i dummy1.mp4 -vn -y -acodec copy dummy1.aacffmpeg -i dummy1.mp4 -vn -y -acodec copy dummy1.m4a2.抽取视频ffmpeg -i dummy1.mkv -vcodec copy –an dummy1.mp43.音视频合成ffmpeg -i video1.av...
2018-11-26 23:46:52
721
原创 三、ffmpeg获取视频信息
获取信息是视频编解码的基础,ffmpeg提供了非常方便的获取信息的方式,代码也比较简单.我就直接贴出来了import ffmpegimport sys# 执行probe执行probe = ffmpeg.probe("dummy1.mp4")video_stream = next((stream for stream in probe['streams'] if stream['code...
2018-11-26 08:52:12
8117
9
原创 二、ffmpeg输入输出
这里我们使用Python作为编程语言,非常方便实验,搭配anaconda.可以实现跨平台的效果.1.环境配置:1.下载anaconda:https://www.anaconda.com/download2.下载pycharm(编辑器)3.打开安装anaconda.然后使用anaconda指令conda install ffmpeg2.第一个实例程序.输入输出import ffm...
2018-11-26 08:26:49
2539
原创 一、ffmpeg合并视频
一.Mac安装ffmpeg:brew install ffmpeg二.合并,当所有的格式都一样时:编写批量处理文件filelist.txtfile 'video1.mp4'file 'video2.mp4'file 'video3.mp4'执行指令,生成output.mp4$ ffmpeg -f concat -i filelist.txt -c copy output.mp4...
2018-11-25 22:04:58
1225
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人