- 博客(526)
- 资源 (13)
- 问答 (4)
- 收藏
- 关注
原创 HandlerThread 源码分析
前言在Rxjava还没普及的handler是我们最常用的线程间通信帮助类.本文需要对Handler有一定的了解,可以参阅博主的其他文章Handle 源码分析与学习我们首先看一个Demo:class MainActivity : AppCompatActivity() { val handlerThread = HandlerThread("一个子线程") var h: Handler? = null override fun onCreate(savedInsta
2021-04-11 22:35:25 167
原创 Android 类加载器
前言我们知道Java存在双亲委托模型,具体可以参考Java虚拟机详解(十一)------双亲委派模型。本文将讲解Android下的类加载.本文将以5.0作为源码讲解。
2021-04-11 22:12:02 150
原创 AsyncTask源码解析
前言在旧时AsyncTask和Handler作为两个异步框架,但如今Google已在文档中废弃了AsyncTask推荐使用Kotlin协程.但是源码分析依然可以学到很多有用的东西。简单的使用class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setCont
2021-04-11 20:03:02 169
原创 Android Binder驱动分析九 RPC
前言接上文Android Binder驱动分析八 getService本文将研究MediaPlayer最后如何将数据传输到MediaPlayService//MainActivity.javapublic class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState)
2021-04-11 11:26:46 270
原创 win32 跨进程句柄共享
前言Win32 中所有敏感的资源全部都是内核管理,如果应用程序想调度敏感资源,则需要句柄进行间接操作。对于相同资源,每个进程的句柄值也不同的.句柄值仅能在自己程序有意义,比如进程A的句柄值22指向是资源A,进程B的句柄值是30指向资源C. 那么我们该如何共享进程的句柄?方式有如下两种:父子进程句柄拷贝句柄拷贝DuplicateHandle 文档BOOL DuplicateHandle( HANDLE hSourceProcessHandle,//想要从那个进程复制句柄 HA
2021-04-10 21:20:12 497
原创 Android Binder驱动分析八 getService
前面几篇文章中我们成功的将mediplayservice注册到binder驱动和servicemanager
2021-04-10 18:41:53 549
原创 Android Binder驱动分析七 线程相关
承接上文Android Binder驱动分析六 addservice源码分析大量借鉴 Android Binder机制(八) MediaPlayerService服务的消息循环//frameworks/av/media/mediaserver/main_mediaserver.cppint main(int argc __unused, char** argv){ //知识点sp<xxx> 类似java的WeakReference<xxxxx> //sp 内部的
2021-04-06 22:09:21 196
原创 Android Binder驱动分析六 addservice源码分析
承接上文:Android Binder驱动分析五 addservice源码分析servicemanager发送一个指令BINDER_WORK_TRANSACTION给mediaplayservice,而后唤醒其线程。mediaplayservice唤醒后会在binder_thread_read,由于这个函数出现过很多次了这里直接简单略过//drivers/staging/android/binder.cstatic int binder_thread_read(struct binder_pr
2021-04-05 21:08:17 233
原创 Android Binder驱动分析五 addservice源码分析
Android Binder驱动分析三 addservice源码分析分析了如下的代码:将事务添加到servicemanager,然后将其唤醒添加一个binder_work事务给mediaplayserice我们在分析下servicemanager被唤醒后的流程,servicemanager在内部会开启一个死循环代码去接收信息,而代码会被阻塞在binder驱动的binder_thread_read函数。//drivers/staging/android/binder.cstatic int
2021-04-05 20:37:13 292
原创 Android Binder驱动分析四 addservice源码分析
Android Binder驱动分析三 addservice源码分析接着上网我们分析了如下的代码:将事务添加到servicemanager,然后将其唤醒添加一个binder_work事务给mediaplayserice我们这里分析mediaplayservice提交事务后会做什么//drivers/staging/android/binder.cstatic long binder_ioctl(struct file *filp, unsigned int cmd, unsigned lo
2021-04-04 21:23:41 1822 1
原创 Android Binder驱动分析三 addservice源码分析
前言本文分析如何向ServiceManager注册一个服务。我们这里以mediaplayservice进行分析.首先需要明白的概念。句柄(handle)
2021-04-03 23:59:36 447
原创 win32 运行指定其他的进程
WinExecUINT WinExec( LPCSTR lpCmdLine, UINT uCmdShow);WinExec官方文档 lpCmdLine:会从一下目录查找对程序当前应用启动的文件夹当前目录(应用程序启动时可以修改当前目录的位置,和启动目录不是一个概念)Windows/system 目录(打开你的操作系统安装盘即可查看)Windwos 目录环境变量PATH目录uCmdShow:这个用于传给子程序,告诉子程序,父进程想让她如何显示窗口,如最大化SW_MAX
2021-03-29 21:26:20 372 1
原创 Binder驱动分析 Parcel写入Binder对象
Parcelhttp://wangkuiwu.github.io/2014/09/05/BinderCommunication-AddService01/frameworks/native/libs/binder/Parcel.cppframeworks/native/libs/binder/Parcel.h
2021-03-28 20:39:22 428
原创 binder 红黑树rb_node转实体对象
c内存的骚操作我们看下下面的代码,给你一个成员变量的地址如何转化为其包裹的父结构体的对象?struct Node { long next;};typedef struct _student { char sname[20]; Node mynode;} ;struct _student * getFromMember(Node *node){ //todo?获取从node对象转化为_student *对象} int main(int argc,
2021-03-23 23:37:04 502 1
原创 win32 注册表操作API
前言注册表是windows提供给开发者存储轻量级数据的地方。我们可以通过键入regedit打开注册表.我们首先像HKEY_CURRENT_USER\Software\\QQBrowser写入一个value值的一个案例int main(){ HKEY openkey = NULL; //打开或者创建一个注册表key LONG nRet = RegCreateKey(HKEY_CURRENT_USER, "Software\\QQBrowser", &openkey); if (nR
2021-03-23 23:35:55 928
原创 Android Binder驱动分析二 ServiceManager与binder驱动
Android Binder驱动分析一 ServiceManager启动流程前言本文可能涉及过多的linux内核知识,需要读者自行储备。上文我们尽在framework层分析了ServiceManager的启动流程,很多细节都没在binder驱动层面说明。本文使用3.18的内核版本,读者可自行下载 https://source.android.com/devices/architecture/kernel/...
2021-03-21 11:35:07 377 1
原创 dll 导出函数转发
前言有时候我们导出的dll仅仅想导出一些函数声明,然后有其他dll进行实现,我们成这里导出声明为:导出函数转发https://docs.microsoft.com/en-us/cpp/preprocessor/comment-c-cpp?view=msvc-160# pragram comment
2021-03-20 23:38:43 1288 1
原创 dllmain
win32提供了一个特殊函数名叫DllMain,这个函数写在dll中会根据四种情况进行回调。某个线程加载了dll某个线程卸载了dll主进程加载了dll主进程卸载了dll微软dllmain官方文档我们在dll工程随意新建一个类//My.cpp#include<iostream>#include<process.h>#include <windows.h>using namespace std;BOOL WINAPI DllMain( _In_
2021-03-19 23:03:26 499
原创 Win32 静态库与动态库
库的概念在开发中我们往往有需求,需要把工程的输出作为另一个工程的输入,就像Java中的jar一样.obj 方式实现共享我们在c编译的流程可知,我们会将c文件编译成一个obj文件。于是乎我们可以把obj文件和头文件给另一个工程,那么也可以实现库的效果。A工程//MyAdd.cpp#include "MyAdd.h"int MyAdd::add(int p, int q){ return p + q;}//MyAdd.h#pragma onceclass MyAdd{publi
2021-03-18 21:34:55 251
原创 Android Binder驱动分析一 ServiceManager启动流程
getprop dalvik.vm.heapsize 获取虚拟机内存大小
2021-03-18 17:53:57 457
原创 linux mmap函数
mmapmmap是一个可用于IPC,文件拷贝的API,其特点在于所谓的0拷贝。本文需要读者自行了解虚拟内存机制,和进程隔离的简单知识。我们假设两个进程A和进程B进行消息队列通信。上面的流程:进程首先会从用户空间的虚拟内存指向的实际物理内存的内容域拷贝到内核空间(用户态切换到内核态)另一个进程从内核空间拷贝到用户空间的虚拟内存指向的实际物理内存(内核态到用户态)简单的一个通信进行了两次的内存拷贝操作,和两次的状态的转化,效率较低,因此我们可以利用mmap进行通信。mmap内存状态图:进
2021-03-13 22:11:38 365
原创 BSD grep指令详解
grep是linux或者BSD重要的查找内容命令.我们在以下目录结构做实验.├── a.txt└── mydir ├── InnerTextB.txt └── innerTextA.txt1 directory, 3 filesa.txthello worldHELLO Worldmydir/InnerTextB.txtWORD.txtmydir/InnerTextA.txthello HELLO参数说明-A num, --after-context
2021-03-13 14:35:49 372
原创 Flutter 渲染树
文章目录基础知识WidgetRenderObjectElementWidgetTreeElementTreeRenderTree简单抽象关系图绘制极简流程`StatefulWidget`绘制`StatelessWidget`绘制小结Widget的key参考基础知识Flutter中我们往往会听到如下几个类:WidgetElementRenderObject我们来分别讨论下他们的作用:Widget用于描绘你的视图长什么,相当于一个建造楼房的蓝图。内部存在函数用于生成Element和Rend
2021-02-17 16:07:33 424
原创 HTTP协议
HTTP前言Http历史版本:0.9 只支持传送请求体,不支持请求头等1.0 支持了请求头和POST HEAD请求方式1.1 复用TCP链接,避免多次挥手和握手
2021-02-10 23:59:52 744
原创 Java Pluginable Annotation processing
本文是《深入理解JVM理解字节码》读后笔记,案例和图均来自书中什么是插件化注解处理器插件化注解处理器(Pluginable Annotation processing)又称编译时注解.我们先了解Java编译流程:javac属于编译前端(生成非机器码的中间代码),编译后端(机器码)在JIT触发.我们只需要关心编译前端即可。javac经过parse和enter(语法分析,词法分析)会生成一个抽象语法树(AST),然后调用注解处理器,注解处理器可以在这个阶段使用对应语法修改语法树结构。抽象语法树.
2021-02-09 13:40:19 408 1
原创 网络协议 TCP
前言TCP是传输层协议,具有如下特性:1.可靠性2. 拥塞控制3. 流量控制而拥塞控制和流量控制需要基于滑动窗口机制。滑动窗口消息的接收方: 都会有自己的处理能力上限。比如计算机B一次性只能处理50个消息,这个大小我们叫做窗口大小。消息的发送方:消息的发送方也有一个自己发送大小窗口,当然这个大小受限于上层协议控制,比如流量控制和拥塞控制,一般来说都会小于接收方的接收窗口。我们以发送端的举例说明:我们假设我们要发送的数据为HELLOWORD ,在网络传输中我们传输的数据会分多个片段然后
2021-01-18 10:58:19 188
原创 我司Android App遇到的一个历史换肤问题
前言我司App时常有人反映首页ui颜色和不协调,这个问题持续了很多个月,鄙人也找了很多资料一直百思不得其姐,直到某一天产品同学稳定复现了类似的问题。惨烈状况如下:产品同学反馈打开某一网页再返回首页次问题必现。我们的网页界面比较简单如下:<?xml version="1.0" encoding="utf-8"?><layout xmlns:app="http://schemas.android.com/apk/res-auto"> <androidx.const
2021-01-16 23:16:58 280
原创 网络协议概述
ISO 1985年定制了 OSI (open system interconnect reference model)参考模型.在标准组织指定前已经存在民间认可的TCP/IP协议
2020-12-20 14:51:43 176
原创 网络模型 物理层和数据链路层
物理层利用一些物理媒介,传输信息。信号往往是电信号或者光信号。信号传输线路媒介:双绞线/网线同轴电缆光纤双绞线这是我们最常见的的物理设备。我们只需要知道以下几点极高性比价适合小距离传输传输电信号同轴电缆性价比仅比双绞线差,但高于光纤适合小距离传输容易受到气象干扰传输电信号逐步被双绞线取代光纤特点:传输速度极快性价比极低适合长距离传输低传输电信号我们在家里办理宽度的时候,宽带师傅都会拉一条光纤到家里,然后在安装一个光猫/Modem将光信号转
2020-12-20 14:50:36 329 1
原创 MFC 常用UI组件使用
Button双击即可自动创建一个点击事件处理函数。BEGIN_MESSAGE_MAP(CMFCApplication2Dlg, CDialogEx) ON_BN_CLICKED(IDC_BUTTON1, &CMFCApplication2Dlg::OnBnClickedButton1)END_MESSAGE_MAP()void CMFCApplication2Dlg::OnBnClickedButton1(){ }Radio关联int变量void CMFCA
2020-12-16 22:59:20 1281
原创 MFC子类化
MFC给每一个原始的Win32控件封装了对应的类,如Edit Control就被封装为CEdit。如下图:上面有一个编辑框,我们想让其关联到自己写的类CMyEdit中//CMyEdit.h#pragma once// CMyEditclass CMyEdit : public CEdit{ DECLARE_DYNAMIC(CMyEdit)public: CMyEdit(); virtual ~CMyEdit();protected: DECLARE_MESSAGE_MAP()
2020-12-09 22:31:20 448
原创 WIN32 子类化
有时候我们需要对弹窗的某一个控件进行更细腻度的控制,比如编辑框只能输入0到9的数字。我们可以利用如下的思想进行实现:1. 获得原始编辑框的过程函数2. 将编辑框过程函数替换为自己的3. 监听文本输入事件过滤无效字符后在透传到原始的过程函数...
2020-12-07 22:12:17 266
原创 MFC 最小Demonstrate
前言MFC是微软提供的一个Win32开源库,皆在帮助我们快速开发。比如原生的一个界面需要经过多个步骤,而在MFC,仅仅是几个类的创建。
2020-11-26 23:51:49 236
原创 Win32 List Control 控件
#前言List Control是Win32中最难用的也是最复杂的空间之一.我们看下本博客的布局样式请注意List Control的view设置为ViewPort,其他视图属性可以自行测试。ViewPort是一个二维的表格视图类型我们首先插入如下数据:三个标题栏,和三行数据。标题栏插入: /*插入标题行*/ LVCOLUMN lv; lv.mask = LVCF_FMT| LVCF_WIDTH|LVCF_TEXT; lv.fmt = LVCFMT_CENTER; lv.c
2020-11-20 23:57:51 1258
原创 java 原子类累加器
前言LongAccumulatorDoubleAccumulator在多线程进程情况,我们可能希望计算某一共享变量,如页面访问次数,商品剩余数量秒杀。本文仅用LongAccumulator做说明。LongAccumulator
2020-11-15 21:54:39 830
原创 WIN32 基础控件的使用
代码模板int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow){ //弹出弹窗 DialogBoxA(hInstance, MAKEINTRESOURCEA(IDD_DIALOG1), NULL, Dlgproc); return 0;}复选框代码寓意:我们点击显示之后会弹
2020-11-14 00:00:36 629
原创 WIN32 非模态对话框
//创建一个对话窗口实例 HWND dialogHwnd=CreateDialogA(hInstance, MAKEINTRESOURCEA(IDD_DIALOG1), hwnd, mydialog); //显示 ShowWindow(dialogHwnd, SW_SHOWNORMAL); //不会阻塞代码继续运行非模态对话框关闭和模态对话框关闭有所区别INT_PTR CALLBACK mydialog(HWND hwnd, UINT msgType, WPARAM wparam, L.
2020-11-12 22:46:22 508
frida-12.8.20-py2.7-macosx-10.9-intel.egg
2020-04-05
AIDL bindservice流程图
2017-09-29
fastjson 阿里巴巴的解析生成json工具
2016-09-01
Android 控件顶部阴影如何添加?
2017-04-14
Git创建本地仓库后 如何给他人地址?地址是什么
2016-10-18
安卓最新studio2.1 导入github项目选择那一项 谢谢
2016-10-13
安卓SDK目录中build-tools是用来干嘛
2016-08-06
TA创建的收藏夹 TA关注的收藏夹
TA关注的人