自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(78)
  • 收藏
  • 关注

原创 Win环境下小米手机Root教程

参考文章小米手机解锁注意事项小米手机BL解锁操作指南小米手机获取 Root 权限教程(详细图文)准备环境:需要Win环境解锁需要Win环境(解锁工具是exe版本),刷机也需要Win环境(fastboot是exe文件)。1.手机解锁(需要Win环境)小米手机账号登陆状态下,满足7天时间才可以解锁。解锁会清除用户数据,三思!!!手动进入Bootloader模式(关机后,同时按住开机键和音量下键);通过USB连接手机,点击 “解锁”按钮;点击解锁;2.Root手机(需要Win环

2022-04-11 01:35:47 7465 3

原创 Mac环境安装Win虚拟机

背景:工作环境是MacOS, 绝大多数场景都满足开发要求。在有些特殊的场景下,比如第三方工具限制、Android手机刷机等,需要Win环境支持。1.下载WMFusion2.安装虚拟机2.1下载Win系统可以从这里找到合适的Win镜像:Win系统下载我是用的Win镜像是这个版本2.2安装镜像步骤1:将镜像文件拖拽至箭头处步骤2:点击继续步骤3:输入密码、密钥、选择Win版本步骤4:选择集成方式(我选择了更加独立)两种方式均可,视个人情况而定更加无缝:Win系统可以直接访问

2022-04-11 01:05:28 22352 3

原创 mock与spy的区别

mock与spy的区别mockmock对象的方法不执行具体逻辑使用方法打桩返回给定数据调用真实方法doCallRealMethodspyspy对象的方法执行具体逻辑spy中使用doReturn..when打桩,不会执行具体逻辑spy中使用when..thenReturn打桩,会执行具体逻辑mock指定需要mock的类型类(接口或者实现类),生成 Mock 类,其中所有的方法都不是真实的方法,而且返回值都是NULL。mock对象的方法不执行具体逻辑使用mock对象,访问对象方法不会执行具体逻辑

2021-05-18 02:09:18 5260 1

原创 通过Xposed框架Hook打印Java函数调用栈

XposedXposed的使用有2点限制条件1 需要Root2 适用于Android4-Android9, 在Android10会有无法访问网络的问题无法Root问题:适用VitualXposed建立一个Android工程app/build.gradle文件中添加xposed依赖compileOnly 'de.robv.android.xposed:api:82'新建一个Java类,实现IXposedHookLoadPackage接口,用来Hook方法package com.ex

2020-09-05 10:15:29 2586

原创 whistle代理配置帮助文档

背景:Android开发需要与服务器调试API接口,whistle可以帮助配置代理的方式访问测试环境,并且联调抓包也非常方便。一.安装whistle1. 下载Node.js下载地址: https://nodejs.org/en/下载完成后安装即可,命令后检查是否安装成功:node -v2. 安装whistlesudo npm install -g whistle3. whistle命令介绍帮助:w2 help启动:w2 start -p 8080修改端口:w2 restart -o 80

2020-08-30 19:44:08 3986

原创 APK打包流程

1.apk结构解析META-INF(CERT.RSA / CERA.SF / MANIFEST.MF)resAndroidManifest.xmlclasses.dexresources.arscMANIFEST.MF 版本号、每个文件的哈希值(Name/SHA1-Digest)CERT.SF 对MANIFEST.MF中每个文件的前3行再进行一次哈希(Name/SHA1-Digest)CERT.RSA 保存签名和公钥证书2.apk打包流程1. 使用aapt(android a

2020-07-11 23:58:34 271

原创 看一看大海

前段时间又去了海边走走,归途中西边天空升起绚烂的晚霞。2020年已然过去一半,特殊环境下发生的事情都是奇特的,这里记录一下碎片化的思考。鸡汤不是毒药,喝一碗不多。选择与被选择“选择”代表着主动性,通常可以与强大的个人能力联系起来;“被选择”往往代表着被动性,无能为力、迫不得已常常与之挂钩,大多数理解为能力弱小。我认为这里的“被选择”不能与“弱小”划等号,也许会有点阿Q精神,但我还是坚持这么认为。在能力边界,当个人力量已经决定不了事务发展趋势的时候,“被选择”就是必然。突如其来的疫情、闻风而动.

2020-07-10 16:44:42 199

原创 LeakCanary原理分析

LeakCanary 资源信息https://github.com/square/leakcanarydebugImplementation ‘com.squareup.leakcanary:leakcanary-android:2.3’1. 核心原理1.1 强引用-无法回收申请一个强引用对象,主动调用GC,查看此对象是否被回收。 private static void test1() throws InterruptedException { ReferenceQue.

2020-06-22 21:16:13 429

原创 第一个Flutter apk

1.资源服务器资源**玩android开发API **https://www.wanandroid.com/blog/show/2学习资源Dart语言https://www.dartcn.com/guides/language/Flutter中文网https://flutterchina.club/flutter-for-android/Dart开源库https://pub.dev/dart/packages2. DemoGitHubhttps://github.

2020-06-19 19:11:11 149 1

原创 Flutter 开发环境搭建

Flutter中文网 https://flutterchina.club/setup-macos/1. 配置环境变量1.1 使用镜像Flutter官方为中国开发者搭建的临时镜像export PUB_HOSTED_URL=https://pub.flutter-io.cnexport FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn腾讯云开源镜像站$ export PUB_HOSTED_URL=https://mirrors.clo

2020-06-10 15:25:36 418

原创 CountDownLatch与AQS

1 CountDownLatch初始化 public CountDownLatch(int count) { if (count < 0) throw new IllegalArgumentException("count < 0"); this.sync = new Sync(count); } private static final class Sync extends AbstractQueuedSynchronizer {

2020-05-12 22:21:53 199

原创 LinkedHashMap源码理解

1 概览public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> ... static class LinkedHashMapEntry<K,V> extends HashMap.Node<K,V> { LinkedHashMapEntry<K,V> before, after; Li

2020-05-12 20:59:09 782

原创 Glide(2):生命周期绑定

1. Glide.with(…)有若干多态方法,以下面方法举例。Glide.with(activity) public static RequestManager with(@NonNull Activity activity) { return getRetriever(activity).get(activity); }RequestManagerRetriever#get(activity) public RequestManager get(@NonNull Activi

2020-05-10 14:53:24 293

原创 Glide(3):缓存分析

Engine#loadFromMemory() private EngineResource<?> loadFromMemory( EngineKey key, boolean isMemoryCacheable, long startTime) { ... // 1.activeResources EngineResource<?> active = loadFromActiveResources(key); if (active !

2020-05-10 14:15:19 193

原创 Glide(1):代码流程

1. 使用方式RequestOptions options = new RequestOptions();options.placeholder(R.drawable.task_score_book).fitCenter().circleCrop();Glide.with(this).load(mTaskItem.getIcon()).apply(options).into(mImgContent);2. 加载流程

2020-05-10 14:14:59 159

原创 ReentrantLock源码实现(下):AQS再探

1. 源码预览java.util.concurrent.locks.AQS以及静态内部类Nodepublic abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements java.io.Serializable { private transient vol...

2020-05-07 08:51:02 189

原创 JNI开发流程

1. 生成.h文件假如在JNI.java中定义了native方法,需要根据此.java文件生成对应的.h头文件。进入JNI.java文件目录,执行如下指令。(早期JDK版本有javah指令,后面JDK版本都是集成在javac指令集中)javac -h . JNI.java2. 查看.class文件方法签名C代码调用Java代码,需要用到反射,反射调用方法需要知道方法签名。用javap...

2020-05-02 22:44:39 443 1

原创 ReentrantLock源码实现(上)

ReentrantLock的实现依赖Sync;Sync的子类有FairSync和NonfairSyncpublic class ReentrantLock implements Lock, java.io.Serializable { private static final long serialVersionUID = 7373984872572414699L; /** S...

2020-04-29 00:52:53 146

原创 Hook方式,绕过系统应用WebView安全性检查

1.问题项目中是Launcher应用,需要用到WebView来做Hybrid开发,会出现如下问题。如果是系统应用(uid == android.os.Process.SYSTEM_UID)使用WebView,则会抛出异常UnsupportedOperationException。以下是android 8.0的源码WebViewFactory#getProvider()static Web...

2020-04-23 01:50:32 2020 1

原创 Android类加载机制

ClassLoader#loadClass public Class<?> loadClass(String name) throws ClassNotFoundException { return loadClass(name, false); } protected Class<?> loadClass(String nam...

2020-04-17 19:25:52 325

原创 ArrayList源码分析

1. ArrayList初始化ArrayList是线性数据结构,底层实现是数组,默认capacity为10提供了2种构造方法:带capacity参数,立即初始化数组大小;不带capacity参数,引用指向一个空数组。public class ArrayList<E> extends AbstractList<E> implements List...

2020-04-14 08:12:52 78

原创 Deque

Deque(double ended queue)是一个接口,继承自接口Queue。public interface Deque<E> extends Queue<E> { void addFirst(E e); void addLast(E e); boolean offerFirst(E e); E pollFirst(); E...

2020-04-11 15:02:23 88

原创 OkHttp3源码分析(下):请求实现 Interceptor

1.请求的具体实现调用入口RealCall#getResponseWithInterceptorChain()收集所有的Interceptor从第0个Interceptor开始,逐个调用chain.proceed最后将结果Response返回给调用者 Response getResponseWithInterceptorChain() throws IOException { ...

2020-04-11 00:59:42 176

原创 OkHttp3源码分析(中):请求管理 Dispatcher

1.请求队列分类请求队列都是双端队列Deque, 可以从执行策略与请求类型两个维度来划分:按执行策略分类进行队列:runningAsyncCalls + runningSyncCalls等待队列:readyAsyncCalls // 等待队列中请求数量 public synchronized int queuedCallsCount() { return readyAs...

2020-04-10 08:49:38 190

原创 OkHttp3源码分析(上):请求流程

1.OkHttp3使用步骤OkHttp是android源码中提供的网络请求框架,是Square公司的经典作品之一。使用步骤可分为4步:创建OkHttpClientBuilder模式创建OkHttpClient,可以添加自定义拦截器,以及配置各种参数(鉴权、超时等)。创建Request请求对象,配置请求url以及method,自定义请求头Header也是在这里添加。创建Ca...

2020-04-10 00:20:27 163

原创 ConcurrentHashMap源码分析

基于JDK 13.0.21.源码分析public class ConcurrentHashMap<K,V> extends AbstractMap<K,V> implements ConcurrentMap<K,V>, Serializable { private static final long serialVersionUID = 72...

2020-04-05 17:19:45 116

原创 2.关于进程间通信(下):再说Binder

android系统进程间通信的底层原理就是Binder机制。参考aidl文件生成的java代码,可以知道Binder机制涉及到两个重要的类。1. IInterface接口所有可以在Binder传输的接口都需要继承IInterface接口。package android.os;public interface IInterface { IBinder asBinder();}...

2020-04-04 20:09:09 265

原创 Service的启动过程

android9.0Service启动过程1 ContextImpl#startService public ComponentName startService(Intent service) { warnIfCallingFromSystemProcess(); return startServiceCommon(service, false, mUs...

2020-04-03 17:30:31 185

原创 Activity启动流程

基于Android9.0(android-28)源码分析Activity启动流程。先看整体流程,再了解局部实现细节。1. ContextImpl#startActivity/** * Common implementation of Context API, which provides the base * context object for Activity and other a...

2020-04-03 11:25:30 380

原创 ActivityThread的启动流程

在android9.0的基础上,分析应用的启动流程。1.ActivityThread的启动流程ActivityThread是应用的主线程/UI线程,其main()方法是app的入口方法。ActivityThread继承于ClientTransactionHandler。1.1 ActivityThread.main()public final class ActivityThread e...

2020-04-02 20:53:35 662

原创 类加载过程与自定义ClassLoader

1.类加载过程a.通过一个类的全限定名来获取定义此类的二进制字节流 (在JVM外实现,也就便于自定义类加载器实现这个动作)b.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构c.在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据结构访问入口2.自定义ClassLoader示例自定义ClassLoader,需要覆写findClass方法。...

2020-04-01 19:18:50 127

原创 HashMap源码理解

1.HashMap源码分析关于HashMap的几点说明:默认初始容量16默认loadFactor为0.75Map集合容量必须是2的倍数HashMap集合key可为null对象,value也可为null对象如何解决hash冲突:红黑树、链表 public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTOR; //...

2020-03-28 21:31:19 110

原创 AtomicInteger如何保证线程安全?

1. AtomicInteger不是final类型,如何保证线程安全?先看一下局部源码public class AtomicInteger extends Number implements java.io.Serializable { private static final long serialVersionUID = 6214790243416807050L; /*...

2020-03-28 16:47:04 2773

原创 CountDownLatch、CyclicBarrier、Semaphore

/** * Copyright (C), 2016-2020 * FileName: CountDownLatchTest * Author: wei.zheng * Date: 2020/3/9 19:55 * Description: 测试CountDownLatch */public class CountDownLatchTest { private CountDow...

2020-03-09 20:56:23 144

原创 ClassLoader与双亲委派模型

类加载器java.lang.ClassLoader是一个抽象类,用于加载class。public abstract class ClassLoader { ... public Class<?> loadClass(String name) throws ClassNotFoundException { return loadClass(name, fa...

2020-03-05 22:00:46 140

原创 Java 值传递 or 引用传递 ?

1.结论其实无需纠结答案是值传递还是引用传递,关键是理解它们的含义。如果一定要记住一个答案,那就认为是值传递(一切传引用其实本质上是传值)。我的理解:传递基本类型参数:改变行参(赋值操作)不影响实)传递对象(引用)类型参数:行参指向新的对象,则实参不改变;行参调用内部方法,实参改变解释:基本类型:变量中存储的是具体的值引用类型:变量中存储的是对象的地址,行参是变量的拷贝,指向...

2020-03-01 11:32:31 106

原创 8.Window与WindowManager

1.概述所有视图都通过Window来呈现,包括Activity/Dialog/Toast等,Window是View的直接管理者;WindowManager是外界访问Window的入口;Window的具体实现在WindowManagerService中,WindowManage与WindowManagerService的交互式IPC过程。2.关键类图3.重点关注WindowManag...

2020-03-01 09:23:37 176

原创 11.关于线程与线程池

1.Android中的线程形态AsyncTask轻量级异步任务类,底层实现为Thread+Handler。HandlerThreadHandlerThread继承自Thread,run方法内会创建Looper,并开启消息循环。public class HandlerThread extends Thread { ... @Override publ...

2020-02-29 22:25:45 120

原创 10.消息机制(下):分析Looper

Looper起到消息循环的作用,一直循环查看MessageQueue中是哟有新的Message,有则立刻处理,否则就阻塞在这里。主线程不需要主动初始化Looper,ActivityThread在创建的时候就初始化了Looper子线程创建Handler,需要主动初始化Looper new Thread() { @Override ...

2020-02-29 15:23:15 222

原创 10.消息机制(中):分析MessageQueue

android消息机制主要是指Handler的运行机制,需要MessageQueue以及Looper的支撑。开发中,常用于更新UI。UI控件不是线程安全的,所以采用单线程(主线程)处理UI操作android中主线程,即UI线程,就是ActivityThread (其创建时会初始化Looper)1.MessageQueueMessageQueue消息队列,顾名思义,最主要的就是两个方法:...

2020-02-29 11:47:57 474

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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