自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

jeanboy

Android | iOS | Web 开发者,专注移动开发领域,热爱分享,热爱开源。

原创 图解 Android 系列(一)揭秘 Android 系统启动过程

当我们按下手机开机按键后,手机就会启动了。然后会看到 Logo,开机动画,最后会进入到手机桌面(Launcher),手机也就启动完成了。我一直搞不明白,这个过程到底做了什么?为什么按一个按键,手机就启动了呢?随着对 Android 的了解越来越多,直到阅读了源码,才逐渐解答了我的疑惑。如果你也有相同疑惑,请继续往下看,我将从源码的角度分析下 Android 系统启动的整个流程。计算机是如何启...

2019-03-27 13:20:35 715 1

原创 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制

Android-Binder进程间通讯机制概述最近在学习Binder机制,在网上查阅了大量的资料,也看了老罗的Binder系列的博客和Innost的深入理解Binder系列的博客,都是从底层开始讲的,全是C代码,虽然之前学过C和C++,然而各种函数之间花式跳转,看的我都怀疑人生。毫不夸张的讲每看一遍都是新的内容,跟没看过一样。后来又看到了Gityuan的博客看到了一些图解仿佛发现了新大...

2017-04-11 18:12:53 58547 50

原创 不得不学之代理模式

代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。简言之,代理模式就是设置一个中间代理来控制访问原目标对象,以达到增强原对象的功能和简化访问方式。代理模式 UML 类图静态代理由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。UserServicepublic interface Us

2020-05-28 09:11:35 452

原创 聊聊反射

