自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

哈利迪

公众号 @ 哈利迪ei

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

原创 Android | 《看完不忘系列》之Glide

《看完不忘系列》将以从树干到细枝的思路来分析一些技术框架,本文是开篇文章,将对开源项目Glide图片加载库进行介绍。如果老铁们看完还是忘了,就 回来揍我一顿 点赞收藏加关注,多看两遍~概览基于Glide最新版本4.11.0,未迁AndroidX的项目只能使用4.9.0,简单使用:引入依赖,app/build.gradle:implementation 'com.github.bumptech.glide:glide:4.11.0'annotationProcessor 'com.github.b

2020-07-15 20:31:57 161

原创 Android | 资源冲突覆盖的一些思考

啥是资源冲突覆盖,就是两个不同的文件,有着相同的文件名,在打包apk后引起的系列问题。本文将从情景、解决思路、延伸,三个方面展开。先简单介绍下背景,App在线上跑了将近7年(历史悠久~),从早期的导购社区,到社区电商,再到社区、电商和直播三驾马车齐驱,也就是三大业务团队。情景UI不合预期问题首先,我们建一个壳工程app,建两个业务工程,分别是电商业务biz_shopping和直播业务biz_live,如下,接着在电商工程建一个页面layout/activity_shopping.xml,&l

2020-07-01 22:16:48 1216 1

原创 江湖事儿 | 技术人如何做好晋升准备

又到一年晋升季,哈迪想跟大伙唠唠技术人晋升的一些事儿。对于技术人来说,相信大多都有一些共同的特点就是比较专注于技术本身,来为业务赋能,而缺少了沟通和表达等软实力的培养,没错哈迪就是,本文就是把哈迪在准备过程中的一些心得和收获分享出来,希望对大家有帮助。关于职级很多公司都有自己的职级体系,如阿里的P系,百度的T系等。即便最简单的职级划分,也有初、中、高级工程师之分。因为一家公司的每个岗位,都有着不同职级的用工需求,比如奋斗在业务前线的工程师、持续优化技术体系的架构师等等;同时,人都有需求层次的升级,晋升能

2020-06-06 07:09:49 319

原创 图解 | 不得错过的Binder浅析(二)

本文主要分析ServiceManager系统服务管理进程对binder的管理流程。大纲:揭开Binder面纱Binder的管理1 打开binder驱动2 成为系统唯一的上下文3 进入binder循环4 系统服务的注册和获取总结参考资料本文约3.7k字,阅读大约15分钟。Android源码基于8.0。揭开Binder面纱Binder跟键盘、显示器一样属于一种外设(没有实体的外设)。由于外设种类繁多,操作系统如Linux抽象出文件视图来方便用户使用外设。即对用户来说,通过

2020-11-24 19:36:15 411 1

原创 图解 | 不得错过的Binder浅析(一)

Framework和Binder的内容挺深的,本文还是站在应用层开发者的角度来建立基本认知,能在遇到问题的时候有思路和方向即可。(本文将带着关键问题和核心流程展开,不会面面俱到)大纲:背景为什么要多进程为什么要BinderBinder简单架构简单示例源码分析客户端与驱动交互服务端与驱动交互总结细节补充Binder为什么高效Binder为什么不用shm提问参考资料本文约4.0k字,阅读大约17分钟。Android源码基于8.0。背景为什么要多进程

2020-11-02 13:34:18 501

原创 图解 | 一图摸清Android应用进程的启动

一图摸清Android应用进程的启动~大纲:简要回顾AMS发送socket请求Zygote处理socket请求启动binder线程池总结细节补充参考资料本文约2.5k字,阅读大约11分钟。Android源码基于8.0。简要回顾先回顾一下Android系统的启动过程:init进程fork出Zygote进程后,Zygote进程会创建一个服务端socket,等待AMS发起socket请求。同时,由Zygote进程fork出的SystemServer进程会启动各项系统服务,其中就

2020-10-25 11:37:58 387

原创 图解 | 一图摸清Android系统服务

