自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Knight-ZXW的博客

Java,Android 分享

  • 博客(118)
  • 收藏
  • 关注

原创 【clickhouse笔记】 查询表或列的磁盘占用大小

clickhouse 查询表或列的磁盘占用大小

2024-02-20 11:42:21 776

原创 Android 应用流量监控实践

Android 应用流量监控实践

2024-01-11 14:19:28 1576

原创 Java 线程池调度周期性任务“异常“探究

Java的线程池调度周期性任务时,没有按照任务执行间隔执行的原因分析。 本文通过源码分析探究可能发生的原因,并复现了case。

2023-10-23 16:57:49 191

原创 Android平台下的cpu利用率优化实现

本文只是分享了Android系统下自主控制cpu频率、线程指定核心和优先级的方式,不过这些能力需要具体落实到业务场景才能够获得实际的收益。

2023-07-19 10:10:10 1624

原创 Android 冷启动优化的3个小案例

为了提高App的冷启动耗时,除了在常规的业务侧进行耗时代码优化之外,为了进一步缩短启动耗时,需要在纯技术测做一些优化探索,本期我们从类预加载、Retrofit 、ARouter方面进行了进一步的优化。

2023-06-28 10:30:09 375

原创 基于消息调度优化启动速度方案实践

基于消息调度优化启动速度方案实践

2023-04-14 15:58:02 1111

原创 扒一扒抖音是如何做线程优化的

本文主要介绍了有关线程的几个方面的优化主线程创建线程耗时优化线程数收敛优化线程默认虚拟空间优化OOM优化这些不同的优化手段需要根据项目的实际情况进行选择,比如主线程创建线程优化的实现方面比较简单、影响面也比较低,可以优先实施。而线程数收敛需要涉及到字节码插桩、各种对象代理 复杂度会高一些,可以根据当前项目的实际线程数情况再考虑是否需要优化。

2023-03-22 14:35:53 585

原创 监控Android Looper Message调度的另一种姿势

在Android 10版本,系统为Looper类添加了专门的 Observer类用来观测Looper的消息调度。因此除了通过设置Looper对象的 printer属性外,也可以通过设置Looper类的Observer属性来实现监控,然而该功能在设计之初就只是为了观测并统计系统服务的Looper消息调度性能

2022-09-06 11:25:48 1272

原创 Android虚拟机线程启动过程解析, 获取Java线程真实线程Id的方式

Android虚拟机线程启动过程解析, 获取Java线程真实线程Id的方式

2022-09-06 11:21:59 1680

原创 Android 高版本采集系统、进程CPU使用率的方式

cpu 信息作为性能监控四大常用指标 (cpu、内存、网络、磁盘)之一,对衡量设备性能,分析、确定一些线上性能问题有着较为重要的作用。 本文简述了在Android平台下获取系统CPU使用相关信息的方式

2022-08-24 16:50:48 2492

原创 sprintf 和 snprintf区别

snprint 和 sprint函数的区别

2022-08-11 01:23:39 936

原创 Mybatis 支持原生数据库Array 数据类型 (ClickHouse适用)

Mybatis支持原生数据库Array数据类型(ClickHouse适用)

2022-07-21 23:46:55 1640

原创 Android 平台下的 Method Trace实现解析 及 卡顿监测实践

主要介绍Android 虚拟机底层对Method Trace的实现,并拓展延伸到Method Trace的相关实践及应用。

2022-06-24 20:26:29 1642

原创 Android 解决 SharedPreferences 导致的ANR问题

介绍 Android 使用 SharedPreferences 导致的耗时、ANR问题,以及解决方案

2022-01-19 11:46:39 3980

原创 Java(Android) 检验 网络连通是否正常

ICMP本文判断设备网络连接是否正常,是通过ICMP协议实现的,ICMP (Internet Control Message Protpl) ,ICMP 是TCP/IP协议簇的一个子协议,用于在 IP主机、路由器 之间传递控制信息。 控制信息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息并不传输用户数据,但是对于用户数据的传递骑着重要作用。ICMP的报文格式如下图Java/Android 平台代码实现 public static boolean reachableByPi

2021-10-08 20:29:10 672

原创 ANR监控平台设计