反射 (Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。Oracle 官方对反射的解释是:Reflection enables Java code to discover information about the fields, methods and constructors of loaded classes, and to use reflected fields, methods, and constructor

2020-05-26 08:49:40 159

原创 性能优化系列(七)APK 体积优化
原力计划

文章首发「Android波斯湾」公众号,更新地址:https://github.com/jeanboydev/Android-ReadTheFuckingSourceCode减少应用程序安装包的大小,不仅仅减少了用户的网络数据流量还减少了下载等待的时间。毋庸置疑,尽量减少程序安装包的大小是十分有必要的。通常来说,减少程序安装包的大小有两条规律:要么减少程序资源的大小,要么就是减少程序的代码...

2020-03-04 15:48:39 1587

原创 性能优化系列(六)启动性能优化

文章首发「Android波斯湾」公众号,更新地址:https://github.com/jeanboydev/Android-ReadTheFuckingSourceCode提高程序的启动速度意义重大,很显然,启动时间越短,用户才越有耐心等待打开这个 App 进行使用,反之启动时间越长,用户则越有可能来不及等到 App 打开就已经切换到其他 App 了。程序启动过程中的那些复杂错误的操作很...

2020-03-03 09:40:12 465

原创 性能优化系列(五)网络性能优化

移动互联网时代,用户对网络越来越依赖。虽然网络环境在逐渐变好,但也对网络的应用提出了更高的要求,同时开发人员对网络的重视度却在下降。确实 WiFi 场景下用户的网络质量变好了,而且用户对网络流量消耗的敏感度也在下降。由于对网络问题的忽视,在网络情况不好的情况下,用户体验会极度下降,这时网络性能优化变得尤为重要。作为一名移动开发者,面对复杂多变的移动网络我们该如何去优化呢?优化哪些方面?一个数...

2020-03-02 09:45:54 858

原创 性能优化系列(四)电量性能优化

耗电设备手机各个硬件模块的耗电量是不一样的,有些模块非常耗电,而有些模块则相对显得耗电量小很多。电量消耗的计算与统计是一件麻烦而且矛盾的事情,记录电量消耗本身也是一个费电量的事情。唯一可行的方案是使用第三方监测电量的设备,这样才能够获取到真实的电量消耗。屏幕当设备处于待机状态时消耗的电量是极少的,以 Nexus 5 为例,打开飞行模式,可以待机接近 1 个月。可是点亮屏幕,味着系统的各组件...

2020-02-28 11:31:00 285

原创 性能优化系列(三)内存性能优化

Android 为每个应用分配内存时,采用弹性的分配方式,即刚开始并不会给应用分配很多的内存,而是给每一个进程分配一个「够用」的内存大小,这个大小值是根据每一个设备的实际的物理内存大小来决定的。随着应用的运行和使用,Android 会为应用分配一些额外的内存大小。但是分配的大小是有限度的,系统不可能为每一个应用分配无限大小的内存。总之,Android 系统需要最大限度的让更多的进程存活在内存中...

2019-12-28 10:26:33 414

原创 性能优化系列(二)告别卡顿与 ANR —— 计算性能优化

上一篇文章 渲染性能优化 中,我们分析了 UI 可能引起卡顿原因。卡顿的因素有很多,UI 只是其中一个因素。应用是否流畅往往也与 CPU 的计算性能有关,接下来我们从代码上来分析下引起性能问题的因素。ArrayMap 与 HashMapArrayMap 是 Android 提供的工具类,在 android.util.ArrayMap 中,ArrayMap 的使用方式与 HashMap 几乎没有...

2019-12-05 22:39:35 662

原创 性能优化系列(一)找出卡顿的元凶 —— 渲染性能优化

一个 Android 应用是否流畅,或者说是否存在卡顿、丢帧现象,都与 60fps 和 16ms 有关。那么这两个值是怎么来的呢?为什么以这两个值为衡量标准呢?本文主要讨论下渲染性能方面决定 Android 应用流畅性的因素。为什么是 60fps?12fps(帧/秒)由于人类眼睛的特殊生理结构,如果所看画面之帧率高于每秒约 10 - 12fps 的时候,就会认为是连贯的。 早期的无声电影...

2019-11-19 08:05:17 761

原创 2019寒冬,被裁后一周 10 家面试经历

2019 年对我来说是最幸运的一年,很多小伙伴已经知道了,我多了一个「小情人」。然而,刚忙完回到公司的第二周,我接到了最残酷的通知,公司经济状况不佳 —— 裁员!虽然可以选择降薪留下来,但是社保公积金最低,还需要996,无奈只好选告别了待了三年之久的 xxx,没有 n+1,没有 xxx,mmp。由于离职时间点比较尴尬,马上就是中秋节,刚好可以放松下回家陪陪家人。中秋过后,尝试投了几份简历,但...

2019-11-13 23:08:35 1721 5

原创 字节码指令

虚拟机是一个相对于物理机的概念,这两种机器都有代码执行能力,其区别在于物理机的执行引擎是直接建立在 CPU 处理器、指令集、操作系统和硬件层面上的。而虚拟机的执行引擎则由自己实现,因此可以制定自己的指令集和执行引擎的结构体系,而且还可以执行一些不被硬件直接支持的指令集格式。这就是虚拟机相对于物理机的优势所在。但是缺点也比较明显,由于多了一层虚拟指令,执行虚拟机指令后还要转化为本地机器码,所以在...

2019-10-20 11:07:18 160

原创 字节码文件结构

我们都知道 .java 文件在执行之前会编译成 .class 文件后再执行。比如下面的代码:package com.jeanboy.jvm;public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); }}在 ...

2019-09-03 07:23:40 513 2

原创 TreeMap 源码分析(下)

引言通过上一篇TreeMap 源码分析(上)的分析,我们已经了解了红黑树插入数据的操作,本文我们继续来分析红黑树删除数据的操作。红黑树的删除将红黑树内的某一个节点删除。需要执行的操作依次是:首先,将红黑树当作一颗二叉查找树,将该节点从二叉查找树中删除;然后,通过「旋转和重新着色」等一系列来修正该树,使之重新成为一棵红黑树。详细描述如下:第一步:删除节点将红黑树当作一颗二叉查找树,将节点删...

2019-08-17 15:43:25 174

原创 TreeMap 源码分析(上)

简介TreeMap 最早出现在 JDK 1.2 中,是 Java 集合框架中比较重要一个的实现。TreeMap 底层基于 红黑树 实现,可保证在 log(n) 时间复杂度内完成 containsKey、get、put 和 remove 操作,效率很高。另一方面,由于 TreeMap 基于红黑树实现,这为 TreeMap 保持键的有序性打下了基础。总的来说,TreeMap 的核心是红黑树,其很多...

