- 博客(349)
- 资源 (60)
- 收藏
- 关注
原创 由浅入深 学习 Android Binder(八)- IServiceManager与BpServiceManager(native层)
概述前文已经讲解过java层ServiceManager的逻辑,如果没有了解过的读者建议看下:由浅入深 学习 Android Binder(七)- IServiceManager与ServiceManagerNative(java层)此文承接前文,继续讲下在native层的IServiceManager,具体的path是/frameworks/native/libs/binder/IServiceManager.cpp。native层还有/frameworks/native/cmds/servi
2021-01-11 08:34:26
2588
原创 许佳佳的2020,疫情下格外有意义的一年
晚上11点仍在工作的医务工作者这张照片拍摄于2020年12月30日晚上11点多。我们在西二旗租的房子附近,近期来过一名新冠的患者,因此安排了集体的新冠检测。我和老婆本来是安排下午4点的检测,由于人员过多,一直等到晚上10点多都没有安排上。尽早的拿到检测结果,在家隔离的我就可以尽早去公司上班,毕竟在家工作的效率还是太低了。最终我们是当天没有安排上,在第二天中午又重新安排的检测。本来是一件很让人烦躁的事,看到这张照片的时候莫名的平静。我们的那些小事与 在疫情中失去或付出更多的人们相比,又算得了什么
2021-01-05 08:49:13
996
2
原创 由浅入深 学习 Android Binder(七)- IServiceManager与ServiceManagerNative(java层)
概述ServiceManager于android binder来说是非常重要的一部分。ServiceManager在java层与native层都有各自的逻辑,本文主要讲下java层ServiceManager的逻辑。如果了解过binder的读者,可能也多少会听说过binder与serviceManager的关系为了方便读者有个整体的认知,附上整体的流程图:何处使用了ServiceManager前文由浅入深 学习 Android Binder(二)- bindService流程中,在clie
2021-01-04 08:47:51
3733
原创 从小地方到大城市,是“翻身的起点”还只是“昙花一现”
我和老婆都是从小地方来的北京,现在工作于某个短视频互联网公司。近期,我和我老婆在慢慢筹备婚礼,因此会不由自主的畅想未来。结果想来的更多的,,其实是焦虑。大城市 or 小城市如果想在大城市安家,那么仅仅房子就可能是压死我们的一座大山,更别提还要考虑车位、车牌、小孩的学区这些。如果想要工作几年回小城市,那么回去就等于失业,或者说等于是放弃了作为程序员的职业生涯,小城市很少能有相关岗位,更别提公司前景,是否能涨薪这些了。而作为程序员,目前网上经常说的35岁危机,也的确是骇人听闻。不同的自我定位想想块
2020-12-27 09:44:28
532
原创 由浅入深 学习 Android Binder(六)- IPC 调用流程
概述如果使用aidl来进行IPC,在client进程执行的transct方法后最终会执行到server进程的onTransact方法,如下图:对aidl还不是很了解的读者可以看下笔者的前文:由浅入深 学习 Android Binder(一)- AIDL那么在client进程调用transact后,究竟触发了哪些逻辑呢?本文将针对此点深入探索。此文探讨的是两个进程之间的IPC。如果是同一个进程之间调用,流程会简单一些,有兴趣的读者可以自行探索。调用流程先给出流程图,便于读者有一个整体
2020-12-19 07:55:03
3192
4
原创 由浅入深 学习 Android Binder(五)- binder如何在进程间传递
概述前文分析过bindService源码,该文章地址如下:由浅入深 学习 Android Binder(二)- bindService流程最终得到时序图如下:如上图,client进程与server进程是通过系统进程来进行通信的。实际demo中,有两个场景我们会接触到binder:client进程通过serviceConnection获取到系统进程传递的binder。server进程将service.onbind()返回的binder传递给系统进程。我们就以server给系统进程传递bi
2020-12-12 10:16:49
2971
1
原创 由浅入深 学习 Android Binder(四)- ibinderForJavaObject 与 javaObjectForIBinder
概述前文已经解析了java层binder在native层的形式。前文地址:由浅入深 学习 Android Binder(三)- java binder深究(从java到native)前文由于篇幅限制,没有继续探索JavaBBinder与BinderProxy,此文则将继续深入相关逻辑。ibinderForJavaObject 与 javaObjectForIBinderjava与native之间通过JNI来实现数据的传递与交互。主要就是通过native层的ibinderForJavaObje
2020-12-11 08:31:36
1941
原创 由浅入深 学习 Android Binder(三)- java binder深究(从java到native)
概述前文地址:由浅入深 学习 Android Binder(二)- bindService流程前文讲到bindService流程,其中多次碰到用binder实现的IPC,有以下几个:client进程 通过IPC 通知AMS进程去bindServiceAMS进程 通过IPC 通知server进程去bindServiceserver进程 通过IPC 通知AMS进程bindService结果AMS进程 通过IPC 告诉client进程bindService结果本文就选择”client通知AM
2020-12-06 05:12:49
1763
2
原创 由浅入深 学习 Android Binder(二)- bindService流程
概述前文已经讲过了binder在aidl的IPC中所起到的作用。其中的Binder是通过ServiceConnection+bindService获取到的。本文承接前文,详细探索一下从bindService到ServiceConnection.onServiceConnected()的流程。bindService流程bindService的流程其实有两种场景:Service冷启动Service热启动本文为了分析的更加全面,因此主要分析”Service冷启动“的场景。笔者此处先列出流程,读
2020-11-22 08:46:47
3840
原创 由浅入深 学习 Android Binder(一)- AIDL
概述demo项目 github地址:aidl是常用的android IPC方式,本文将根据一个demo来解析下AIDL的原理。为了便于读者理解,本文不会探究Binder的实现细节,可以认为Binder在此文的分析中被看做是一个“黑盒”。有一定经验的读者可以直接到文末看总结,最终流程图如下:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bLrLwiAU-1605878532480)(evernotecid://214C33E9-92BC-434E-8AEC-B93
2020-11-22 08:37:59
8373
9
转载 Java8 JVM内存结构变了,永久代到元空间
JVM内存结构的细化为了更细化的讲解,我们将该图进行进一步的优化调整。针对java7及以前版本的细化。看出变化了吗?堆和方法区连在了一起,但这并不能说堆和方法区是一起的,它们在逻辑上依旧是分开的。但在物理上来说,它们又是连续的一块内存。也就是说,方法区和前面讲到的Eden和老年代是连续的。在继续进行下去之前,我们先来理解两个概念:规范和实现。规范和实现针对Java虚拟机的实现有专门的《Java虚拟机规范》,在遵守规范的前提下,不同的厂商会对虚拟机进行不同的实现。 就好比开发的过程中定义了接口
2020-11-13 21:28:21
658
原创 一篇文章理解进程、线程、协程
概述笔者之前已经对进程和线程有过了一定的探索,有兴趣的读者可以了解下:进程和线程的区别(Linux)近期笔者又接触到了协程,顺便也想尝试用一种更加通俗易懂的方式讲下这几个概念。期望能对有需要的读者有所帮助,如有理解不对的地方欢迎评论指出。为什么要有多进程?多进程目的:提高cpu的使用率例子:一个用户现在既想使用打印机,又想玩游戏。假设只有一个进程(先不谈多线程)从操作系统的层面看,我们使用打印机的步骤有如下:使用CPU执行程序,去硬盘读取需要打印的文件,然后CPU会长时间的等待
2020-11-01 08:17:42
1500
2
原创 Android存储空间总结
概述Android存储在6.0之前,真的可以用“混乱不堪”来形容。造成的原因很多,个人认为有以下几点:android早期手机本身的内存很小,大部分app的读写都在sd卡内操作。用户权限意识薄弱,android 6.0之前直接在安装时申请权限,用户往往在未知情况下就给予了存储权限。app为了使自己的应用数据好看,直接将资源存储到sd卡,存储在sd卡的文件将不会计算成该app的内存占用。app处于卖方市场。如果不给存储权限用户就无法使用app部分甚至全部功能。目前,随着Android越发完善,
2020-10-25 08:45:36
2502
5
原创 Android 悬浮窗日志工具
概述github地址:https://github.com/Double2hao/StudyFloatUtil在多端交互的场景中,客户端往往只扮演着平台的角色。最常见的如webview,小程序等等——客户端虽然是最终程序的展现平台,但是逻辑却不会由客户端的工工程师来直接开发,而是由前端的工程师开发完后运行在客户端上。由于客户端的功能是由客户端工程师提前开发好后提供给前端的工程师调用,因此这些功能一旦出现问题,那么就需要客户端工程师和前端工程师一起联调沟通解决。类似于这样的场景中,为了减少开发和
2020-10-17 14:53:40
2691
原创 android viewpager无限轮播
概述github地址:https://github.com/Double2hao/ViewPagerCycleTest一直很好奇ViewPager无限轮播的实现方式,于是稍微研究了下,作此文记录之,效果如下:原理一般情况下ViewPager的size等于显示的fragment的个数。无限轮播只需要,将ViewPager的size设置成无限大,通过取余后的值来显示Fragment即可。此demo中还加入了timer来自动轮播。并且如果用户手动滑动的话,自动轮播会停止。关键代码无限轮播
2020-10-17 10:57:36
12721
原创 mysql索引原理:B-Tree 和 B+Tree简介
本文参考:https://www.kancloud.cn/kancloud/theory-of-mysql-index/41856完全不了解B-Tree的读者可以先看下这篇文章:https://www.kancloud.cn/kancloud/theory-of-mysql-index/41844B-TreeB-Tree毫无疑问是树结构,如下图:主要有以下特性:d为大于1的一个...
2020-10-17 10:42:51
1782
2
原创 RecyclerView 回收机制解析
概述近期接触到RecyclerView回收机制相关的内容,于是作此文记录下相关探索。如记录的有问题欢迎评论探讨。定位回收机制源码笔者使用debug的方式,在adapter的onCreateViewHolder中打断点,于是得到该任务栈。思路:onCreateViewHolder是创建viewHolder的方法,那么在调用这个方法之前一定有是否复用的判断,因此断点在这个方法可以找到相关方法。然后我们就可以发现是RecyclerView#Recycler的tryGetViewHolderFor
2020-10-17 10:36:28
1745
原创 git diff的生成方式:myers diff算法
概述本文参考:https://blog.jcoglan.com/2017/02/12/the-myers-diff-algorithm-part-1/每个开发者多少都接触过git的diff功能,如下图:该功能能够展示出某个文件的改动信息,非常便于开发者的日常开发。本文将探讨下此功能实现的原理。myers diff 做了啥引用个例子a = ABCABBAb = CBABAC现在要找出ab之间的diff。仔细想一想,我们会发现其实两者之间的diff情况是有无数个的,比如可以找到以下几
2020-09-20 08:21:43
2580
原创 线程池解析(四)——submit源码解析(Runnable、Callable、Future、FutureTask)
概述线程池的submit也是常用的方法之一,它有很多个重载,涉及到了很多个类。本文将探索submit方法以及相关的各个类。submit源码我们看下ThreadPoolExecutor中sumit相关的源码。 protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) { return new FutureTask<T>(runnable, value);
2020-09-12 10:14:58
2236
原创 线程池解析(三)——Worker源码解析
概述在ThreadPoolExecutor中以Worker为单位对工作线程进行管理。那么Worker具体是做了什么呢?本文将围绕这个话题展开。Worker源码 private final class Worker extends AbstractQueuedSynchronizer implements Runnable { /** * This class will never be serialized, but we prov
2020-09-12 10:13:20
1144
原创 线程池解析(二)——execute、addWorker源码解析
概述线程池使用execute执行任务,在创建线程池后,开发者只要调用这个方法就能愉快的使用线程池了。本文将探索下其内部实现逻辑。execute源码 public void execute(Runnable command) { if (command == null) throw new NullPointerException(); int c = ctl.get(); if (workerCountO
2020-09-12 10:10:30
1246
1
原创 线程池解析(一)——概念总结
线程池作用节省资源。使用线程池可以避免每次异步操作都去创建一个线程。提高响应速度。由于线程池本身会创建一些线程,能够节省创建线程池的时间。更好的管理线程。线程池可以控制其线程的创建停止,存活个数等等。不仅能够保证系统的稳定运行,同时也可以更加方便的性能调优。核心参数corePoolSize核心线程数。线程池中使用会保留的对象,maximumPoolSize线程池上限。线程池中线程的最大个数keepAliveTime线程维持时间。corePoolSize<当前线程个数&l
2020-08-29 10:24:58
602
原创 Gson 根据条件解析
概述Gson在实际使用中,可能出现需要根据其中的某些参数来决定另外的参数的类型的情况,如下数据结构:public class DataOne { public int type;//0代表data是DataTwo 1代表data是DataThree public Object data;//类型是DataTwo 或者DataThree}public class DataThree { public int height; public int width;}public c
2020-08-21 07:32:19
725
原创 小程序小游戏更新机制总结
概述本文主要从以下几点总结下小程序(小游戏)的更新机制:必要字段自动更新逻辑旧版本的清理优化本文后面阐述统一用“小程序”替代“小程序或小游戏”必要字段最小可使用的版本小程序并不一定会去兼容所有的老版本。有些情况下,老版本会直接无法运行,小程序会期望用户必须更新到某个版本。这里笔者也考虑过使用使用一个字段来表明“是否要强制更新”。但是考虑后发现很有问题,比如有ABC三个版本,B设置“强制更新”,C设置“非强制更新”,这样一旦出现A->C的情况就有问题了。B设置“强制更新
2020-08-21 07:30:52
3279
1
原创 android Activity任务栈使用总结
前言android上对于任务栈的控制还是比较常见的,尤其是在小程序、小游戏的场景。笔者近期也有在实际项目中碰到,因此就好好学习了一下,作此文以记录。本文主要还是自己的一些使用总结,如有不对或者需要补充的地方,欢迎评论交流。此文需要有对android启动模式的基础,还不了解的读者推荐看下笔者前面的文章:完全理解android Activity启动模式LauchMode (深入Activity与任务栈)使用概念android上要使用多任务栈,除了要了解启动模式之外,就是需要了解taskAffi
2020-08-01 14:33:53
3552
原创 android handler postDelay源码解析
概述postDelay是在android中经常用来处理时延任务的操作。近期突然比较好奇postDelay实现时延的原理,于是学习后作此文。如果对handler原理还完全不了解的读者可以看下笔者的此篇文章:Handler源码解析postDelay的调用过程 public final boolean postDelayed(@NonNull Runnable r, long delayMillis) { return sendMessageDelayed(getPostMessag
2020-07-18 17:36:30
1485
原创 android 自定义View的几种方式
概述本文主要总结一下笔者实际项目中碰到的自定义View的几种方式,以及优劣。大概有以下几种方式:使用时绑定不使用xml,直接java实现一次定义,随处可用本文更多的还是个人使用经验的总结,如有错误或者需要补充的地方,欢迎评论交流。Demodemo中分别使用三种方式实现了类似的布局。除了作者将列出的优劣之外,读者可自行查看代码来进行比较。实现效果与项目文件如下:一、使用时绑定优势页面布局与View的业务逻辑解耦。页面布局使用xml实现,可以预览,在页面较复杂的情况下,可以
2020-07-18 10:23:42
3307
原创 webview 实际项目 使用总结
概述webview在客户端使用非常广泛。本文主要针对个人对webview的应用和学习对相关知识点做一个总结,如有整理的不对或者不同意见欢迎评论交流。目前市场上的app使用场景有以下:(只是举例,并不代表所有场景)广告页面活动页面与客户端app功能关系不大,但是两端都要有的页面。例如:客服页面,申诉页面,签到页面等。优劣使用webview主要有以下优势:不用跟客户端版本,开发灵活。随时可以发布新内容或者修改bug。双端统一,一份代码在android与ios两端都可以使用。业务上解耦
2020-07-11 16:23:00
1394
原创 android动画如何更新UI(ValueAnimator源码解析)
概述android动画经常会碰到卡顿,或者阻塞主进程之类的问题。为了排查此类问题,不得不对动画原理了解一二,于是作此文。此文围绕两个主线问题展开:ui更新的频率是如何控制的?比如,1秒内会更新多少次?每次更新UI的时候所带的update的value是如何控制的?比如,现在有个0到100的动画,在第三次执行update的时候,value是多少?对动画还是不太了解的读者可以看下笔者之前的文章:Android动画总结 (valueAnimator、objectAnimator、Animat
2020-06-20 19:40:09
1449
原创 android自定义动画插值器(Interpolator)
前言之前已经讲过动画相关的内容,没有接触过的读者可以看下笔者之前对android动画使用的整理。Android动画总结 (valueAnimator、objectAnimator、AnimatorSet、PropertyValuesHolder、Interpolator)插值器概念动画插值器可以用来控制动画的变化规律,比如变化速率是先快后慢,还是先慢后快,或者是更细节的其他。android系统已经提供了一些常用的插值器,基本已经能满足大部分需求,对此有兴趣的可以看下笔者前言中的文章,此处就不徒
2020-06-20 14:32:14
2434
原创 一篇文章理解 同步异步、阻塞非阻塞
前述同步异步,阻塞非阻塞是一些非常常见的概念,但是对于开发者来说往往是用到了很难说清楚。笔者专门整理了下这方面的概念,作此文以记之。这部分内容可能存在一些争议,如有不同意见欢迎评论交流。概念个人理解同步异步与阻塞非阻塞最好的区分是从描述对象上:同步异步:用于描述任务、事件或者行为。阻塞非阻塞:用于描述线程或者进程是否会被挂起。同步一个任务调起另一个任务的时候,会去等待其任务返回结果(或执行结束),然后再继续执行。如下两图都是同步操作:在Task A调用Task B后,Task
2020-06-06 18:35:51
1981
原创 【StudyDownload】断点续传Demo
StudyDownloadStudyDownload项目地址:https://github.com/Double2hao/StudyDownload此项目展示了断点续传功能的简单实现,主要实现了以下功能:支持下载中途暂定下载将下载进度存储到本地,重启app后会从上次下载的位置开始下载支持清除原有的数据 理论概述本项目为了让项目更加简单化,尽量避免使用其他非基础知识。下载与文件的异步操作使用AsyncTask来实现,本地存储使用SharedPreferences来实现。断点续传
2020-06-06 11:28:14
481
转载 Android ActivityManagerService (AMS)总结
转载前言AMS在Android中算是比较重要的一个知识点,不管是binder的源码还是Serveice的源码,都是涉及到AMS的,因此理解“AMS是什么”对一个Android开发者来说还是很有必要的。笔者之前也有分析过相关的源码:bindService 源码解析(为什么是异步)已经有博主总结的比较好了,因此就不重开篇幅了。原文地址:https://github.com/xiangjiana/Android-MS/blob/master/android/ams.md概述ActivityMa
2020-05-23 14:30:18
3801
3
转载 HTTP缓存
原文地址:https://www.jianshu.com/p/b32d13655be7客户端缓存场景1、如果HTTP支持缓存,那么在缓存没有过期的情况下,会使用本地缓存。2、如果HTTP支持缓存,并且缓存已经过期,那么客户端不用使用本地缓存,会向服务器请求。HTTP header客户端是否对HTTP协议缓存,一般是根据HTTP协议的header来控制的。通用的主要有以下几个header。(并不是都会被使用到,具体要看服务器和客户端如何协商的)HTTP本身只是一个协议,是需要服务器与客户端一.
2020-05-23 11:31:34
356
转载 OKHttp源码解析 (复用连接池)
原文地址:https://www.jianshu.com/p/6166d28983a2复用连接池相关的主要三个类RealConnectionConnectionPoolStreamAllocation对流的处理使用Okio,Okio是okhttp中用于处理io的模块,没接触过的读者可以参考这篇文章:https://www.jianshu.com/p/f5941bcf3a2dRealConnection 要点代表着链接socket的链路,如果拥有了一个RealConnection.
2020-05-16 17:09:23
957
转载 Android 热修复原理(java类加载机制)
原文地址:https://www.jianshu.com/p/cb1f0702d59f热修原理(java类加载机制)DexClassLoader在加载一个类时会先从自身DexPathList对象中的Element数组中获取(Element[] dexElements)到对应的类,之后再加载。采用的是数组遍历的方式,不过注意,遍历出来的是一个个的dex文件。在for循环中,首先遍历出来的是dex文件,然后再是从dex文件中获取class,所以,我们只要让修复好的class打包成一个dex文件,放于E.
2020-05-16 16:08:07
699
转载 Java与Android的类加载器
双亲委派模型在加载一个字节码文件时,会询问当前的classLoader是否已经加载过此字节码文件。如果加载过,则直接返回,不再重复加载。如果没有加载过,则会询问它的Parent是否已经加载过此字节码文件,同样的,如果已经加载过,就直接返回parent加载过的字节码文件,而如果整个继承线路上的classLoader都没有加载过,才由child类加载器(即,当前的子classLoader)执行类的加载工作。特点显然,如果一个类被classLoader继承线路上的任意一个加载过,那么在以后整个系统的生命周期
2020-05-16 15:46:21
461
原创 解决方案:android onstop 延迟回调 10s的问题
概述近期碰到activity onstop延迟回调10s的问题。关于问题的具体复现和原因,有博主总结的很不错,此处给上原链接:深入分析Android中Activity的onStop和onDestroy()回调延时及延时10s的问题此文主要记录一下笔者目前认为的解决方案,以及各方案的优劣。1、避免过度频繁或耗时的主线程操作假设现在是ActivityOne跳转到ActivityTwo,那么...
2020-04-19 09:28:22
2837
原创 【StudyRouter】路由的自动注册
StudyRouter项目地址:https://github.com/Double2hao/StudyRouter此项目通过使用动态编译、注解解释器等技术,用最简单的方式实现了路由的自动注册。如对这方面知识有兴趣的朋友可以看看。实现通过注解解释器生成辅助类通过Transform出辅助类和要注入代码的位置。在相应的位置调用辅助类的相关代码,实现自动注册。涉及知识点列表笔者...
2020-04-19 08:18:27
603
原创 ARouter init 源码解析(自动注册的实现)
概要使用ARouter,我们只需要在必要的地方加上注解,然后在application中init Arouter就可以直接通过代码进行路由跳转了。为什么我们可以不用写任何注册的代码,就直接跳转到相关路由呢?答案肯定是——ARouter帮我们做了。@Route(path = "/test/activity2")public class Test2Activity extends AppComp...
2020-04-05 12:16:18
1913
2
android图片轮播效果,RollViewPager的简单使用
2016-05-06
android Fragment与Activity互相发数据(附图详解)
2016-03-25
实验二 插值方法(android)
2016-04-22
android 自定义控件(底部icon点击效果)
2016-04-08
实验一 直接法解线性方程组(android)
2016-04-14
onMeasure简单方法 完美解决ListView与ScollView!
2016-05-22
android Activity的启动模式 作用简析+demo详解
2016-03-19
android ContentResolver的使用(获取和修改联系人信息demo)
2016-04-07
android canvas\paint\path简单使用(自定义view必学)
2016-04-01
android RecyclerView布局真的只是那么简单
2016-04-18
android Fragment与Activity交互,互相发数据(附图详解)
2016-03-26
android 滑动删除的listview(自定义view)
2016-03-29
学生宿舍管理系统 学生宿舍管理系统
2016-03-04
实验三 数值积分(android)
2016-05-08
实验四 常微分方程的数值解
2016-05-11
残缺棋盘 android实现颜色填充
2016-05-17
android RecyclerView布局
2016-04-22
android RecyclerView布局真的只是那么简单!
2016-04-18
为RecyclerView添加FootView和HeadView
2016-10-11
最简易的网络框架封装(新手可看)
2016-09-07
给自定义View添加xml属性
2016-08-04
完全理解android事件分发机制
2017-01-12
RecyclerView超简单demo(局部更新取代ListView)
2016-06-08
快速入门android AIDL(开启多进程并进行通信)
2016-06-10
为RecyclerView添加分页加载(上拉加载更多)功能
2016-10-11
ASP.NET 个人信息注册页面,并跳转显示
2016-11-23
实验五 迭代法解线性方程组与非线性方程(android)
2016-05-24
ASP.NET 电影票信息的增删查改
2016-12-14
学生信息管理系统2222
2016-09-23
FragmentTransaction使用全解
2017-03-03
android 实现FlowLayout 流线布局(自定义ViewGroup)
2016-10-18
Android单元测试-对Activity的测试
2017-08-14
android socket聊天室——也不仅仅是聊天室
2016-11-21
用Scroller完成一个简单的ViewPager
2017-02-23
ListView异步创建View
2017-07-14
Android单元测试-对Activity的测试 [
2017-08-15
实验五 迭代法解线性方程组与非线性方程(android)1
2016-05-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