自定义博客皮肤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)
  • 资源 (1)
  • 收藏
  • 关注

原创 java并发机制的底层实现原理

一、概述本系列并发文章主要是为了解决日常面试中经常问到的概念进行相关梳理,各种锁估计都将各位绕晕了。大家可以先看看下面的问题,在针对性的阅读本系列文章。synchronized底层原理是什么JMM可见性,原子性,有序性,synchronized可以保证什么?说说你对volatile字段有什么用途?sychronized,volatile区别? 这里可以体系化的回答,主要从JMM角度去回答,最后深入到字节码层面的区别。因为提到了修饰的范围有差别,就有了下一题。对于锁的对象的不同,效果会有什么差

2021-01-11 16:02:52 274

原创 深入理解Android屏幕刷新机制(一) 源码理解Choreographer

一、概述在Android中,当我们谈到 布局优化、卡顿优化 时,通常都知道 需要减少布局层级、减少主线程耗时操作,这样可以减少丢帧。这篇文章我们来理解下屏幕刷新机制,先提出几个问题,大家可以带着问题去阅读这篇文章丢帧一般是什么原因引起的?Android刷新频率60帧/秒,每隔16ms调onDraw绘制一次?onDraw完之后屏幕会马上刷新吗?如果界面没有重绘,还会每隔16ms刷新屏幕吗?如果在屏幕快要刷新的时候采取onDraw绘制会丢帧么?1.1 基础概念屏幕刷新频率一秒内屏幕

2020-11-29 21:51:56 2197

原创 这篇Android事件分发机制,点到为止

一.概述事件分发的对象 :点击事件(Touch事件)Touch事件的相关细节(发生触摸的位置、时间等)被封装成MotionEvent对象事件分发的本质 :将点击事件 (MotionEvent)传递到某个具体的View处理的整个过程事件在哪些对象之间进行传递 :Activity、ViewGroup 、View事件分发的顺序:Activity -> ViewGroup ->View事件分发过程由哪些方法协作完成:dispatchTouchEventonInterceptTouch

2020-11-27 11:39:34 460

原创 Android classLoader 从源码理解类加载

一、概述我们知道Java中的 ClassLoader可以加载 jar 文件和Class文件(本质时加载Class文件)。在Android中,它们加载到是dex文件。Android中的ClassLoader类型分别是系统类加载器和自定义加载器。其中系统类加载器主要包括3种,分别是 BootClassLoader 、PathClassLoader 和 DexClassLoader 。概览BootClassLoaderAndroid 系统启动时会使用 BootClassLoader来预加载常用类。

2020-11-26 11:27:21 1815 3

原创 Java ClassLoader与双亲委派模型

概述这里要先说明下java中的ClassLoader 和Android中的ClassLoader是有区别的。Android从5.0开始就采用art虚拟机, 该虚拟机有些类似Java虚拟机, 程序运行过程也需要通过ClassLoader 将目标类加载到内存中。本篇文章先带大家梳理下java的ClassLoader,可以带着问题去看本篇文章,会有更多的收获。java中的ClassLoader类加载就是多种类加载器(ClassLoader)来查找和加载Class文件到Java虚拟机中。类加载器就是根据指定

2020-11-24 23:00:06 243

原创 性能系列- 内存优化(下)-内存实战--内存暴减优化100%!!

1.概述在上篇我们聊了聊在Android内存的概念,这一篇就是实战去解决我们项目中的内存问题版本迭代过程中,内存增长过快,不仅会导致一定概率的OOM,运行时若出现内存抖动,导致频繁GC,则会对App的流畅度以及用户体验造成很大影响。所以内存问题还是需要我们去解决的,因为笔者要接入一家厂商,对App各性能有严格的要求,便和大家唠唠整个优化流程。在做优化流程之前,我们应该要思考我们可以解决哪些问题,在大多数情况下,我们花20%的精力,比如解决掉内存泄漏,或者大图占用,就能解决掉80%的内存问题,剩余的2

2020-11-20 11:02:59 588

原创 性能系列- 内存优化(上)-深入理解Android内存

