自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

lyldalek的博客

我的梦想是:人人有功练!!!

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

原创 多渠道打包

在 【Android V1 V2 签名机制】里面分析了美团在 V1 签名机制下的多渠道打包,但是没有分析 V2 机制的多渠道打包。由于 V2 机制下多渠道打包涉及到 APK 结构,所以这里专门新起一篇。由于 APK 也是一个压缩包,所以我们先来看一下 ZIP 文件的结构。ZIP 文件结构一个普通的 ZIP 文件结构如下:[文件头+文件数据+数据描述符]{此处可重复n次} + 中央目录 +...

2019-08-16 10:51:51 517

原创 Android V1 V2 签名机制

很早之前就想写这个,直到现在才有时间。理解了这个发现对 HTTPS 也有了进一步的理解。为什么需要签名 ?了解 HTTPS 通信的同学应该知道,在消息通信时,必须至少解决两个问题:一是确保消息来源的真实性二是确保消息不会被第三方篡改我们先来看 HTTPS 签名以及校验的过程:[外链图片转存失败(img-kSnaDIy1-1565923799120)(https://github...

2019-08-16 10:50:19 595

原创 CompletableFuture 的使用

遇到这样的一个问题:写一个任务控制器,支持添加多个任务异步执行,任务间可以设置依赖,没有依赖的任务并行,有依赖的串行。我刚开始一想,发现这个不是很简单么,写了包装类包装一下 Runnable,然后给它加一个添加依赖的功能不就好了么。后来发现没有我想的这么简单,首先循环依赖没有解决,这个问题这里就不深入了,就假设它没有循环依赖。有了这个假设作为前提,我写出了第一版代码:class Task(...

2019-08-05 20:50:23 181

原创 自定义LayoutManager

在做了这么长时间的Android开发,还没有遇到过这个需求,不过看了别人的很多效果,感觉很棒,所以找了时间就研究了一下,现在做一些记录,等以后有了相关需要可以快速回顾。在我学习的过程中,不可避免的遇到了很多问题,有的已经解决,有的还未解决,所以这个 Demo 就是看个乐呵吧。自定义一个 LayoutManager 整体给我的感觉是与实现自定义 ViewGroup 的 onLayout 比较像。...

2019-08-05 19:30:24 680

原创 Apk 打包流程及扩展

CSDN 越来越垃圾了,连 Github 的图都转存不了。图裂了请看,我的 Github 地址 : https://github.com/aprz512/blog4aprz512/blob/master/Blog/Android-每日一问/Apk打包流程.md我们开发一个应用,大概会有这些东西:源代码三方库图片,so等一些资源那我们从源文件说起,一个项目的源文件一般都是...

2019-08-05 19:28:52 171

原创 IO 阻塞

昨天在整理自己的博客的时候,想到的一个问题:进程在从磁盘中读取内容的时候,CPU 在干什么???之所以会这样问,是因为,CPU的速度比磁盘要快很多,具体有多块,看这篇文章。磁盘寻址时间为 10ms,换算成人类时间是 10个月,刚好够人类创造一个新的生命了。如果 CPU 需要让磁盘泡杯咖啡,在它眼里,磁盘去生了个孩子,回来告诉它你让我泡的咖啡好了。这是从文中截取的一段,可以体会一下。那么...

2019-07-28 16:03:32 2474

原创 View 的 onMeasure 方法

View 的测量过程中,有一个比较重要的类需要掌握:MeasureSpec。我们在阅读源码的时候会发现,在 View 的测量过程中,MeasureSpec 是一个会经常出现的类,如果不先掌握这个类的话,是没法阅读下去的。MeasureSpec 会在很大程度上决定一个 View 的尺寸规格,之所以是很大程度上是因为这个过程还受父容器的影响,因为父容器影响 View 的 MesaureSpec 的创......

2019-07-28 14:51:53 511 2

原创 中点圆算法

当我们在手机屏幕上绘制一个圆的时候,有没有想过这个圆是怎么绘制出来的呢?由于屏幕的像素是一粒一粒的,所以不像我们在一张纸上,可以利用 sin/cos 函数计算出来。看一张图:将手机屏幕放大了看,你就会看到上图所示的情景,那么这些像素点的位置是如何计算出来的呢?其实就是使用了中点圆算法。在计算机图形学中,中点圆算法是一种用于确定绘制一个圆所需的像素点的算法。算法概念该算法的目标是找到一个...

2019-07-24 14:15:03 880

原创 Android进程与应用的生命周期

官方文档在这里。本来,官方文档的部分内容已经汉化了,但是翻译实在是惨不忍睹,而且有些内容与原文还不一致,真不晓得是怎么回事。大多数情况下,每个 Android 应用程序运行在自己的 Liunx 进程当中。在应用中的某些代码需要运行的时候,这个进程就会被创建出来,它会一直运行,直到该进程不再被需要了或者系统需要释放该进程占用的内存以便让别的应用运行。Android 有一个特殊的基本特征:应用程...

2019-07-23 19:49:34 219

原创 ViewGroup 的 generateLayoutParams 方法的作用

不知道大家在编写布局的时候有没有这样的疑问:在 RelativeLayout 布局里面可以对子控件使用 layout_alignParentRight 等属性,但是在 FrameLayout 或者 LinearLayout 中就没有,这是为什么呢? <RelativeLayout android:layout_width="match_parent" ...

2019-07-22 18:07:53 323 1

原创 Gradle Transform API :直接修改 class 文件

首先,我要说的是,我没想到写这篇文章会遇到那么多的难点。其次在写这篇文章的时候,我还是处于一个半吊子的状态,但是我想应该还是会比现有的大部分blog要好的多。我几乎将Google到的索引到的前几页文章全部看了一遍,但是大部分都是相同的内容,就只有一篇我印象比较深,写的比较全面,但是我仍然还有很多疑问。下面的文章我会提出我自己在学习这个知识点时想要问的问题,有些问题我可以自己解答,但是有些还是摸棱...

2019-07-22 16:00:42 1220

原创 Annotation Processor: 自定义注解处理器,不再写烦人的模板代码

注解处理在 Java 1.5 的时候就已经发布了,虽然它很老了,但是却是最强大的 API 之一。下面我们会先讨论注解处理,代码自动生成以及使用到这些技术的开源库。什么是注解实际上,我们应该都知道什么是注解。我们经常使用到的:@Override,@Singleton,@StringRes 等等,这些就是注解。注解是一种可以添加到Java源代码的语法元数据。 我们可以注释类,接口,方法,变量,参...

2019-07-16 22:55:43 1368

原创 DataBinding 原理分析

DataBinding 是一个支持库,它可以将布局中的界面组件绑定到数据源上,做到UI与数据的单项或者双向监听。说白一点就是数据发生变化可以直接反映到界面上,不用再次手动操作了。当然它的作用远远不止于此,本文从这个点入手,来略微深入一下它的实现过程。首先,DataBinding可以将数据的变化反应到UI上,实际上就是帮助我们更新UI,那么它肯定需要持有(直接或者间接)UI的引用,不然的话,是没法...

2019-07-12 15:18:17 2319

原创 Java final 关键字

final 关键字一般会多用于这样的几个地方:变量当final变量是基本数据类型以及String类型时,如果在编译期间能知道它的确切值,则编译器会把它当做编译期常量使用。防止被重写比如:java.lang.String 类内部类访问外部局部变量这个我们经常使用,而且IDE也会提示你。但是你有没有想过Java为什么要设计成这样,这其中的秘密何在?比如,我们有这样的代码: ...

2019-07-08 17:35:59 124

原创 Bitmap 完全掌握

记录一下以前看到过的知识点。Bitmap 像素数据的储存位置先看官方文档:在Android Android 2.2(API级别8)及更低版本上,当 GC 发生时,应用程序的线程会停止。这会导致延迟,从而降低性能。 Android 2.3添加了并发GC,这意味着在位图不再被引用后很快就会被回收。2.3之前的像素存储需要的内存是在native上分配的,并且生命周期不太可控,可能需要用户自...

2019-07-08 13:56:40 475

原创 Handler 完全攻略

https://juejin.im/post/5c87c0ad6fb9a049f571fe3fhttp://www.bubuko.com/infodetail-1822202.htmlThreadLocal 的工作原理文字版理解每个线程都有一个 ThreadLocalMap 类型的 threadLocals 属性。ThreadLocalMap 类相当于一个Map,key 是 Threa...

2019-07-05 15:34:45 197

原创 Broadcast 探究

最近终于把自己的状态调整过来了,看起书来也能有很多收获。嗯,今天在看《Android艺术开发探索》这本书的时候(这本书还真的不错,每次看都有新的发现),看到了四大组件的工作原理,关于 Broadcast,有这样的一个疑问:当App安装了没有运行的时候,如果App内部有静态注册的 Receiver,那么当一个满足 filter 条件的广播被发送的时候,是不是需要先启动这个 App,创建一个进程...

2019-07-03 18:12:07 375

原创 Navigation 的使用记录

接到一个处理流程的需求,有好几个界面,界面之间的跳转有点复杂,还需要支持回退,于是想到使用 Jetpack 的 Navigation 包。具体的使用可以参考官方文档 。暂时不做介绍,考虑做一个翻译系列,将 Jetpack 全部翻译一遍,不过现在没有精力。等使用 Navigation 写完全部的跳转之后,发现一个严重的问题,那么就是 Navigation 不支持 Fragment 的状态保存。也...

2019-06-26 16:24:26 287

原创 Window 与 View的动态更改思考

我们创建一个悬浮窗的时候,需要使用 WindowManager 来创建。WindowManager 是一个接口,它继承至 ViewManager,主要有3个方法供我们使用: public void addView(View view, ViewGroup.LayoutParams params); public void updateViewLayout(View view, V...

2019-06-24 20:17:33 149

原创 ViewModel 与 setRetainInstance

今天在做一个需求的时候,为了用户的体验,我想在进程被回收的时候保存一下数据,等 activity 重新创建的时候再取出来。我之前看过一些文章,关于 ViewModel 的,说是 ViewModel 在屏幕方向发生变化的时候不用重新储存数据(与版本有关系)。我也是看了相关代码,确实是这样。我们可以看看 ViewModel 是如何创建与保存的。当我们调用 ViewModelProviders.o...

2019-06-24 19:32:03 300

原创 插值器与估值器

先来了解以下动画的定义:动画是指由许多帧静止的画面,以一定的速度(如每秒16张)连续播放时,肉眼因视觉残象产生错觉,而误以为画面活动的作品。Android中的动画也遵循这个原理,只不过它的每一帧都是通过插值器与估值器动态计算出一个矩阵,然后应用到控件上得到的。在计算的过程中,插值器负责计算动画执行的百分比,估值器负责根据百分比来计算属性值。举个例子:ValueAnimator val...

2019-06-20 10:57:24 337

原创 Drawable 介绍

Drawable 的内部宽高比较重要,通过 getIntrinsicWidth 等可以获取。不是所有的 Drawble 都有内部宽高,对于图片形成的 drawble ,它的内部宽高就是图片的宽高,对于颜色形成的 drawable,它没有内部宽高。Drawble 没有大小的概念,都会拉伸到与 View 一样大。BitmapDrawable属性介绍:antialias: 抗锯齿,就是画线...

2019-06-19 15:36:15 474

原创 View 的工作原理

ViewRootImpl & DecorView当我们在 Activity 中调用 setContentView 方法的时候,实际上 Activity 是将这个方法转发给了 Window。android.app.Activity#setContentView(int) public void setContentView(@LayoutRes int layoutResID...

2019-06-18 18:56:04 157

原创 View 的事件分发

事件的传递流Activity -> Window -> ViewGroup - > ViewActivity.java public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { on...

2019-06-17 20:10:35 134

原创 View 的滑动处理(三)

ViewDragHelper 定义Android 官方对 ViewDragHelper 的定义是:可以用于自定义 ViewGroup可以进行拖拽移动或者重新定位ViewGroup中子视图View提供有效操作和状态追踪使用 ViewDragHelper下面说说,如何使用 ViewDragHelper(下面简称 VDH) 。创建一个 VDH 对象:androidx.customv...

2019-06-17 17:41:27 198

原创 View 的滑动处理(二)

CoordinatorLayout.BehaviorCoordinatorLayout 根据 官方文档 的描述,它是一个“超级FrameLayout“,专门用来帮助实现布局中的View相互交互。我们只需要为布局里面的 Views 创建自定义的或者分配现有的 Behavior 即可。Behavior 是 Material Design 独一无二的核心,例如滑动抽屉和面板,滑动消失元素,和跟随其他空...

2019-06-13 17:14:37 160

原创 View的滑动处理(一)

NestedScrollingNestedScrolling 是从Lollipop开始出现的,用来专门处理嵌套滑动的一套机制。NestedScrolling 仍然是基于View与ViewGroup的事件滑动机制,但是它将一个滑动事件的参与者分成了两个角色,child 与 parent。比如:ScrollView 中嵌套了 RecyclerView,ScrollView 在这里扮演 paren...

2019-06-06 17:54:45 358

原创 WorkManager 与 Low Memory Killer

今天在查看bugly的时候,发现了如下错误:android.app.RemoteServiceExceptionContext.startForegroundService() did not then call Service.startForeground()发现是由于WorkManager引起的,原因是由于我们刚刚引入了WorkManager,不想对原来的代码改动太大,所以只是将Al...

2019-05-31 16:27:51 490

原创 Intent 数据传输限制

当我们启动一个Activity的时候,这个过程是需要与AMS进行进程之间通信的。启动 Activity 的时候,需要使用Intent,所以我们在intent中携带的数据也要从APP进程传输到AMS进程,再由AMS进程传输到目标Activity所在进程。通过阅读 Activity 的启动过程,我们知道app与AMS 的进程通信是使用Binder来完成的,看一张图:普通的由Zygote孵化而来...

2019-05-30 17:46:20 318

原创 MultiDex

出现的原因单个Dex文件中,method个数采用使用原生类型short来索引,即2个字节最多65536个method,field、class的个数也均有此限制。对于Dex文件,则是将工程所需全部class文件合并且压缩到一个DEX文件期间,也就是使用Dex工具将class文件转化为Dex文件的过程中, 单个Dex文件可被引用的方法总数(自己开发的代码以及所引用的Android框架、类库的代码)...

2019-05-30 17:06:46 760

原创 Android 应用是如何编译与运行的

Android Studio 负责如何构建与部署我们的应用。但是你有没有想过当你按下Run按钮时发生了什么?构建Java compilation我们的代码是用Java编写的。但是,Java代码的编译和运行方式与Web应用程序相同吗?Android应用程序的编译过程与其他Java应用程序有很大不同。但是它们的开始过程都是一样的:使用javac命令将Java源代码文件编译为.class文件...

2019-05-30 16:59:19 1876

原创 图解 RecyclerView 的缓存机制

以后会尽量写非源码的东西,因为过一段时间之后,发现自己看自己的文章都费劲,而且,源码大部分是在分析方法的调用链,意义不大,需要多写写自己的体悟才行。如果有时候必须要写,也要简化调用链的分析,提供类图,写重点和结论。本文的思路与结论是基于参考文档的Anatomy of RecyclerView: a Search for a ViewHolder与 Anatomy of RecyclerVi...

2019-05-10 15:35:12 2035 5

原创 Java核心技术(基础知识)笔记

第一章 Java程序设计概述面向对象设计用木匠打个比方,一个“面向对象的”木匠始终关注的是所制作的椅子,第二位才是所使用的工具;一个“非面向对象”的木匠首先考虑的是所用的工具。即时编译解释虚拟机指令肯定会比全速运行机器指令慢很多。然而,虚拟机有一个选项,可以将执行最频繁的字节码序列翻译成机器码,这一过程被称为即时编译。字节码可以(在运行时刻)动态的翻译成对应运行这个应用的特定CPU机器码...

2019-05-07 20:32:23 421

原创 在 Activity 的 onDestroy 方法里面调用 finish 会发生什么

发现这个奇怪问题的起因在于同事看了MVVM的相关文章,里面提到屏幕旋转时,Activity 销毁重建不会导致 ViewModel随着销毁而重建。于是,就在项目中写了测试代码来验证。然后就发现了一个诡异的问题,**打开的界面旋转后自动关闭了!!**后来断点调试发现是因为 onDestroy 走了两次,分析逻辑之后,还原了执行流程,如下代码所示:Demo @Override pro...

2019-05-07 20:29:30 920

原创 RxJava2 源码分析(五)

目的分析Flowable的相关源码,了解一下背压的知识。从例子开始demo Flowable .create<Int>({ it.onNext(1) it.onNext(2) it.onComplete() ...

2019-04-26 17:07:13 157

原创 RxJava2 源码分析(四)

目的本文主要分析操作符的实现原理,关于操作符的使用不做讲解,想了解的可以参考Github上的例子项目以及官方文档。从一个例子开始这里我们以最常用的 map 为例。首先我们写一个demo:Demo这个demo演示了如何将一个int转成string。Kotlin 赛高!!!虽然看起来没有什么屌用,但是如果int值是一个图片的资源id,我们要将这个id转成一个Bitmap,那么也可以用ma...

2019-04-26 11:38:06 119

原创 RxJava2 源码分析(三)

目的本篇主要分析 RxJava2 中的线程池与线程调度时的源码流程。顺便介绍RxJava2中常用的几个线程池。上一篇文章,我们的demo中,指定线程时,使用的是 Schedulers 这个类。那我们直接从这个类入手。Schedulers.java/** * Static factory methods for returning standard Scheduler instanc...

2019-04-26 09:24:44 105

原创 RxJava2 源码分析(2.5)

目的分析 IoScheduler 类。首先要说明的是,RxJava2 中虽然使用到了 Java 的线程池,但是还有很多其他的东西,比如,接下来你就会看到 IoScheduler 中自己实现一个简单的线程池。从内部类开始IoSchedulerIoScheduler 源码不长,但是它有3个内部类,我们从内部类开始,因为每个内部类的功能都是比较单一的,分析起来很方便,知道了内部类的作用,外部类...

2019-04-26 09:22:28 147

原创 RxJava2 源码分析(二)

目的这篇文章的主要目的就是弄清楚链式调用与线程切换。如果你读懂了第一篇文章,这篇文章阅读起来还是非常简单的。因为链式调用和线程切换无非就是多了些 “数据源-观察者” 对。线程切换还涉及到线程池相关的东西,由于篇幅问题,线程池相关的东西会放到下一篇。从一个例子开始: // 观察者 -- 蝙蝠侠 val observerBatMan = object : Obs...

2019-04-26 09:13:28 175

原创 RxJava2 源码分析(一)

这是第二次写源码分析,之前的一次已经是一年前了。为何要重写?主要是由于今天看到了一些关于线程池的东西,我联想到了RxJava2中的线程分类。再想到项目中的线程池相关的地方,感觉很乱,所以有一个整合的想法,想将原来自己创建的线程池替换成RxJava2中的线程池,于是就有了翻看源码的心思。择日不如撞日,反正是看源码,顺便把以前的东西再整理一下,还有就是以前写的东西,思路太乱,看着不舒服。回想起...

2019-04-26 09:02:12 223

空空如也

空空如也

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

TA关注的人

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