自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Mlib

手起键落间

原创 为什么说TCP是面向流的协议?而UDP是面向数据报的协议?

IP、TCP、UDP协议头 IP 是 TCP/IP 协议中的核心协议,为 TCP、UDP 等协议提供了一种尽力而为、无连接的数据报传输服务,也就意味着 IP 协议不保证成功传输,也不维护数据报相关的链接状态信息。 IPv4 数据报头部至少为 20 字节,结构如下: 版本:确定 IP 协议的版本(...

2019-12-23 13:41:12 883 0

原创 【Java】反编译Mac版Charles,修改一些功能

目录反编译jar修改jar参考 反编译jar 修改jar 如何修改jar包中的class文件 参考 Javassist 使用指南(一) 如何把java App包装成Mac安装包 - How to create a macOS installer for a Java application (....

2019-11-18 14:34:34 78 0

原创 【Android】移动端接入Cronet实践

移动端接入Cronet实践QUIC协议获取Chromium源码编译CronetAndroid / iOS buildsDesktop builds (targets the current OS)Running the ninja files生成的文件使用CronetAndroid Debug L...

2019-07-30 12:42:50 1102 0

原创 【Android】ADB工具原理探究

ADB简介 Android Debug Bridge (adb) 是一个Android的命令行工具。可以用来连接模拟器或实际的移动设备。比如 adb logcat, adb shell。Dalvik Debug Monitor Server(DDMS) 后台也是运行的adb来实现监控调试移动设备。...

2019-06-08 17:26:49 618 0

原创 【Android】Doze模式识别与检测

从 Android 6.0(API 级别 23)开始,Android 引入了两个省电功能:Doze模式(官方翻译为低电耗模式)和 App Standby模式(官方翻译为应用待机模式),可通过管理应用在设备未连接至电源时的行为方式为用户延长电池寿命。Doze模式通过在设备长时间处于闲置状态时推迟应用...

2019-05-27 10:33:56 711 0

原创 IPv6安全浅析

原文链接 :IPv6安全浅析 - Huawei - 2010.12 第52期 “缺乏安全性是互联网天生的弱点,这与是否采用IPv6关系不大。事实上,IPv6并没有引入新的安全问 题,反而由于IPSec的引入以及发送设备采用永久性IP地址而解决了网络层溯源难题,给网络安全提供了 根本的解决途径,有...

2019-03-13 19:52:55 8355 2

原创 【HTTPS】使用OpenSSL生成带有SubjectAltName的自签名证书

操作步骤 首先新建一个配置文件 ssl.conf如下: [ req ] default_bits = 4096 distinguished_name = req_distinguished_name req_extensions = req_ext [ req_disting...

2018-11-01 14:12:51 4479 0

原创 HTTPS原理与证书生成

HTTPS HTTPS与HTTP是什么关系呢?我们可以对比下HTTP与HTTPS的请求过程: HTTPS 在 TCP 和 HTTP 之间增加了 TLS(Transport Layer Security,传输层安全),提供了内容加密、身份认证和数据完整性三大功能。 HTTPS也就是HTTP ...

2018-10-31 18:09:54 3783 0

原创 WebSocket协议浅析

HTTP协议的缺点 单向请求:只能是客户端发起,服务端处理并响应 请求/响应模式 无状态协议 半双工协议 这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用轮询:每隔一段时候,就发出一个询问,了解服务器有没有新的信息。轮询的效率低,非常浪费资源。We...

2018-10-29 21:12:09 417 0

原创 CPU Cache与缓存行

引言 先看下面这两个循环遍历哪个快? int[][] array = new int[64 * 1024][1024]; // 横向遍历 for(int i = 0; i < 64 * 1024; i ++) for(int j = 0; j &am...

2018-09-14 16:13:06 3765 0

原创 【Java】J.U.C并发包 - AQS机制

简介 Java并发包(java.util.concurrent)中提供了很多并发工具,这其中,很多我们耳熟能详的并发工具,譬如ReentrantLock、Semaphore,CountDownLatch,CyclicBarrier,它们的实现都用到了一个共同的基类 - AbstractQueue...

2018-08-27 10:24:00 310 0

原创 【Android】动态链接库so的加载原理

前言 最近开发的组件时常出现了运行时加载so库失败问题,每天都会有java.lang.UnsatisfiedLinkError的错误爆出来,而且线上总是偶然复现,很疑惑。所以本文将从AOSP源码简单跟踪Android中的动态链接库so的加载原理,试图找出一丝线索。 加载入口 首先我们知道...

2018-07-04 14:51:46 2402 0

原创 【Android】单元测试方法简介

前言 基本单元测试框架 Java单元测试框架:Junit、Mockito、Powermockito等; Android单元测试框架:Robolectric、AndroidJUnitRunner、Espresso等。 最开始建议先学习Junit & Mockito。这两款...

2018-06-29 22:35:42 270 0

原创 【Java】使用Atomic变量实现锁

Atomic原子操作 Java从JDK1.5开始提供了java.util.concurrent.atomic包,方便程序员在多线程环境下,无锁的进行原子操作。原子变量的底层使用了处理器提供的原子指令,但是不同的CPU架构可能提供的原子指令不一样,也有可能需要某种形式的内部锁,所以该方法不能绝对保...

2018-05-23 10:18:06 2271 0

原创 【Java】Thread类中的join()方法原理

简介 join()是Thread类的一个方法。根据jdk文档的定义: public final void join()throws InterruptedException: Waits for this thread to die. join()方法的作用,是等待这个线程结束;但...

2018-05-09 18:34:09 10201 18

原创 【Android】Retrofit源码分析

Retrofit简介 retrofit n. 式样翻新,花样翻新 vt. 给机器设备装配(新部件),翻新,改型 Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装。注意这里并没有说它是网络请求框架,主要原因在于网络请求的工作并不是 Retrofit 来...

2018-04-13 18:54:57 381 0

原创 【Android】App应用前后台切换的一种监听方法

Android本身并没有提供监听App的前后台切换操作的方法。最近看到一种简单巧妙的方法来监听前后台,这里分享记录一下。 一、Activity生命周期 我们知道在Android中,两个Activity,分别为A和B。假设此时A在前台,当A启动B时,他们俩之间的生命周期关系如下,可以参考之前的这...

2018-04-06 20:13:39 2584 0

原创 【Java】线程池ThreadPoolExecutor实现原理

引言 线程池:可以理解为缓冲区,由于频繁的创建销毁线程会带来一定的成本,可以预先创建但不立即销毁,以共享方式为别人提供服务,一来可以提供效率,再者可以控制线程无线扩张。合理利用线程池能够带来三个好处: 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。当任务...

2018-02-13 17:34:17 6557 4

原创 【Android】OkHttp源码分析

Android为我们提供了两种HTTP交互的方式:HttpURLConnection 和 Apache HttpClient,虽然两者都支持HTTPS,流的上传和下载,配置超时,IPv6和连接池,已足够满足我们各种HTTP请求的需求。但更高效的使用HTTP 可以让您的应用运行更快、更节省流量。而O...

2018-01-26 19:02:36 554 0

原创 用Java实现断点续传 (HTTP)

断点续传的原理 其实断点续传的原理很简单,就是在 Http 的请求上和一般的下载有所不同而已。 打个比方,浏览器请求服务器上的一个文时,所发出的请求如下: 假设服务器域名为 www.sjtu.edu.cn,文件名为 down.zip。 GET /down.zip HTTP/1.1...

2018-01-22 16:26:53 381 0

原创 如何判断CPU是大端还是小端模式

一、概念及详解 在各种体系的计算机中通常采用的字节存储机制主要有两种: Big-Endian和Little-Endian,即大端模式和小端模式。 Big-Endian和Little-Endian的定义如下: 1) Little-Endian:就是低位字节排放在内存的低地址端,高位字节排放在内...

2018-01-18 16:59:25 3386 0

原创 【Android】源码分析 - LRUCache缓存实现原理

一、Android中的缓存策略 一般来说,缓存策略主要包含缓存的添加、获取和删除这三类操作。如何添加和获取缓存这个比较好理解,那么为什么还要删除缓存呢?这是因为不管是内存缓存还是硬盘缓存,它们的缓存大小都是有限的。当缓存满了之后,再想其添加缓存,这个时候就需要删除一些旧的缓存并添加新的缓存。 ...

2018-01-13 11:20:29 2235 0

原创 【算法】字符串循环移位后是否包含

问题 给定两个字符串s1和s2,要求判断s2是否能够被通过s1做循环移位(rotate)得到的字符串包含。 例如,s1=AABCD和s2=CDAA,返回true;给定s1=ABCD和s2=ACBD,返回false。 解法一最直接最笨的方法就对s1进行循环移动,再进行字符串包含的判断,从而...

2017-12-31 15:35:06 615 0

原创 【Android】源码分析 - View事件分发机制

事件分发对象(1)所有 Touch 事件都被封装成了 MotionEvent 对象,包括 Touch 的位置、时间、历史记录以及第几个手指(多指触摸)等。(2)事件类型分为 ACTION_DOWN, ACTION_UP,ACTION_MOVE,ACTION_POINTER_DOWN,ACTION_...

2017-12-26 19:27:57 394 0

原创 【算法】如何判断链表有环

如何判断单链表是否存在环 有一个单向链表,链表当中有可能出现“环”,就像题图这样。如何用程序判断出这个链表是有环链表? 不允许修改链表结构。 时间复杂度O(n),空间复杂度O(1)。 方法一、穷举遍历方法一:首先从头节点开始,依次遍历单链表的每一个节点。每遍历到一个新...

2017-12-25 20:05:59 25534 9

原创 【Android】源码分析 - Activity启动流程

启动Activity的方式Activity有2种启动的方式,一种是在Launcher界面点击应用的图标、另一种是在应用中通过Intent进行跳转。我们主要介绍与后者相关的启动流程。Intent intent = new Intent(this, TestActivity.class); start...

2017-12-23 19:07:28 634 0

原创 【Android】常用ADB命令总结

1. 获取当前运行的Activity方法一:adb shell logcat | grep ActivityManager 方法二:adb shell dumpsys activity activities 2. 安装包信息adb shell dumpsys package app-release...

2017-11-27 14:02:46 378 0

原创 【Java】HashMap源码分析(JDK1.8)

前言Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示:下面针对各个实现类的特点做一些说明:(1) HashMap:它根据键的hashCode值...

2017-11-26 16:02:49 382 0

原创 【Java】生产者消费者模式的实现

前言生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据。阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的。wait/notify方法首先,我们搞清楚Thread.sle...

2017-11-16 19:39:49 19625 6

原创 【Android】Binder - 如何使用AIDL

一、跨进程通信为了演示方便,将Service与Activity处于不同的进程,可以在AndroidManifest.xml中,把service配置成android:process=":remote" ,也可以命名成其他的。AIDL(1) IRemoteService.aidl:...

2017-11-02 15:21:39 309 0

原创 【Android】Dialog异常CalledFromWrongThreadException深入分析

问题在使用Dialog时,因为线程问题,在调用dismiss方法时出现了CalledFromWrongThreadException的Crash,如下:android.view.ViewRootImpl$CalledFromWrongThreadException: Only the origin...

2017-10-27 09:40:21 1768 0

转载 【Android】打印输出调用栈

1. Java层如何打印调用栈?在优化Android启动过程时,同事给出一种打印出调用栈的函数。分享一下:java.util.Map<Thread, StackTraceElement[]> ts = Thread.getAllStackTraces(); StackTraceE...

2017-10-26 10:28:52 522 0

原创 小米4A安装App报错INSTALL_FAILED_VERSION_DOWNGRADE

问题这两天用小米手机debug,完全卸载之后发现总是报错INSTALL_FAILED_VERSION_DOWNGRADE或者INSTALL_FAILED_ALREADY_EXISTS,AS的命令行中显示:Unknown failure (Failure - not installed for 0)...

2017-10-20 10:54:24 932 0

原创 【算法】字符串是否包含问题

在网上看到这篇文章:一次谷歌面试趣事。觉得其中的算法题以及作者的解决思路很有趣,就拿来分享一下吧。问题假设这有一个各种字母组成的字符串,假设这还有另外一个字符串,而且这个字符串里的字母数相对少一些。从算法是讲,什么方法能最快的查出所有小字符串里的字母在大字符串里都有?比如,如果是下面两个字符串: ...

2017-10-19 10:25:28 964 0

原创 【Android】源码分析 - AsyncTask异步任务机制

前言提到Android的多线程机制,常用的有如下几种方式: AsyncTask: 封装了线程池和Handler,为 UI 线程与工作线程之间进行快速切换提供一种便捷机制。适用于当下立即需要启动,但是异步执行的生命周期短暂的使用场景。 HandlerThread: 一个已经拥有了Looper的线程类...

2017-10-10 14:16:56 366 0

原创 【Android】源码分析 - IntentService机制

前言提到Android的多线程机制,除了我们常用的Thread来实现异步任务之外,还有 AsyncTask:封装了线程池和Handler,主要为了子线程更新UI; HandlerThread:一个已经拥有了Looper的线程类,内部可以直接使用Handler; IntentService:一个内部...

2017-10-05 16:17:42 456 0

原创 【算法】无序数组中求中位数

问题 给定一个int数组A,为传入的数字序列,同时给定序列大小n,请返回一个int数组,代表每次传入后的中位数。保证n小于等于1000 或者 求一个无序数组的中位数。 如:{2,5,4,9,3,6,8,7,1}的中位数为5。 要求:不能使用排序,时间复杂度O(n)。 分析因为题目指定不能使...

2017-10-05 11:23:31 5376 3

原创 【Android】EventBus 3.0 源码分析

概述EventBus是一个基于观察者模式的事件发布/订阅框架,开发者可以通过极少的代码去实现多个模块之间的通信,既可用于 Android 四大组件间通讯,也可以用于异步线程和主线程间通讯,而不需要以Interface回调、handler或者BroadCastReceiver的形式去单独构建通信桥梁...

2017-09-30 19:39:44 1137 0

原创 【Java】try-catch-finally语句中return的执行顺序思考

实验1、try中有return,finally中没有public class TryCatchTest { public static void main(String[] args) { System.out.println("test()函数返回:" ...

2017-09-21 16:28:00 776 0

原创 【算法】大数乘法问题及其高效算法

题目编写两个任意位数的大数相乘的程序,给出计算结果。比如: 题目描述: 输出两个不超过100位的大整数的乘积。 输入: 输入两个大整数,如1234567 和 123 输出: 输出乘积,如:151851741 或者求 12345678910111213141516171819...

2017-08-23 11:07:54 54102 12

提示
确定要删除当前文章?
取消 删除