一、概述在Android诞生至今,也已经有十年了。整个开发社区也更加的活跃。在高速的信息发展时代,社区的各个成员也将自身的知识分享出去,对于一些功能的开发,网上也充斥着各种解决方案。我们往往能在网上找到适合自身功能的解决方案,在完成功能之后,却往往对功能模块的稳定性和相关性能进行测试。在如今的时代中,面对大量“年久失修”的历史代码,又引入不同跨平台方案的应用,我们又该如何打造一款高质量的应用呢。及时Android发展了10余年,内存带来的各种问题从史贯穿至今,即使现在高性能的手机已经推出了8GB,4GB

2020-11-04 22:51:12 3958

原创 Android内存分析命令

一、概述由于app要接入某一厂商,对内存有严格的使用要求,比如初始内存要小于多少M,使用过程最大内存不得超过多少M等条件。对于这些量化的数据,我们需要重哪里获取呢。在开发阶段,我们除了用Android提供的工具,比如 Android Profiler 、MAT 等工具来通过可视化的方式洞察到我们应用程序的占用内存,Android中也提供了详细命令让我们使用。二、内存管理概览Android 运行时 (ART) 和 Dalvik 虚拟机使用分页和内存映射来管理内存。这意味着应用修改的任何内存,无论修改的

2020-10-20 15:36:02 1165

原创 dumpsys 使用

一、概述用法简介dumpsys 是一种在 Android 设备上运行的工具,可提供有关系统服务的信息。可以使用下文所述的命令行选项仅获取您感兴趣的系统服务的输出。使用方法adb shell dumpsys [-t timeout] [--help | -l | --skip services | service [arguments] | -c | -h]命令行选项选项说明-t timeout指定超时期限(秒)。如果未指定,默认值为 10 秒。–help输

2020-10-11 10:35:28 1407 1

原创 深入理解Handler(四) --- 主线程的Looper为什么不会导致应用的ANR

一、概述是否了解ANR的产生条件是否对Android App的进程运行机制有深入了解是否对Looper的消息机制有深刻的理解在面试中经常也时常会遇到类似的问题,其实这两个八杆子打不着, 通过这篇文章我们好好捋一捋这两者的概念。ANR类型Service Timeout前台服务 20s后台服务 200sBroadcaseQueue Timeout前台广播 10s后台广播 60sContentProvider Timeout10sInputDispatching Tim

2020-10-07 21:47:34 1880

原创 深入理解Handler(三) --- Handler发送延时消息实现