2019-08-07 08:39:09 315

原创 Android 签名机制 v1、v2、v3

什么是签名?要想知道签名是什么,先来看为什么需要签名 ?了解 HTTPS 通信的同学应该知道,在消息通信时,必须至少解决两个问题:一是确保消息来源的真实性,二是确保消息不会被第三方篡改。在安装 APK 时,同样需要确保 APK 来源的真实性,以及 APK 没有被第三方篡改。如何解决这两个问题呢?方法就是开发者对 APK 进行签名:在 APK 中写入一个「指纹」。指纹写入以后,APK 中有任...

2019-07-31 08:48:57 1341 1

原创 聊聊 Activity 栈的亲和关系

launchMode<activity android:name=".ui.activity.TaskAffinityActivity" android:launchMode="singleTask" />standardsingleTopsingleTasksingleInstance默认模式是 standard,这些模式分为两大类,standard 和 s...

2019-07-11 08:51:22 639

原创 很少有人知道的 ContentProvider 使用技巧

简介ContentProvider 是 Android 的四大组件之一,可见它在 Android 中的作用非同小可。它主要的作用是实现各个应用程序之间的(跨应用)数据共享,比如联系人应用中就使用了ContentProvider,你可以在自己的应用中可以读取和修改联系人的数据,不过需要获得相应的权限。ContentProvider 可以理解为一个 Android 应用对外开放的接口,只要是符合...

2019-07-04 10:21:38 246

原创 图解 Android 系列(四)原来 SystemServer 启动时干了这么多

介绍这是一个连载的系列「图解 Android 系列」,我将持续为大家提供尽可能通俗易懂的 Android 源码分析。所有引用的源码片段,我都会在第一行标明源文件完整路径。为了文章篇幅考虑源码中间可能有删减,删减部分会用省略号代替。本系列源码基于:Android Oreo(8.0)SystemServer.main()在上篇 探索 SystemServer 进程创建过程 中介绍了 S...

2019-07-02 08:40:28 682

原创 LinkedList 源码分析

简介LinkedList 是 Java 集合框架中一个常用的集合类,底层采用双向链表结构。和 ArrayList 一样,LinkedList 也支持空值和重复值。由于 LinkedList 基于链表实现,存储元素过程中,无需像 ArrayList 那样进行扩容。但有得必有失,LinkedList 存储元素的节点需要额外的空间存储前驱和后继的引用。另一方面,LinkedList 在链表头部和尾部...

2019-06-25 14:04:31 746

原创 屏幕适配最佳实践

基本概念屏幕尺寸手机屏幕对角线的物理尺寸。单位英寸(inch),一英寸大约 2.54cm。常见的手机屏幕尺寸有 4.7 英寸、5.0英寸、5.5 英寸、6.0 英寸等。像素(px)像素(英语:Picture Element),Pixel 的缩写。液晶屏显示图像,放大来看是一个个小点组成的,这些小点就是像素点。分辨率分辨率(英语:Image resolution),又称解析度、解像...

2019-06-11 15:10:43 301

原创 图解 Android 系列(三)探索 SystemServer 进程创建过程

介绍这是一个连载的系列「图解 Android 系列」,我将持续为大家提供尽可能通俗易懂的 Android 源码分析。所有引用的源码片段,我都会在第一行标明源文件完整路径。为了文章篇幅考虑源码中间可能有删减,删减部分会用省略号代替。本系列源码基于:Android Oreo(8.0)SystemServer 进程SystemServer 进程是由 zygote 进程 fork 出来的,进...

2019-05-29 20:21:29 302

原创 最通俗易懂的 Handler 源码解析

简介在 Android 中 UI 线程是不安全的,如果在子线程中尝试进行更新 UI 操作,程序就有可能会崩溃;当然如果在 UI 线程中做耗时的操作,系统就会弹出 ANR 弹窗提示该程序无响应,十分影响用户体验。Android 系统中提供了 Handler,这样我们就可以使用 Handler 在子线程中发送消息来更新 UI;也可以将耗时操作交给子线程处理,等子线程处理完后再使用 Handler ...

