- 博客(45)
- 问答 (1)
- 收藏
- 关注
原创 webview接入HttpDNS实践
本文是对去年做的webview接入HttpDNS工作的一个总结,拖的时间有点久了。主要分享了GOT Hook webview中域名解析函数的方法。HttpDNS简介首先简单介绍下移动App接入HttpDNS后有什么好处,这里直接引用腾讯云文档中的说明: HttpDNS是通过将移动APP及桌面应用的默认域名解析方式,替换为通过Http协议进行域名解析,以规避由运营商Local DNS服务异常所导致
2017-10-19 10:07:57 6021 2
原创 JVM的简单实现
本文介绍java虚拟机的一些知识,并以jvmgo为例介绍一些虚拟机的简单实现。jvmgo是用Go语言实现的java虚拟机,其作者说这个项目的主要目的是学习Go和JVM,所以只是一个toy,对于破除JVM的神秘感还是很有帮助的。class类文件结构使用java编译器(java程序用javac,Groovy程序用groovyc编译器)可以把java代码编译位存储字节码的class文件,虚拟机并不关心cl
2017-10-08 10:25:16 2391
原创 《自制搜索引擎》笔记
第1章 搜索引擎是如何工作的搜索引擎的基础是应用于信息检索、数据库等领域的信息技术。1-1 理解搜索引擎的构成1-2 实现了快速全文搜索的索引结构利用全扫描进行全文搜索grep就是从头到尾扫描作为检索对象的文档的。利用索引进行全文搜索先建立索引需要花费时间。倒排索引的结构例子:印在教程书后面的索引。 所谓倒排索引就是一张列出了“哪个单词出现在了哪一页”的表格。如下图: 倒排索引的构建方法 为了
2017-10-07 22:45:36 971
原创 《一个操作系统的实现》笔记(7)--输入/输出系统(I/O)
键盘很简单,只要设置8259A芯片的键盘端口的handler处理函数就可以了。键盘敲击的过程键盘编码器,用于监视键盘的输入,并把适当的数据传送给计算机。 键盘控制器,用来接受和解码来自键盘的数据,并与8259A以及软件等通信。 敲击键盘包含两个含义:动作和内容。 敲击键盘所产生的编码被称作扫描码。当8048检测到一个键的动作后,会把相应的扫描码发送给8042,8042会把它转换成相应的Sca
2017-10-07 22:41:07 900
原创 《一个操作系统的实现》笔记(6)--进程
我们可以把一个单独的任务所用到的所有东西封装在一个LDT中,这种思想是多任务处理的雏形。 多任务所用的段类型如下图,使用LDT来隔离每个应用程序任务的方法,正是关键保护需求之一: 进程示意: 我们需要一个数据结构记录一个进程的状态,在进程要被挂起的时候,进程信息就被写入这个数据结构,等到进程重新启动的时候,这个信息重新被读出来。最简单的进程进程切换的过程: - 1.进程A运行中 - 2.时
2017-10-07 22:40:09 2343
原创 《一个操作系统的实现》笔记(5)--内核雏形
我们希望自己的操作系统内核至少应该在Linux下用GCC编译链接。 Loader要做的事有两件:加载内核入内存、跳入保护模式。在Linux下用汇编写程序示例:;hello.asm[section .data] ; 数据在此strHello db "Hello, world!", 0AhSTRLEN equ $ - strHello[section .text] ; 代码在此g
2017-10-07 22:39:31 732
原创 《一个操作系统的实现》笔记(4)-- Boot&Loader
一个操作系统从开机到开始运行,大致经历引导->加载内核入内存->跳入保护模式->开始执行内核这样一个过程。 引导扇区(Boot)负责把Loader加载入内存并且把控制权交给它,其它工作放心地交给Loader来做,因为没有512字节的限制,将会灵活得多。FAT12文件系统几乎所有的文件系统都会把磁盘划分为若干层次以方便组织和管理,这些层次包括: - 扇区(Sector):磁盘上的最小数据单元。
2017-10-07 22:38:03 762
原创 《一个操作系统的实现》笔记(3)--中断和I/O保护
中断和异常机制有时候普通的程序流必须可以被要求快速反应的处理事件中断。电脑提供了一个称为中断的结构来处理这些事件。 外部中断由CPU的外部引起。 例如:当一个鼠标移动了,硬件鼠标中断现在的程序来处理鼠标移动(移动鼠标,等等)。中断导致控制权转移到一个中断处理程序。中断处理程序是处理中断的程序。每种类型的 中断都分配了一个中断号。在物理内存的开始处,存在一张包含中断处理 程序段地址的中断向量 表。
2017-10-07 22:37:22 1588
原创 《一个操作系统的实现》笔记(2)--保护模式
保护模式什么实模式和保护模式这是CPU的两种工作模式,解析指令的方式不同。在实模式下,16位寄存器需要通过段:偏移的方法才能达到1MB的寻址能力。 物理地址 = 段值 x 16 + 偏移 此时段值还可以看成地址的一部分,段值为XXXXh表示以XXXX0h开始的一段内存。在保护模式下,CPU有着巨大的寻址能力,并为操作系统提供了虚拟内存和内存保护。 虽然物理地址的仍然用上面的公式表示,但此时“段
2017-10-07 22:36:42 620 1
原创 《一个操作系统的实现》笔记(1)--NASM汇编语法和环境搭建
《一个操作系统的实现》笔记(一)–NASM汇编语法和环境搭建@(马克飞象)[myblog, IT.技术书]概述实现一个基于Intel x86的32位操作系统。环境搭建Ubuntu虚拟机。Ubuntu - 汇编编译器NASM - C编译器GCC - 软盘绝对扇区读写工具dd - qemu虚拟机 - Bochs模拟器 - 磁盘映像工具bximage$ sudo apt-get install
2017-10-07 22:34:51 1642
原创 理解对C++裸指针释放后重用的问题
本文将以Android 2.2-2.3上的一个zergRush漏洞为例,分析指针释放后重用的问题。zergRush是Android 2.2-2.3上的一个漏洞,主要问题就在于指针的释放后重用。 zergRush利用了libsysutils库提供的Framework套接字的通用接口。 程序从套接字收到的消息中出抽取出的文本命令会导致栈缓冲区溢出,进而造成释放后重用问题。 具体地,是vold后台程
2017-07-20 09:37:50 1510
原创 C++与汇编小结
C++与汇编小结本文通过C++反编译,帮助理解C++中的一些概念。常用反汇编工具有:objdump、IDA Pro、godbolt 以下代码均使用x86-64 gcc 6.3编译。指针和引用引用类型的存储方式和指针是一样的,都是使用内存空间存放地址值。 只是引用类型是通过编译器实现寻址,而指针需要手动寻址。void funRef(int &ref){ ref++;}int main()
2017-07-15 12:40:56 1537
原创 Stetho的通信原理
Stetho简介stetho是Facebook推出的安卓APP网络诊断和数据监控的工具,接入方便,功能强大,是Android开发者必备的友好工具。 主要功能包括:实时查看App的布局网络请求抓包数据库、SharedPreferences文件内容监控自定义dumpapp插件对于JavaScript的支持具体的使用方法可以看这篇文章。 本文主要想讲一下自定义dumpapp插件的通信原理。
2017-03-12 14:55:02 2070
原创 用Android Studio调试Framework层代码
Android程序员不得不知的调试技巧。 本文以webview loadUrl和域名解析为例,介绍配合使用LLDB和Android Studio调试Framework代码的技巧。
2017-01-23 09:23:07 8711 3
原创 在macOS 10.12 上编译 Android 5.1
官方文档虽然也有介绍,但是macOS平台上的编译环境问题还存在很多坑。本文介绍下如何在在macOS 10.12 上编译 Android 5.1源码,导入源码到Android Studio中,把系统烧录到Nexus6手机中。
2017-01-21 19:02:27 2876 1
原创 Docker简单使用
史上最简单Android源码编译环境搭建方法这篇分享介绍了借助Docker来编译Android源码,Docker可以直接把编译工具链和Ubuntu系统整体打包,保证了编译环境和官方的一致。
2017-01-21 15:05:28 1369
原创 xlog接入方案
mars 是微信最近开源的终端基础组件,是一个使用 C++ 编写的基础组件。 xlog是其中一个可单独使用的高性能日志模块。 本文将简单介绍下xlog的特点,并给出一个自定义的输出到文件的策略。
2017-01-12 23:20:04 4515
原创 Python断点调试
很多项目是用python写构建脚本的,比如微信最近开源的终端跨平台组件 Mars 本文将以mars为例简单介绍下如何用PyCharm对python进行断点调试。
2017-01-07 22:35:24 9320 1
原创 simple-mock-api
项目中有一个Activiy需要轮询多个接口,实时刷新数据。这里很多业务逻辑都需要依赖当前的状态,所以简单写了一个服务端,用于生成一些mock data,并且支持数据实时刷新。
2017-01-01 10:12:01 424
原创 代码浏览工具OpenGrok
代码浏览工具OpenGrokOpenGrok是一款强大的跨平台代码阅读工具,许多在线源码查看网站都是使用它来搭建的,比如著名的Android在线源码查看网站androidxref.
2016-12-25 11:43:19 2938
原创 ELF文件及android hook原理
可执行和可链接格式(Executable and Linkable Format,缩写为ELF),常被称为ELF格式,在计算机科学中,是一种用于执行档、目的档、共享库和核心转储的标准文件格式。
2016-12-24 21:23:14 6543
原创 jpeg编码学习笔记
各种图片格式目的是在网络传输和存储的时候使用更少的字节,即起到压缩的作用。在图片格式解码后,无论图片的格式,图片数据都是像素数组。 本文将尝试通过JPEG这种图片编码格式的学习,了解图片编码的秘密。
2016-12-24 21:12:00 2576
原创 用OpenGL构建粒子喷泉
用OpenGL构建粒子喷泉效果展示这是《OpenGL ES应用开发实践指南》中的一个例子,写这篇blog简单总结下在Android上进行OpenGL ES开发的方法。工作流程概述定义顶点着色器、片段着色器。在哪里画图在Activity中设置ContentView为GLSurfaceView,在该控件上设置自定义渲染器Renderer完成OpenGL绘图。 Renderer接口定义的方法: on
2015-05-19 18:12:03 2478
原创 【LeetCode】Letter Combinations of a Phone Number
【LeetCode】Letter Combinations of a Phone Number题目在手机九宫格键盘上输入一串数字,给出可能打印出来的字符串的集合。分析先做一个map将数字映射到键盘上相应的字母集合。把按键顺序看成深度优先遍历的深度,每次dfs将深度d+1直到d=按键字符串的长度未知,此时即完成了一次按键可能的输出。实现 static Map<Integer, Chara
2015-05-08 19:54:45 470
原创 【LeetCode】Merge Intervals
【LeetCode】Merge Intervals题目Given a collection of intervals, merge all overlapping intervals.For example,Given [1,3],[2,6],[8,10],[15,18],return [1,6],[8,10],[15,18].分析先对intervals集合按start从小到大排序,last变
2015-05-08 14:40:10 432
原创 LeetCode第207题--Course Schedule
LeetCode第207题–Course Schedule原题给出课程总数,用不同整数编号表示不同课程,用一个二维数组表示多组先修课程的顺序对。比如:有2门课,要学课程1必须先学课程0,这是有效的。2, [[1,0]]如果有2门课,要学课程1必须先学课程0,要学课程0必须先学课程1,这是无效的。2, [[1,0],[0,1]]需要完成的就是这个方法: public boolean can
2015-05-07 15:43:37 589
原创 霍夫曼压缩算法
霍夫曼压缩算法概述霍夫曼压缩算法的主要思想是用较少的比特表示出现频率较高的字符,用较多的比特表示出现频率较低的字符。如下图所示, 实现①读入完整的输入流,并转化为字符数组。②计算每个字符出现的次数③构建Huffman树④构建编译表⑤将单词查找树编码成比特输出串并写入到输出流⑥将单词总数编码成比特输出串并写入到输出流⑦使用编译表翻译每个输入字符节点的表示 private sta
2015-05-05 22:53:50 8503
原创 游程编码算法
游程编码算法概述利用比特流常见的冗余形式:连续的重复数据,来压缩数据。0000000000000001111111000000011111111111 --40bit在源数据中,记录重复bit的个数,记录到压缩数据中。1111,0111,0111,1011 --16bit 实现压缩原理:将源文件中连续的1或0的个数(
2015-05-05 14:58:56 8844
原创 KMP子字符串查找算法
KMP子字符串查找算法概述算法的基本思想是:当出现不匹配时,就能知晓一部分文本的内容,可以利用这些信息避免将指针回退到所有这些已知的字符串之前。DFA(确定有限状态机)模拟提前判断如何重新查找,而这种判断只取决于模式本身,所以可以对模式的字符序列做一个确定有限状态机。DFA的数据结构表示为二维数组dfa[R][M],其中R为指定字典中的字符集的个数(比如ASCII为256),M为匹配字符串pat的长
2015-05-02 21:14:08 679
原创 Android滑动删除控件
Android滑动删除控件效果展示代码实现静态布局自定义一个ViewGroup,继承至FrameLayout,覆写其中的几个关键方法,用于给其中的两个子view设置布局位置。 private View contentView, deleteView; int contentViewHeight, contentViewWidth; int deleteViewHeight,
2015-04-26 12:00:01 878
原创 Android ListView头部视差控件
Android ListView头部视差控件效果展示代码实现静态布局,为ListView增加头部的View mListView = (ParallaxListView) findViewById(R.id.listview); mHeadView = View.inflate(this, R.layout.head, null); //异步解析xml中
2015-04-25 16:07:07 1245
原创 Android快速索引条控件QuickIndexBar
Android快速索引条控件效果展示代码实现自定义view,画出静态的图形在canvas上指定好位置,用各种画笔Paint,重要的是分析的过程。 private Paint paint; private int cellWidth, cellHeight; private void init() { paint = new Paint(); pai
2015-04-25 07:41:59 1616 2
原创 HTML5动态时钟
HTML5动态时钟效果图 var mycanvas = document.getElementById("mycanvas"); var context = mycanvas.getContext("2d"); function drawClock() { //每次调用函数都要对指定区域清屏
2015-04-20 19:41:30 1714
原创 在AndroidStudio编译过程中遇到Error:duplicate files during packaging of APK问题的解决方法
在AndroidStudio编译过程中遇到Error:duplicate files during packaging of APK问题的解决方法问题描述Error:duplicate files during packaging of APK /Users/sample/app/build/outputs/apk/app-debug-unaligned.apkPath in archive: ME
2015-04-20 10:14:02 2095
原创 多个Listview瀑布流效果
多个Listview瀑布流效果效果展示原理解释自定义MyLinearLayout,继承至LinearLayout,在布局文件中,将3个listview放置在MyLinearLayout中。重写MyLinearLayout中的onInterceptTouchEvent方法,返回true,打断向listview传递的触摸事件。重写onTouchEvent方法,根据触摸位置,将触摸事件通过调用子vie
2015-04-19 12:27:55 901
空空如也
这句话为什么要在按下除ENTER外的任意键才出现?!?!
2013-10-15
TA创建的收藏夹 TA关注的收藏夹
TA关注的人