消息延时是如何实现的是发送延时了,还是消息处理延时了延时精准度怎么样我们在面试过程当中经常会被问到 Handler是如何发送延时消息的消息延时处理关键源码分析这里只选取部分代码,完整链路流程可以参考这篇 从源码角度来理解Android线程间消息传递机制这里我们先看插入消息的处理MessageQueue::enqueueMessage boolean enqueueMessage(Message msg, long when) { // 每一个普通Message必须有一.

2020-10-06 18:34:30 3243

原创 深入理解Handler(二) --- 从源码角度来理解Android线程间消息传递机制

一、概述本篇通过源码分析Android线程间消息传递机制消息机制主要包含:Message:消息分为硬件产生的消息(如按钮、触摸)和软件生成的消息;MessageQueue:消息队列的主要功能向消息池投递消息(MessageQueue.enqueueMessage)和取走消息池的消息(MessageQueue.next);Handler:消息辅助类,主要功能向消息池发送各种消息事件(Handler.sendMessage)和处理相应消息事件(Handler.handleMessage);Loop

2020-10-06 16:09:41 513

原创 深入理解Handler(一) --- Android中为什么非UI线程不能更新UI

一、前言通过这篇文章带大家了解以下内容是否能够理解UI线程的工作机制是否熟悉SurfaceView实现高帧率的原理二、为什么非UI线程不能更新UI这个问题我们要从以下几个方面来探讨UI线程的工作机制为什么UI设计成线程不安全的非UI线程一定不能更新UI吗2.1 UI线程是什么怎么来的我们知道所有的App进程通过 Zygote fork出来,当我们的App进程启动后会执行 ActivityThread的main函数,在main函数里会调用Looper对象调用loop函数 p

2020-10-06 15:53:45 725

原创 深入理解Activity(二) ----- Activity显示原理

一、前言这篇文章主要是理解Acitivty对应的视图是如何显示出来的, 每次使用对应的Activity 我们都会去使用 setContentView,今天我们将看下Android中View的显示原理。setContentView原理是什么Activity在onResume之后才会显示的原因是什么windowManager在显示过程起到怎么样的一个作用相关类简介Window :它是一个抽象类,具体的实现类为PhoneWindow,它对View进行管理。WindowManager:是一个接口

2020-10-03 21:35:19 1142

原创 深入理解Activity(一) ----- Activity启动流程

一、前言本篇文章主要整理Activity相关原理的知识点整理。我们平时业务开发基本都离不开Activity,那么我们又对它有多少了解呢,这里不仅会有阶段性的总结还会通过图解和一些必要的信息让你能更好的吸收这块只是和更好的理解整个Activity相关的逻辑与流程,读懂Activity所涉及到知识点,不仅对日常业务开发遇到问题有更全面的分析思路 ,而且如果面试遇到了相关问题,能回答的完善且有脉络。在阅读本系列前可以先思考以下几个问题是否熟悉Activity启动流程中与AMS的交互过程Activity所

2020-09-24 22:50:28 1930 2

原创 一篇文章了解Android MVVM开发 ----- ViewModel

前言MVVM的架构模式,在前端使用React同学,或者在用Flutter开发的同学,都能体会到React的思想用数据直接渲染UI的方便。在Android引入jetpack组件后,如果你还在使用MVP或者MVC的架构方式,赶紧来使用下吧,绝对会让你说出两个字 “真香”。这篇文章主要是介绍如何在项目中使用databinding + ViewModel +LiveData,体会下Android Jetpack给我们带来的方便。实现了单个业务使用ViewModel以及多个Fragment中通信使用viewMo

2020-09-16 16:29:33 1188 2

原创 一篇文章了解Android编译构建 编译优化

前言作为一名Android开发,我们总会面对下面这个按钮,对于一些大型项目,或者对于在编译期间做了很多task的工程都会花去相当多的时间。就我而言,经常跑一个debug的包需要3分钟左右,当跑release的包需要10分钟左右,如果是一些性能差的电脑,这个时间会消耗的更多。今天文章的主题有两个部分,一个是Android的编译都做了哪些事,还有一个是如何提高我们的编译是速度以及相关原理。今天的主题将围绕下面这个按钮开始讲述。什么是编译大家在刚学计算机基础这门课程的时候就知道,“计算机只认识0和1,我

2020-09-12 14:33:26 2435

原创 一篇文章了解CoordinatorLayout和toolbar、悬浮按钮各种联动

前言如果你的业务涉及到列表上下滑动隐藏显示toolbar(标题栏)或者是你的悬浮按钮根据列表的滑动做上下隐藏,左右隐藏。(若是产品提出仿某b站上下滑动隐藏消失,仿某宝购物车移动上下滑动使其左右隐藏显示)那么恭喜你,直接发动 cc + cv 技能 完美完成需求,大家可以先看下下方实现的效果样式。需要看代码的话直接点下方链接github代码直通车toolbar根据滑动上下隐藏实现 <com.google.android.material.appbar.AppBarLayout

2020-09-04 11:10:06 949

原创 这一次,binder真正理解了(五) ----- Binder中Service的查询(获取)

Service的查询(获取)概述在上篇中,我们了解binder数据的写入,以及Client和Service进程的一次进程间通信。在前文中一直反复强调ServiceManager的功能是注册服务,和让client获取服务。到这篇文章中,大家应该对binder有了明显的认识了吧。在 binder 架构中,Service要先向ServiceManager上报自身的名字(全限定名),ServiceManager 存储着Service的名字,客户端并不知道服务的位置,所以需要跟名字服务器(ServiceMana

2020-09-03 17:37:22 971 1

原创 这一次,binder真正理解了(四) -----服务的注册(addService)

Service注册概述我们在上篇文章中,我们了解到如何获取一个ServiceManager对象,这篇我们主要将ServiceManager如何注册服务。大家先看个图,有一个整体的进程交互流程,方便后续源码的理解首先Client进程和Service进程各自向Binder Driver调用 open(),mmap()初始化 ,此流程同样适用某Service与ServiceManager进程通信,例如 MediaPlayerService(Client进程)和ServiceManager(进程)一共可

2020-08-29 18:08:10 1098

原创 这一次,binder真正理解了(三) -----获取ServiceManager

获取ServiceManager注: Binder系列文章 framework 源码使用 android10 release 分支,kernel 部分使用 common 的 android-4.9-q-release 分支。 framework/native/libs/binder/ - ProcessState.cpp - BpBinder.cpp - Binder.cpp - IServiceManager.cppframework/native/include/binder/

2020-08-26 15:40:48 534

原创 这一次,binder真正理解了(二) -----ServiceManager启动

ServiceManager 启动注: Binder系列文章 framework 源码使用 android10 release 分支,kernel 部分使用 common 的 android-4.9-q-release 分支。framework/native/cmds/servicemanager/ - service_manager.c - binder.c kernel/drivers/ (不同Linux分支路径略有不同) - android/binder.c binder原理

2020-08-25 15:40:11 801

原创 这一次,binder真正理解了(一) -----跨进程通信以及AIDL的使用

前言网上有很多有关于binder文章的讲述,读了很多文章,有些直接讲源码,对初学的来说比较抽象,这系列文章先从使用背景,从运用上逐步深入去介绍知识点,希望能有一个更好的理解。这系列文章先从ipc通信讲起,通过AIDL的使用去探binder原理,这一次和我一起理清binder吧,有哪里讲的不好的点,欢迎指正补充,希望这一系列能让大家在以后的面试中能稳稳的回答出binder的相关问题。概述在日常的app开发当中,大家有没有跨进程的使用呢。还是一个进程走到底呢 。 在android里,一个应用启动对应着

2020-08-16 10:41:08 704

原创 音视频开发之旅(六) -----Android集成webrtc降噪和增益模块, ns_core函数简析

音视频开发之旅(六) -----Android集成webrtc降噪和增益模块, ns_core函数简析1.前言再上一章主要介绍了音频文件的相关操作,在录音的过程当中,由于android机型不同的型号,即使采样率设置成44100k,有一定的外接音或者一些噪音等印象,配音出来的结果并不是很好,肯能存在’滋滋声’或者一些声音失真。所以这一章我们将深入操作下音频的原始数据(即PCM文件),需要做一些音频降噪增益的处理,使用户的配音体验能做的更好。这篇文章主要先大致介绍下webrtc。在第三章会讲下如何在Andr

2020-08-08 11:49:35 8365 5

原创 音视频开发之旅(五) -----变声 FMOD和soundTouch使用和对比

音视频开发(五) 变声 FMOD和soundTouch 对比1前言这边先穿插一下变声相关的知识 ,这一章主要讲音频的处理。对音频修改的具体使用工具是 fmod和soundTouch ,按照惯例先给出源码。github直通车2声音基础概念2.1原理声音是一种波动,当演奏乐器、拍打一扇门或者敲击桌面时,声音的振动会引起介质——空气分子有节奏的振动,使周围的空气产生疏密变化,形成疏密相间的纵波,这就产生了声波,这种现象会一直延续到振动消失为止。声音总可以被分解为不同频率不同强度正弦波的叠加。这种变换

2020-07-17 13:08:10 5050

原创 音视频开发之旅(四) -----在Android调用ffmpeg so库和.a库

1 .前言Andorid是支持C++库的,libc++ 的共享库为 libc++_shared.so,静态库为 libc++_static.a静态库如果应用的所有原生代码均位于一个共享库中,这样可让链接器最大限度内联和精简未使用的代码,使应用达到最优化状态且文件最小巧。在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。静态库对函数库的链接是放在编译时期完成的。动态库*动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。不同的应用程序如果调用相同

2020-07-10 14:53:29 1090 1

原创 音视频开发之旅(三) -----ffmpeg功能和相关命令

音视频开发(三) -----ffmpeg功能和相关命令前言说到ffmpeg,在我一开始还未接触到音视频相关知识的时候,只是觉得这个是一个操作音视频的,但是不知道具体是操作音视频哪些细节(比如解码啊、转码啊等等),在上半段文中,主要介绍ffmepg的相关命令,让大家体会一下ffmpeg的强大功能,在后文中,会尝试如何在android中调用ffmpeg的一些简单方法。这一章涉及到的音视频基础概念,比如码率、帧率等不再做重复解释了,大家对某些概念有遗忘的可以返回 音视频开发之旅(一)在第一篇我们的源码里,有

2020-07-01 21:07:50 548

原创 音视频开发之旅 (二) --- cmake相关知识和Jni常用知识

音视频开发之旅 (二) — cmake相关知识和Jni常用知识前言由于编译和使用ffmpeg涉及到 cmake和jni的相关知识,所以这一篇主要巩固这一块Android和C交互的相关知识点,从入门的同学角度来看,这是非常适合的一篇入门文章。如果已经熟悉这块的同学,可以将这一篇当作工具文章,方便查阅,若是想看demo的同学可以直接通过以下链接 相关代码在module-ffmpeg1. Cmake概述您可以向 Android 项目添加 C 和 C++ 代码,只需将相应的代码添加到项目模块的 cpp 目

2020-07-01 12:28:48 549

原创 音视频开发之旅 (一) --- 基础音视频知识和ffmpeg编译

音视频开发 (一)1.常用概念音视频相关名词、术语、概念1.1帧率用于测量显示帧数的量度,测量单位为每秒显示帧数(fps)或 赫兹(Hz)。每秒显示帧数(fps)或者图形处理场时每秒能够更新的次数。一般来说30fps是可以接接受的,如果能将性能提升至60fps则可以明显提升交互感和逼真感,但是超过75fps就不容易察觉有明显的的流畅度提升。如果帧数超过屏幕刷新率,则会浪费图像处理能力,因为监视器不能以这么快的速度更新,这样超过的部分就浪费了。1.2分辨率视频成像产品所形成的图像大小或尺寸1

2020-06-23 20:29:52 722

原创 浅谈Android里的Hook技术

浅谈Android里的Hook技术简介Hook技术要先提到逆向工程,其主要目的是在不能轻易获得必要的生产信息的情况下,直接从成品分析,推倒出产品的设计原理。逆向分析分为静态分析和动态分析,其中静态分析指的是一种在不执行程序的情况下对程序行为进行分析的技术,而动态分析是指在程序运行时对程序进行调试的技术。Hook技术就属于动态分析,在android中,动态的获取某一个实例的某些方法,这一点大家可...

2020-03-23 16:57:00 843

原创 浅谈Android应用程序进程启动过程

浅谈Android应用程序进程启动过程1 应用程序进程简介要想启动一个应用程序,首先要保证这个应用程序所需要的应用程序进程已经启动。AMS在启动应用程序时会检查这个应用程序需要的应用程序进程是否存在,不存在就会请求Zygote进程启动需要的应用程序进程。在Zygote的java框架中会创建一个Server端的Socket,这个Socket用来等待AMS请求Zygote来创建新的应用程序进程。...

2020-03-23 14:04:08 797

原创 AOP 面向切面编程 笔记

AOP 面向切面编程 笔记基础概念1.什么叫AOPAOP即面向切面编程,是OOP编程思想的一种延续。利用AOP,我们可以对业务逻辑的各个模块进行隔离,从而使得业务逻辑的各个模块进行隔离,从而使得业务逻辑各个部分之间的耦合度降低,提高程序的可充用性,同时提高开发的效率。利用AOP,我们可以在无侵入状态下在宿主中插入一些代码。常见的应用场景,比如日志埋点、性能监控、动态权限控制、代码调试等。...

2020-03-16 11:51:01 165

原创 一篇文章了解ActivityManagerService

一篇文章了解ActivityManagerService1.1 Activity启动过程看AMS在阅读Android源码时,我们总会看到很多关于AMS相关的代码,那么AMS到底是什么呢?一个服务?还是只是单单具象的一个类?接下来我们从Activity启动过程看下AMS到底起到什么作用。1.1.0 Android 28 AMS家族在Activity的启动过程中会调用到AMSInstrum...

2020-03-16 11:45:55 568

原创 Android卡顿相关原理和排查工具

Android卡顿优化思考前言大家在平时使用手机的时候,是否遇到过我的网络明明很好,怎么一个页面半天跳转不过去,或者是,经常看到在玩王者荣耀和刺激战场时,画面都卡成ppt了,完全是ppt游戏。画面流畅度不够,掉帧特别严重。基础知识造成卡顿的原因可能有千百种,不过最终都会反映到 CPU 时间上。我们可以把 CPU 时间分为两种:用户时间和系统时间。。用户时间就是执行用户态应用程序代码所消耗...

2020-01-07 14:22:41 2150

原创 Android camera2 实现估算眼睛到屏幕的距离 人脸识别 护眼实验室

记一次不成熟功能的开发记录主要使用的APIcamera2 FaceDetector一、实现思路:1.首先用camera2打开前置摄像头获取前置摄像头的照片2.通过FaceDetetoc来获取人双眼的间距3.我们知道摄像头的成像,近大远小。那么越远的距离,我们获取到眼间距的距离会越小,反之,则越大。4.取一个已知大小(长或宽)的参照物,在已知特定距离在手机上成像的大小,通...

2019-12-21 11:43:09 4218 1

原创 一篇文章掌握各种Android动画!

一、引言android的动画可以分为3种:View动画、帧动画和属性动画。View动画就是我们比较常见的对一些图形变化(平移、缩放、旋转、透明度),并且View动画支持自定义,官方提供距离,中心点,播放时间等等方法供我们使用。帧动画通过顺序播放一系列图像从而产生动画效果,类似以前老电影那种逐帧播放的感觉。属性动画,故名思议,修改相关View的属性,我们在用View动画的时候,无论View的平...

2019-11-23 11:33:36 302

原创 仿拼多多评团列表倒计时循环滚动 Android

仿拼多多评团列表倒计时循环滚动,每段时间自动滚动Android现在开始动手撸代码首先要改下recyclerview的逻辑package com.hugh.basis.rvlooper;import android.content.Context;import android.support.annotation.Nullable;import andr...

2019-08-19 09:24:18 2573 2

原创 完整 MAC上Android在SonraQube上配置、应用

MAC上Android在SonraQube上配置、应用1、安装相应工具sonarqube安装包 jdk11 (最新版的sonarqube需要jdk11) SonarQube Scanner (brew install sonar-scanner)安装完 使用 sonar-scanner -v测试下INFO: Scanner configuration file: /...

2019-08-16 17:34:43 674

原创 Android Activity启动流程 ----基于Android 9(pie)

Android Activity启动流程1、前言Activity跳转在我们日常的项目当中时最基础的用法,对下面这行代码大家肯定都很熟悉,今天就准备深入源码进行了解下里面都做了什么,这篇文章的代码基于Android 9(API 级别28)。我们熟悉使用轮子之后,阅读源码之后,我们才能汲取里面优秀的部分,无论是之后我们在业务开发,还是遇到一些跳转的问题,我们都能提高自身的编码水平并且能够...

2019-06-17 12:03:02 315

原创 Android Pie源码阅读 -----深入理解init(一)

在阅读源码之前,我们应要熟悉整个Android的系统架构,在针对某一层进行深入理解,否则东看西看没有方向没有目标会导致思绪紊乱,这样读源码的效果不佳这篇文章主要参考gityuan阅读Android 7.0的源码,顺着他的思路我理了一遍Android 9.0的代码,如果有地方理解错了,谢谢指出!!Android整体系统框架Linux 内核Android 平台...

2019-06-15 21:59:32 689

简单的火车票订票系统

面向对象,简单的火车票订票系统,对java初学者来说可以稍微做下参考

2018-02-26

空空如也

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

TA关注的人

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