2019-05-22 16:30:04 223

原创 【生活常识】如何能安逸的活着?

经常看到朋友圈转发各种 xx 筹,点开的内容基本一致,得了 xx 病急需 xx 万元医疗费,希望大家能献献爱心等等。最开始看到这些我都会伸出援助之手,但后来发现越来越多。直到看到了一篇报道说,一位年入百万的老板发起了几十万的 xx 筹,本来医疗费只需要几万元最后还赚了几十万。看过这篇报道后再看到 xx 筹的转发都有一种莫名的抵触,渐渐的感觉这就是一种道德绑架,难道那些不捐助的人都没有爱心吗?...

2019-05-20 13:34:48 1271

原创 分享一些 Broadcast 使用技巧

简介Broadcast(广播) 是 Android 的四大组件之一,用于进程/线程间通信。广播最大的特点就是发送方并不关心接收方是否接到数据,也不关心接收方是如何处理数据的,它只负责「说」而不管你「听不听」。广播可以来之系统,例如,Android 系统在发生各种系统事件时发送广播(系统启动或者设备开始充电时)。也可以来自于其他应用程序,例如,应用程序也可以发送自定义广播,来通知其他应用程序...

2019-05-08 20:33:14 635 1

原创 图解 Android 系列(二)深入理解 init 与 zygote 进程

介绍这是一个连载的系列「图解 Android 系列」,我将持续为大家提供尽可能通俗易懂的 Android 源码分析。所有引用的源码片段,我都会在第一行标明源文件完整路径。为了文章篇幅考虑源码中间可能有删减,删减部分会用省略号代替。本系列源码基于:Android Oreo(8.0)init 进程在上篇文章 揭秘 Android 系统启动过程 中介绍到,init 进程启动分为前后两部分,...

2019-04-18 17:50:41 530 1

原创 如何正确的使用 Service?

简介Service(服务)是 Android 四大组件之一,它的主要作用是执行后台操作,Activity 提供了 UI 界面来跟用户交互,而 Service 则没有 UI 界面,所有的操作都是在后台完成。Service 跟 Activity 一样也可以由其它应用程序启动,即使用户切换到了其它应用,Service 仍然保持在后台运行。此外,一个组件可以与 Service 进行绑定(bind)来...

2019-04-04 17:59:29 364

原创 Fragment 相关知识点都在这里了

简介Fragment (简称碎片)是 Android 3.0(API 11)提出的。为了兼容低版本 support-v4 库中也开发了一套Fragment API 最低兼容到 Android 1.6 的版本。过去 support-v4 库是一个 jar 包,从 24.2.0 版本开始,将 support-v4 库模块化为多个 jar 包。包含 support-fragment、 support...

2019-04-03 13:47:07 236

原创 重新认识 Activity 解答你的全部疑惑

什么是 Activity?Activity 是 Android 的四大组件之一,是用户操作的可视化界面,它为用户提供了一个完成操作指令的窗口。当我们创建完 Activity 之后,需要调用 setContentView(view) 方法来完成界面的显示,以此来为用户提供交互的入口。在 Android App 中只要能看见的几乎都要依托于 Activity,所以 Activity 是在开发中使用...

2019-03-22 15:36:27 618

原创 原来 ArrayList 内部原理这么简单

简介ArrayList 是一种变长的基于数组实现的集合类,ArrayList 允许空值和重复元素,当往 ArrayList 中添加的元素数量大于其底层数组容量时,它会自动扩容至一个更大的数组。另外,由于 ArrayList 底层基于数组实现,所以其可以保证在 O(1) 复杂度下完成随机查找操作。其他方面,ArrayList 是非线程安全类,并发环境下,多个线程同时操作 ArrayList,会引...

2019-03-13 19:34:08 1149 1

原创 Android 年薪百万的进阶攻略 —— 资深(专家)工程师学习路线

思维导图系统启动过程这一部分是 Android 系统从按下电源键开始,然后到展示开机界面,再到展示桌面之前的一个过程。了解下面相关进程的工作流程,会对 Android 系统有一个整体的概念,是一个从 0 到 1 的过程,对深入研究 Android 系统内部机制有很大帮助。init 进程了解 init 进程创建与启动的流程。Zygote 进程了解 Zygote 进程创建的流程,...