得物之前对于线上的ANR问题都是采用接入的bugly平台进行问题收集和平台展示的,在体验中发现,无论是提供的信息对于解决问题的有效度、或者是对ANR日志聚合,都不太符合得物实际场景的需要。因此得物在参考业界各大厂商分享的ANR监控及治理方案后,我们开始着手建设自己内部的ANR监控平台,本文主要介绍 ANR监控 平台部分的实现,端上相关信息的采集实现不做阐述。​​ANR 信息的处理在进行ANR日志的数据处理之前,首先整理下目前端上对于ANR问题上报的信息内容,主要包括以下几点信息ProcessEr

2021-09-22 14:24:06 945

原创 基于JVMTI 实现性能监控

什么是JVMTIJVMTI 全程 JVM Tool Interface,它是Java虚拟机定义的一个开发和监控JVM使用的程序接口(programing interface),通过该接口可以探查JVM内部的一些运行状态,甚至控制JVM应用程序的执行。需要注意的是,并非所有的JVM实现都支持JVMTI。JVMTI是双通道接口(two-way interface)。JVMTI的客户端,或称为代理(agent),agent可以通过注册监听感兴趣的事件,另外,JVMTI提供了很多操作函数可以直接用来控制应用程

2021-07-13 10:35:19 3035 2

原创 Flink Kafka Producer报错:The producer has been rejected from the broker because it tried to use an old

背景在开发一个APM项目的过程中,需要使用flink从阿里云的sls消费数据并写入kafka,这里使用的Sink是flink官方支持库提供的 FlinkKafkaProducer ,对接后在运行过程中较频繁的出现以下异常2021-07-07 11:25:56.080 [ERROR] [APM_ANRProcess -> Sink: APM_ANRSink (1/1)] [org.apache.flink.streaming.runtime.tasks.StreamTask][732] - Erro

2021-07-07 12:11:57 2027

原创 设计一个“高效”的字节码插桩框架

背景在做性能监控及项目优化的过程中,不可避免地需要使用字节码插桩的来实现一些需求。比如函数体前后插桩实现 函数耗时检测Activity、Fragment 相关生命周期函数插桩,实现UI活动耗时检测Thread、ThreadPoolExecutor 构造函数调用替换,实现线程相关性能检测移除 Log 类相关的函数调用,避免不必要的日志打印行为等等当重复的进行了一些项目“字节码插桩”的相关插件的开发后,我们考虑这方面重复性的工作是否可以做进一步地简化,因为重复地进行 “新建Plugin项目”、

2021-06-22 16:40:25 429

原创 Android 刷机常用命令

Android 刷机常用命令线刷和卡刷的区别1.线刷和卡刷的本质区别在于recovery,刷了官方ROM的recovery.img,刷机方式就是线刷,刷了第三方中文recovery.img,刷机方式就是卡刷,线刷和卡刷的相互转换就是刷不同的recovery.img,不管是fastboot还是用超级终端,输入的命令其实都是差不多的;2.线刷是指使用USB线连接个人计算机,并在个人计算机上使用刷机软件进行刷机的行为,而卡刷则是把固件或者升级包拷贝到手机SD卡中进行刷机升级操作;3.线刷一般是官方所采

2021-04-21 21:21:32 1324

原创 Mac 环境下 推荐的rust安装方式

Mac 环境下 rust的安装在mac 环境下比较便捷的安装方式主要有两种,一种是直接通过 brew install rust ,另一种方式是通过安装 rustup 来间接安装 rust ,这里推荐使用 安装rustup的方式 来间接管理 rust环境。安装rustup-init首先通过 brew 安装 rustup-initbrew install rustup-init如果你已经通过 brew install rust 的方式 安装过rust了,请先执行rust uninstall ru

2021-01-19 11:02:46 3960 1

原创 ELF PLT Hook 原理简述

【无线平台】ELF PLT Hook 原理简述简述Android 是基于Linux的操作系统,因此在Android开发平台上,ELF是原生支持的可执行文件格式;ELF文件格式除了作为可执行文件,还可以作为共享库格式,也就是我们常见的so文件, 以及 object文件 (.o)、core dumps文件等。GOT/PLT HOOK 是ELF 文件函数hook的一种实现机制,GOT/PLT Hook 主要用于实现替换某个SO的外部调用,它的优点是非常稳定,因此在生产环境通常使用这种实现方案。GOT/PL