一图摸清Android系统服务的获取和注册流程~大纲:获取系统服务注册系统服务独立进程的服务非独立进程的服务总结参考资料本文约1.9k字,阅读大约8分钟。Android源码基于8.0。先预览下整体流程~开始分析!获取系统服务在日常开发中,可以通过Context.getSystemService()在自己的应用程序里获取到系统服务://ContextImpl.javapublic Object getSystemService(String name) {

2020-10-20 19:54:54 123

原创 图解 | Android系统的启动

5张图搞懂Android系统启动的核心流程~大纲:Zygote启动SystemServer启动Launcher启动总结细节补充参考资料本文约1.9k字,阅读大约8分钟。Android源码基于8.0。init进程是Linux内核启动完成后在用户空间启动的第一个进程,主要负责初始化工作、启动属性服务、解析init.rc文件并启动Zygote进程。Zygote进程是一个进程孵化器,负责创建虚拟机实例、应用程序进程、系统服务进程SystemServer。他通过fork(复制进程)的方式

2020-10-18 11:47:38 167

原创 踩坑记 | 多aar下修改常量的一个小坑

嗨,我是哈利迪好久不见,最近大促比较忙,人也变懒了没啥时间写文章肝源码…本文做个小记,记录一个多aar下修改常量引起的问题,希望能给大家避避坑本文约0.9k字,阅读大约3分钟。问题简述App结构大致如下,各工程以aar形式进行依赖,壳工程以打平的形式依赖所有业务工程和基础工程的aar,避开依赖传递的问题,还可以加快开发过程的构建速度,因业务需要,哈迪把基础工程1的1.0版本的一个常量TYPE_RECOMMEND_TAB从106改成了306,public class DATA_TYPE {

2020-09-18 21:47:20 138

原创 Android | dagger细枝篇

嗨,我是哈利迪~《看完不忘系列》之dagger(树干篇)一文对dagger做了初步介绍,下面我们一起来瞅瞅dagger的一些细节。本文约3.5k字,阅读大约9分钟。Dagger源码基于最新版本2.28.3目录:@Binds和@Provides区别Binds和Provides都是搭配Module(模块,用于支持模块化)使用的,Binds表示抽象和具体的绑定,作用在抽象方法上,如下,@Moduleabstract class GasEngineModule {//汽油引擎模块 @Bi

2020-08-30 15:31:33 227

原创 Android |《看完不忘系列》之dagger

嗨,我是哈利迪~《看完不忘系列》将以从树干到细枝的思路分析一些技术框架,本文将对开源项目dagger进行介绍。本文约3800字,阅读大约10分钟。Dagger源码基于最新版本2.28.3背景依赖注入(Dependency Injection,DI)遵循控制反转(Inversion of Control,IoC)原则,简单来说就是创建对象时给对象传入依赖,通过传入不同实例来实现不同行为(控制),比如常见的构造方法和setter都叫注入。简单概括一下谷歌的造车栗子,一、不注入,由Car类自己创

2020-08-27 23:16:11 438

原创 Android |《看完不忘系列》之Retrofit

嗨,我是哈利迪~《看完不忘系列》将以从树干到细枝的思路分析一些技术框架,本文将对开源项目Retrofit进行介绍。本文约2800字,阅读大约8分钟。Retrofit源码基于最新版本2.9.0预备Retrofit使得网络调用可以像RESTful设计风格一样简洁,如:interface WanApi { //用注解标记网络请求方式get、post,参数path、query等 @GET("article/list/{page}/json") Call<WanArticl

2020-08-19 18:36:29 244

原创 Android | okhttp细枝篇

嗨,我是哈利迪~《看完不忘系列》之okhttp(树干篇)一文对okhttp的请求流程做了初步介绍,本文将对他的一些实现细节和相关网络知识进行补充。本文约2000字,阅读大约5分钟。源码基于3.14.9,即java版本的最新版推荐阅读「查缺补漏」巩固你的HTTP知识体系,常用的概念都在了,由于目前用的比较多的还是http 1.1,所以下面分析会跳过http2,以http 1.1为主。cache强缓存:Cache-Control(maxAge过期时长)、Expires(过期时间);协商缓存:e

2020-08-12 23:36:19 133

原创 踩坑记 | Flutter升级影响了NestedScrollView?

嗨,我是哈利迪~最近有个bug排查了好几天,就是有个老页面因业务复杂度,使用了NestedScrollView+tab+多Fragment的结构(各Fragment里有RecyclerView,即存在嵌套滑动),在新的班车中,出现了偶现的滑不动问题。在业务相关组件里排查了很久都没思路,哈迪便开始了万能的组件排除法,即在几十个变更组件里用二分法分批排查(没错就是这么骚),最后定位到一个Flutter组件,只要把它回退就没问题了。。不对啊,我这个页面是原生的啊,井水不犯河水的Flutter,还能影响到我的页

2020-08-07 20:31:48 299

原创 Android |《看完不忘系列》之okhttp

嗨,我是哈利迪~《看完不忘系列》将以从树干到细枝的思路分析一些技术框架,本文将对开源项目okhttp网络库进行介绍。本文约3800字,阅读大约10分钟。如个别大图模糊,可前往个人站点阅读。概览源码基于3.14.9,即java版本的最新版首先上职责图,各个类的名字基本可以见名知意了,就不翻译了,直接起飞~树干我们先看一趟飞行的大体流程,好了,进入代码环节,引入依赖,implementation 'com.squareup.okhttp3:okhttp:3.14.9'简单使用(只

2020-08-02 22:58:29 282

原创 Android | xml和view的那些事

嗨,我是写博客满脑子骚东西的哈利迪~今天和大伙聊聊Android中的xml和view的那些事,首先会分析一下xml布局解析inflate的流程,然后会介绍一些业内的方案,如:提效篇:JakeWharton:著名的Butterknife、Android自带:双向绑定的DataBinding、省去findViewById的ViewBinding和kotlin扩展、性能优化篇:掌阅:将xml转view的流程提前到编译期的x2c、鸿洋大佬最近研究的:自定义Factory来创建view的思路View

2020-07-26 14:44:28 545

原创 Android | Glide细枝篇

《看完不忘系列》之Glide (树干篇)一文对Glide加载图片的核心流程做了介绍,细枝篇作为补充,将对一些具体实现细节进行深入。本文篇幅略大,大家可以根据目录索引到感兴趣的章节阅读~源码基于最新版本4.11.0,先上一张职责图预览下,一家人就要整整齐齐~本文约3200字,阅读大约10分钟。如个别大图模糊(官方会压缩),可前往个人站点阅读Generated API通过创建一些类,继承相关接口,然后打上注解,由apt来处理这些类,从而实现接口扩展。全局配置注解@GlideModule用来配置

2020-07-18 15:47:19 192

原创 Android | Tangram动态页面之路(七)硬核的Virtualview

何为Virtualview,简单来说,就是通过xml来描述视图,然后压缩成二进制格式,客户端通过解析并渲染成原生view或交由Canvas绘制的过程。系列文章:需求背景Tangram和vlayout介绍Tangram的使用vlayout原理Tangram原理json模板和数据分离GitHub地址:GitHub - Virtualview-AndroidGitHub - virtualview_tools本文基于最新源码分析。VirtualView需求背景一文介绍了模块化搭建

2020-05-22 19:44:02 434

原创 Android | Tangram动态页面之路(六)数据分离

经过前五篇系列文章,对Tangram和vlayout也有了初步认识,这篇文章开始将结合业务场景使用,探索框架能力能对业务带来的支持,因为调研本身是一个需要不断踩坑的过程,所以大纲也做了微调,后续会根据实际使用过程发现的问题和解决方案进行更新。需求背景Tangram和vlayout介绍Tangram的使用vlayout原理Tangram原理json模板和数据分离待定本文将对Tangram的json模板和数据进行分离。笔者Demo代码,内容见demo2包。数据分离前面的文章提到过,在实

2020-05-22 19:42:37 259

原创 Android | Tangram动态页面之路(五)Tangram原理

本系列文章主要介绍天猫团队开源的Tangram框架的使用心得和原理,由于Tangram底层基于vlayout,所以也会简单讲解,该系列将按以下大纲进行介绍:需求背景Tangram和vlayout介绍Tangram的使用vlayout原理Tangram原理Tangram二次封装本文将对Tangram进行初步讲解。基于Tangram最新源码分析笔者Demo代码Tangram在Tangram和vlayout介绍这篇文章提到过,Tangram通过解析json模板得到

2020-05-22 19:40:59 459

原创 Android | Tangram动态页面之路(四)vlayout原理

本系列文章主要介绍天猫团队开源的Tangram框架的使用心得和原理,由于Tangram底层基于vlayout,所以也会简单讲解,该系列将按以下大纲进行介绍:需求背景Tangram和vlayout介绍Tangram的使用vlayout原理Tangram原理Tangram二次封装本文将对Tangram的底层实现vlayout进行讲解。基于vlayout最新源码vlayout在Tangram和vlayout介绍这篇文章提到过,vlayout自定义了一个Virtu

2020-05-15 20:54:31 303

原创 Android | Tangram动态页面之路(三)使用

本系列文章主要介绍天猫团队开源的Tangram框架的使用心得和原理,由于Tangram底层基于vlayout,所以也会简单讲解,该系列将按以下大纲进行介绍:需求背景Tangram和vlayout介绍Tangram的使用vlayout原理Tangram原理Tangram二次封装本文将对Tangram的简单使用进行介绍。Demo代码基础使用引入依赖: //tangram相关:tangram使用3.0之前的最新版本,其他直接使用最新版本 implem

2020-05-15 20:53:31 494 1

原创 Android | Tangram动态页面之路(二)介绍

本系列文章主要介绍天猫团队开源的Tangram框架的使用心得和原理,由于Tangram底层基于vlayout,所以也会简单讲解,该系列将按以下大纲进行介绍:需求背景Tangram和vlayout介绍Tangram的使用vlayout原理Tangram原理Tangram二次封装本文主要对Tangram和vlayout的一些概念进行介绍。vlayout因为Tangram底层基于vlayout,所以需要先了解下vlayout。首先,在view上的性能消耗通常有以下几

2020-05-15 20:51:05 734

原创 Android | Tangram动态页面之路(一)需求背景

本系列文章主要介绍天猫团队开源的Tangram框架的使用心得和原理,由于Tangram底层基于vlayout,所以也会简单讲解,该系列将按以下大纲进行介绍:需求背景页面模板的多维度定投(分时、分人群等)、数据资源位聚合、RecyclerView的异构和扁平。Tangram和vlayout介绍Tangram的使用vlayout原理Tangram原理Tangram二次封装本文先主要介绍下需求背景。需求背景首先,笔者在工作中(生产环境)使用的并非Tangram,而

2020-05-15 20:49:55 251

原创 Android-Jetpack笔记-WorkManager

WorkManager能帮我们更好的管理后台任务,可以更好地管理执行时机、执行顺序和执行状态(有无网络、是否在充电)。他会根据系统版本选择合适的方案执行任务,比如在API 23及以上使用JobScheduler,以下则使用BroadcastReceiver和AlarmManager,能兼容到API 14。同时,他会将任务存储进数据库来保证关机重启后任务仍可执行(这点有待验证,因为国内机型太多了)。Jetpack笔记代码本文源码基于SDK 29使用引入依赖:def work_versions = "

2020-05-15 20:46:54 356

原创 Android-Jetpack笔记-Paging结合网络数据

上篇文章介绍了paging+room的使用,这篇主要介绍paging+网络数据的使用和原理。Jetpack笔记代码本文源码基于SDK 29使用网络数据来源于玩Android开放API,运行效果:引入依赖:def paging_version = "2.1.1"implementation "androidx.paging:paging-runtime:$paging_version"创建一个ViewModel,//PagingNetworkViewModel2.javaLiveDat

2020-05-09 19:42:42 646 2

原创 Android-Jetpack笔记-Paging结合数据库

在平时使用RecyclerView时,下拉刷新时先更新数据然后调用Adapter.notifyDataSetChanged全量更新,修改条目时则先更新数据,然后调用Adapter.notifyItemXXX进行局部更新。Paging出现后,则只需要对数据进行变更,无需手动刷新UI,其内部会对数据源进行diff操作(基于Myers 差分算法),然后选择合适的方式刷新UI,同时他还处理了数据的分页加载...

2020-05-07 22:13:36 279

原创 Android-Jetpack笔记-Room

Room是一种ORM(对象关系映射)框架,可以用OOP(面向对象)的思路开发数据库,有点像早期的greenDAO,不过Room作为Jetpack的一员,能够返回更多类型的数据,比如能直接返回DataSource.Factory来友好的支持Paging的使用,本文主要总结基础的使用和原理。Jetpack笔记代码本文源码基于SDK 29使用引入依赖:def room_version = "2...

2020-05-05 12:03:17 201

原创 Android-Jetpack笔记-Navigation之Fragment支持复用

上篇文章Android-Jetpack笔记-Navigation之Fragment使用提到,每次切换目的地,fragment是反复销毁重建的,按照谷歌推荐的1个APP只需1个activity的思路开发,这样是没问题的,但是这里的fragment是作为首页的3个常驻页面,我们是希望能够保存起来的,毕竟,销毁重建需要重新请求网络数据,重新初始化view,严重影响用户体验,那么接下来继续上篇文章的分析,...

2020-05-04 21:44:43 2672

原创 Android-Jetpack笔记-Navigation之Fragment使用

Navigation是一种导航的概念,即把Activity和fragment当成一个个的目的地Destination,各目的地形成一张导航图NavGraph,由导航控制器NavController来统一调度跳转,本文会先简单分析下AS自带的示例代码。Jetpack笔记代码本文源码基于SDK 29,IDE是Android studio 3.5.3使用创建工程,引入依赖,implementa...

2020-05-04 19:00:36 1353 1

原创 Android-Jetpack笔记-ViewModelSavedState

上篇文章提到,虽然viewModel要比onSaveInstanceState简单,但是viewModel只能在屏幕旋转和语言切换后(即配置变更时)的页面重建维持数据,当页面意外销毁时数据无法恢复(viewModel也会重建),而这点onSaveInstanceState可以做到。关于意外销毁,我们暂且理解成非配置变更引起的销毁重建,比如内存不足等场景。Jetpack笔记代码本文源码基于SDK...

2020-05-03 19:11:18 281

原创 Android-Jetpack笔记-ViewModel

ViewModel处于数据逻辑层,他的生命周期贯穿整个宿主,如act因屏幕旋转销毁重建时,其依然存活,只有act.finish后,才会自动销毁,因此可以用他来维持宿主的数据状态。现在比较流行的方式是把他当做唯一数据源来驱动UI展示:view层: view (act / fragment)数据逻辑层: viewModel数据源: reposit...

2020-05-03 17:28:32 177

原创 Android-Jetpack笔记-LiveData

LiveData即有生命的数据,通过观察者模式实现,当数据发生变化时可以收到回调。同时还具备感知宿主生命周期的能力。Jetpack笔记代码本文源码基于SDK 29使用引入依赖:def lifecycle_version = "2.2.0"//extensions包含Lifecycles、LiveData、ViewModelimplementation "android.arch.li...

2020-05-03 12:26:38 209

原创 Android-Jetpack笔记-Lifecycles

Lifecycle即生命周期,一些业务场景如三方地图、播放器等,依赖于activity的生命周期,会有类似下面的用法:class MyAct extends Activity{ VideoPlayer player; void onCreate(){ player.init();//初始化 } void onResume(){ pl...

2020-05-02 17:44:39 195

原创 Android-Jetpack笔记-DataBinding

DataBinding即数据绑定,可以实现数据和UI的双向绑定。数据改变时,驱动UI刷新;操作UI时,也可以同步给数据。通常在开发界面时,总有findViewById的重复工作,DataBinding可以免去这些操作。同时,DataBinding还可以直接在xml中绑定数据,免去类似setText的操作,让数据来驱动UI刷新。Jetpack笔记代码使用在app/build.gradle中开启...

2020-05-02 11:05:32 320

空空如也

空空如也

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

TA关注的人

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