2019-03-05 13:47:58 2132

原创 Android 高级进阶攻略,轻松拿 Offer —— 高级工程师学习路线

思维导图相关原理常见 IPC 方式Binder 机制AIDL 的使用Handler 机制ThreadLocal 原理AsyncTask 原理ListView 工作原理阅读源码熟悉常见优化RecyclerView 工作原理阅读源码自定义 LayoutManagerAnimation 工作原理Activity 难点setResult() 和 fini...

2019-02-26 14:26:03 2538 7

原创 Android 轻松入门学习攻略 —— 初中级工程师学习路线

Android 入门学习指南思维导图基础知识四大组件Activity掌握生命周期、IntentFilter、启动模式、页面状态保存与恢复。Fragment掌握生命周期、与 Activity 通信的方式。Service掌握生命周期、与 Activity 通信、IntentService、ForegroundService。Broadcast掌握静态广播、动态广...

2019-02-21 17:26:57 581

原创 金三银四跳槽季,拿上攻略有底气!【持续更新...】

马上又到了金三银四了,整理了一些面试题分,希望对大家有所帮助 ~虽然我不推荐大家刷题,这里仅供大家差缺补漏。所有的知识点还是重在自己理解,用自己的方式表达出来比较好。Java 知识基础什么是面向对象(OOP)?什么是多态?实现多态的机制是什么?接口(Interface)与抽象类(Abstract Class)的区别?重写(Override)与重载(Overload)的区别?父...

2019-02-15 11:57:36 7139 25

原创 一篇文章看明白 HashMap 工作原理

HashMap 源码分析简介HashMap 是 Java 语言中常用的用于存放键值对数据类型的集合类。随着 JDK(Java Developmet Kit)版本的更新,JDK 1.8 对 HashMap 底层的实现进行了优化,底层实现也由之前的 数组 + 链表 改为 数组 + 链表 + 红黑树 。HashMap 的常用方法如下://创建一个 mapMap<String, String...

2019-01-14 10:46:51 1719 1

原创 一篇文章看明白 Android v1 & v2 签名机制

Android - v1 & v2 签名机制一、什么是签名?要想知道签名是什么,先来看为什么需要签名 ?了解 HTTPS 通信的同学应该知道,在消息通信时,必须至少解决两个问题:一是确保消息来源的真实性,二是确保消息不会被第三方篡改。在安装 APK 时,同样需要确保 APK 来源的真实性,以及 APK 没有被第三方篡改。如何解决这两个问题呢?方法就是开发者对 APK 进行签名:在 A...

2018-12-06 11:24:35 9863 12

原创 小程序 与 App 与 H5 之间的区别

小程序的实现原理根据微信官方的说明,微信小程序的运行环境有 3 个平台,iOS 的 WebKit(苹果开源的浏览器内核),Android 的 X5 (QQ 浏览器内核),开发时用的 nw.js(C++ 实现的 web 转桌面应用)。平台渲染js 运行环境iOSWKWebViewJavaScriptCoreAndroidX5 基于 Mobile Chrome ...

2018-11-21 11:35:18 27507 5

原创 一篇文章看明白 Android PackageManagerService 工作流程

Android - PackageMangerService 分析概述PackageManagerService(简称 PKMS),是 Android 系统中核心服务之一,管理着所有跟 package 相关的工作,常见的比如安装、卸载应用。PackageManagerService 是在 SystemServer 进程中启动的。如不了解 Android 是如何从开机到 Launcher 启...

2018-09-19 17:03:01 12456 4

原创 Gradle - 插件发布

插件发布注册 bintray 账户bintray 官网首先注册选择右边开源账户注册,这个是免费的;右边只是免费试用30天。推荐使用关联 github 账号的方式注册。创建你的 Maven 仓库,如果没有创建这个库,后面上传会出现不存在 maven 路径的错误。引入 bintray release在项目根目录的 build.gradle 配置:...

2018-08-06 10:15:59 1091

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