2020-12-30 11:22:49 2608

原创 Mysql 重置自增主键的方式

首先执行 show create table 'your_table_name' 查看目前的 AUTO_INCREMENT 的值`结果会输出 如下语句CREATE TABLE `your_table_name` () ENGINE=InnoDB AUTO_INCREMENT=1334369102809694211 DEFAULT 可以看到目前数据库引擎中保存自增ID 为 1334369102809694211数据库引擎会保证总是使用当前最大的ID值+1,因此如果希望重置Id ,需要自行.

2020-12-04 16:21:39 4500 1

原创 Android 扩大View点击区域最好的方式

Android 扩大View点击区域最好的方式先给结论实现介绍先给结论 /** * 扩展点击区域的范围 * * @param view 需要扩展的元素,此元素必需要有父级元素 * @param expendSize 需要扩展的尺寸(以sp为单位的) */ public static void expendTouchArea(final View view, final int expendSize) { if (

2020-05-12 10:41:54 5055 1

原创 【数据加解密】CRC检验算法的原理及实现

CRC检验算法的原理及实现循环冗余校验(英语:Cyclic redundancy check,通称“CRC”)是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。生成的数字在传输或者存储之前计算出来并且附加到数据后面,然后接收方进行检验确定数据是否发生变化。一般来说,循环冗余校验的值都是32位的整数。由于本函数易于用二进...

2019-11-18 15:18:51 3095

原创 【数据加解密】MD5检验算法的原理及实现

MD5检验算法的原理及实现MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 132...

2019-11-14 16:42:48 2372

原创 gradle 查看输出每个任务的执行时间

项目编译时间越来越长,我们可能需要了解每个task具体的执行时间,以便定位做出优化,以下gradle脚本用于打印每个task的输出时间,可以添加在root project 的 build.gradle中import java.util.concurrent.TimeUnit// Log timings per task.class TimingsListener implements T...

2019-10-10 12:59:37 2471

原创 win10 文件夹设置区分大小写

在使用 wsl 的过程中 遇到了文件夹大小写敏感问题,即windows文件系统是不区分大小写的,而linux文件系统默认是区分大小写的,部分linux程序比如 编译android 是必须在区分大小写的文件系统中运行的在新版的windows10 目前 将磁盘设置为文件夹大小写敏感还是非常简单的,主要参考这2篇文章https://devblogs.microsoft.com/commandline...

2019-10-10 12:56:33 3519

原创 APK编译流程-DEX文件

APK编译流程-DEX文件DEX 文件是什么我们知道,虽然我们的应用程序一般由java编写,但最终由Dalivk虚拟机执行的并不是java字节码,而是dalivk字节码。class字节码最终被编译成class文件,而dalivk 字节码最终被优化合并成dex文件,dex是一个可执行文件,可以直接由Dalvik虚拟机解释执行。Dex文件内容的组成部分可以参考Android的官方文档。D...

2019-09-03 14:54:13 2134

原创 APK编译流程-详解AAPT

APK编译流程-详解AAPTaapt2aapt2(Android Asset Packageping Tool)是用来 编译和打包 app资源文件的构建工具。aapt2 解析、索引并将资源编译成适合Android 平台的二进制格式.aap2将资源文件的编译分为2个步骤:编译阶段:解析资源文件并生成扩展名为.flat的中间二进制文件**链接阶段: **将编译阶段生成的所有中间文件(资源表...

2019-09-03 14:52:47 1655

原创 APK编译流程-APK是什么

apk文件 是什么APK是Android操作系统使用的一种应用程序包文件格式.从文件的角度,APK是一个以zip格式的压缩文件,因此我们可以直接使用 unzip 命令解压缩 apk文件unzip sample.apk -o ./unzipoutput如何查看 apk文件内容apktoolandrod studio - apk analyzeAndroid Stud...

2019-09-03 14:51:03 757

原创 漫谈Android apk编译流程

漫谈Android apk编译流程APK 编译过程官方图Android 代码(dex文件)编译流程网络流传的比较全的图,部分细节可能有差异Android APK 的编译流程我们可以划分为2个部分:1.是资源的编译2.是代码的编译其中so库是通过NDK编译生成.so文件后直接打进apk的中资源编译资源编译部分,首先apk资源包含哪些内容呢1.工程中res目录...

2019-09-03 14:50:03 177

原创 浅述gcc、Make、CMake的作用及关系

gccgcc 是GNU编译器套件,是Linux下默认的C/C++编译器.在windows环境下可以通过MinGw等GNU for Windows类工具使用gcc编译套件gcc最简单的编译命令如下gcc -c hello.c -ohellogcc -c 后可跟多个输入源文件,最终输出的可执行文件以-o表示.-o后紧着希望生成的可执行文件的名称。-c 选项表示只编译源文件,而不进行链接...

2019-07-30 14:37:43 7058

原创 由表及里深入Java泛型系统

由表及里深入Java泛型系统泛型的基本概念Java 泛型(generics)是 JDK 1.5 中引入的一个新特性,泛型提供了编译时类型安全检测机制,该机制允许程序在编译期检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。参数化类型的意义参数化类型的意义是将原来具体的类型参数化,类似方法中的变量参数,此时类型也可以定义成参数形式。比如JDK集合包的L...

2019-05-16 22:11:15 321

原创 vim常用命令手记

一般模式移动光标【h、j、k、l】,分别控制光标左、下、上、右移动一格【ctrl+b】屏幕向后移动一页【ctrl+f】屏幕向前移动一页【n】光标向右移动n个字符【w】光标移动到下个word的开头【e】光标移动到下个word的字尾【H】 光标移动到这个屏幕的最上方那一行的第一个字符【M】 光标移动到这个屏幕的中间那一行的第一个字符【L】光标移动到这个屏幕的最下方那一行的第一个字符...

2019-05-09 11:15:29 106

原创 手把手实现一个mini-Retrofit框架

前文本篇文章将采用循序渐进的编码方式,从零开始实现一个Retorift框架;在实现过程中不断提出问题并分析实现,最终开发出一个mini版的Retrofit框架演示一个使用OkHttp的项目Demo为了更好的演示框架的实现过程,这里我先创建了一个简单的Demo项目这个Demo项目中主要包含3个部分Json数据对应JavaEntity类项目中包装网络请求回调的Callback一个...

2019-04-27 08:54:11 215

翻译 深入Android对Java8支持的实现

本文内容来自 Jake wharton 的 Android’s Java8 Support一文,从这篇文章中你将了解Android对Java8语言特性的支持的历程;并分析了解Android在字节码层面是如何实现支持Java8语法的一个新的Java版本发布可能会带来诸多方面的变更,比如:新的语法、字节码变化、工具支持、API、JVM等,通常Android开发者关注的Android的Java...

2019-04-23 08:52:10 4366

原创 浅析ServiceLoader

1.SPI的概念了解ServiceLoader,需要先了解 SPI(Service Provider Interface)SPI的简单来说就是在程序设计时将一个功能服务的接口与实现分离,在程序运行时通过JVM机制自动找到服务接口的实现类并创建,以达到解耦的目的,提高程序的可拓展性; 比如JDBC2.ServiceLoaderServiceLoader就是 Java平台提供的一个简单的 ...

2019-02-20 17:35:44 294

转载 对组件、模块、子系统、系统、框架、架构 定义浅析

内容总结自 极客专栏模块与组件模块和组件的概念在实际工作中比较容易混淆,但是实际上只要认识到模块和组件都是系统的组成部分,只是从不同的角度拆分系统就容易理解了。 从逻辑的角度来拆分系统后,得到的单元就是“模块”,从物理的角度来拆分得到的单元就是“组件”。划分模块的主要目的是职责分离;划分组件的主要目的是单元复用。系统与子系统系统是由一群有关联的个体组成的,没有关联......

2018-05-11 19:57:26 17087 1

原创 Android 快速获取用户通信录联系人 姓名、电话、首字母 及排序

Android快速获取通信录列表、首字母、并排序关键点只使用一个Cursor 同时获取 手机号、首字母、并排序 (200多联系人大概在20ms左右)首字母的获取根据不同版本获取方式不同,在Android5.0以上使用 phonebook_label字段,在5.0 以下使用 ContactsContract.Contacts.SORT_KEY_PRIMARY也就是sort_key字...

2018-04-23 17:51:57 2703

空空如也

空空如也

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

TA关注的人

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