自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

petterp的博客

因为热爱,所以愿意深夜3点。

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

原创 计算机网络 | 一文搞懂什么是TCP/IP协议

什么是TCP/IP协议?计算机与网络设备之间如果要相互通信,双方就必须基于相同的方法.比如如何探测到通信目标.由哪一边先发起通信,使用哪种语言进行通信,怎样结束通信等规则都需要事先确定.不同的硬件,操作系统之间的通信,所有这一切都需要一种规则.而我们就将这种规则称为协议 (protocol).也就是说,TCP/IP 是互联网相关各类协议族的总称。TCP/IP 的分层管理TCP/IP协...

2019-10-28 12:49:53 99980 76

转载 数据结构和算法对于一个程序员的重要性

 数据结构算法有什么用?当你用着java里面的容器类很爽的时候,你有没有想过,怎么ArrayList就像一个无限扩充的数组,也好像链表之类的。好用吗?好用,这就是数据结构的用处,只不过你在不知不觉中使用了。只不过java已经帮你实现了经典语段: 如果说 Java 是自动档轿车,C 就是手动档吉普。数据结构呢?是变速箱的工作原理。你完全可以不知道变速箱怎样工作,就把自动档的车子...

2018-08-04 11:57:14 3425

原创 写给Android工程师的 Github CI 快速指北

本篇是一份Github Action快速落地与入门指南,从而帮助Android 工程师快速入门GitHub Actions,并设置自动化CI流程,简化开发流程。

2023-05-22 10:48:00 2228

原创 落地包体积监控,用Kotlin写一个APK差异分析CLI

谈到Android包体积优化,必不可少的就是如何进行持续的监控。故此,本篇将由实际背景及需求出发,开发一个Apk差异分析CLI,并同时与Github CI关联,从而实现流水化监控包体积。

2023-05-22 10:46:26 1236

原创 写给Android工程师的协程指南

本篇我们将由浅入深,系统且全面的聊一聊协程的那些事,理清协程的挂起与恢复,底层实现,与线程池的差异等等相关问题,从而帮助大家更好的理解Kotlin协程。

2023-03-20 09:35:36 1136

原创 由浅入深,聊聊OkHttp的那些事(很长,很细节)

本篇将从背景开始,由浅入深,从设计思想到源码导读,与你一起剖析OkHttp的那些事,从而解锁Android网络库的知识拼图。

2023-02-13 09:53:52 1541 1

原创 由浅入深,聊聊 LeakCanary 的那些事

LeakCanary 是一个帮助Android开发者运行时检测内存泄漏的必备利器,而了解其背后的设计原理也更是每个应用层开发者必经之路。故此,本篇将与你一起,解密LeakCanary背后的黑魔法。

2023-01-30 18:35:34 709

原创 纵有疾风起,Petterp与他的2022

纵有疾风起,这是Petterp与他的2022,也是一个普通技术的随笔,如果本篇对你有所帮助,那就再好不过了。大家新年快乐~

2023-01-16 21:45:19 765

原创 由浅入深,详解ViewModel的那些事

ViewModel作为JetPack的组件之一,其本身承担着不可或缺的作用,而了解其设计思想也是每个开发必备技能。故本篇将从背景与使用方式开始,再到源码解析,由浅入深,详解ViewModel方方面面。

2023-01-10 13:17:31 509

原创 Kotlin|这些隐藏的内存陷阱,你应该熟记于心

Hi, 你好,很高兴见到你 👋 是一个非常 yes 的语言,从 null安全 ,支持 方法扩展 与 属性扩展,到 内联方法、内联类 等,使用Kotlin变得越来越简单舒服。但编程从来不是一件简单的工作,所有简洁都是建立在复杂的底层实现上。那些看似简单的kt代码,内部往往隐藏着不容忽视的内存开销。介于此,本篇将根据个人开发经验,聊一聊 中那些隐藏的内存陷阱,也希望每一个同学都能在 性能 与 优雅 之间找到合适的平衡。学完本篇,你将了解到以下内容:好了,让我们开始吧!密封类用来表示受限的类继承结构:当一个值

2022-12-06 21:40:46 274

原创 求知 | 聊聊Android资源加载那些事 - Resource的初始化

本篇将由浅入深,解释Android Resources初始化的流程,以及context.resources 与 Resources.getSystem() 的不同之处。

2022-12-06 21:29:32 710

原创 由浅入深,详解 LiveData 的那些事

LiveData,一直是JetPack最常用的组件之一,而深入并理解LiveData更是每个开发者的基本功,本篇将由浅入深,从设计思想到源码,再到关联问题,从而真正吃透其本质。

2022-12-06 21:25:17 1035

原创 由浅入深,详解 Lifecycle 生命周期组件的那些事

本文将深入浅出,从背景到源码实现,分析Lifecycle本身的设计思想,从而为理解JetPack系列库迈下第一步。

2022-12-06 21:22:24 297

原创 求知 | Android资源加载的那些事 - 小试牛刀

本篇将由浅入深,从源头理清 Resource.getx() 的那些事,从而为理解 Android资源加载 迈出第一步。

2022-10-11 22:40:50 780

原创 Kotlin | 浅谈 Reified 与泛型 的三两事

开发中,我们经常会用到泛型,泛型好用,但相应的泛型擦除也困扰着我们。在Kotlin中,reified 可以优雅的解决上述问题,本文将浅析其底层实现,帮你理清 reified 与泛型 的那些事。

2022-09-14 09:41:05 274

原创 Kotlin | 关于协程异常处理,你想知道的都在这里

关于协程的异常处理,一直以来都不是一个简单问题。因为涉及到了很多方面,包括 异常的传递 ,结构化并发下的异常处理 ,异常的传播方式等,本篇将由浅到深,帮你搞清这些问题。

2022-08-11 15:46:18 1002

原创 写了一个适配 Android12-exported 的小插件

从 Android12 开始,如果我们的 tagSdk >=31, 即以 Android 12 或更高版本为目标平台时,且包含使用 intent-fliters,服务,广播,则必须为这些组件声明 android:exported 属性。这个插件就是帮助大家更好的解决此问题。...

2022-06-27 11:32:51 642

原创 ViewPager中Fragment状态保存的哪些事

Hi ,很高兴见到你!引言在使用 ViewPager 时 , 如果我们的适配器使用的是 FragmentStatePagerAdapter ,那么当我们重新滑到之前已销毁的页面时,一般情况下页面的状态依然将保持不变(比如 RecyclerView 的 滚动位置等,EditText 的 输入内容 等), 或者说 View 历史状态被还原了。本文的主旨就是解释其 保存与还原内部的原理以及过程。基础概念ViewPager 官方的适配器有两种,即 FragmentPagerAdapter 以及 Fragm

2022-04-20 23:51:53 522

原创 Kotlin | 关于 Lazy ,你应该了解的这些事

Hi,很高兴见到你!👋🏻本文主要分享 Kotlin Lazy 相关,希望看完本篇,可以帮助到你更好的理解与使用。引言每一个使用 kotlin 的同学,或多或少都会使用 Lazy , 其中文翻译名为 延迟初始化 。作用也相对直接,如果我们有某个对象或字段,我们可能只想使用时再初始化,此时就可以先声明,等到使用时再去初始化,并且这个初始化过程默认也是线程安全(不特定使用NONE)。这样的好处就是性能优势,我们不必应用或者页面加载时就初始化一切,相比过往的 var xx = null ,这种方式一定程度.

2022-04-20 23:50:27 4201

原创 山川湖海 - Android无障碍代理的那些事

Hi,很高兴见到你!本篇是无障碍系列第二篇 - Android无障碍代理的那些事本篇将聊一聊什么是无障碍代理,及结合实际场景,分享一下我们对于无障碍代理的使用,并且如何让其更加易用。什么是无障碍代理?当用户在无障碍模式下时,用户在界面上与View的所有操作,都会触发相应的无障碍事件,这些事件最终由 无障碍服务处理 ,其会利用这些事件中的信息生成反馈和提示。自Android1.6(Api-4)开始,Android提供了相应的无障碍事件的代理扩展,我们可以通过实现相应的无障碍代理类(Accessi.

2022-04-20 23:48:54 2432

原创 Gradle基础|自定义插件并上传到JitPack

Hi???????? ,很高兴见到你!开发两年了,我想认真学一下Gradle,这是我的2022技术进阶计划,Gradle系列的第二篇,希望对你有所帮助。引言每一个使用 Gradle 的同学,肯定都听过或者写过插件,因为其本身并不难,但碍于现在网上的文章千篇一律,大部分都比较老,新同学一上手反而是和我一样,花了大把时间在最基础的第一步如何写一个简单demo上。再者如果大家使用 AndroidStudio BumBlebee 去创建项目,那对照网上教程差别更大,甚是花费时间,而本篇就是帮你省掉这些时间。

2022-02-08 09:25:10 1790

原创 山川湖海 - Android无障碍功能优化实践

Hi,很高兴见到你!????????本文主要分享Android无障碍功能的一些优化经验,希望看完本篇,可以帮助到你,以及哪些特殊的用户。前言最近我们团队收到了一些用户的反馈:有用户反馈,我们的部分功能按钮在无障碍下无法正常识别。其实这已经不是我第一次看到反馈了,第一次是16年ios端收到了用户的反馈,进行过一次优化。说来惭愧,反而是我们 Android 这边也一直没有专门进行过适配。什么是无障碍功能?对于一些视障人群或者听障人群而言,普通的App对它们来说使用起来可能困难重重。在 Androi

2022-01-24 15:24:49 3376

原创 哪怕不学Gradle,这些开发中的常见操作,你也值得掌握

Gradle 是每个 Android 同学都逃不开的一个话题。你是否看到别人的 Gradle 文件干净又卫生?而自己的又是一团乱麻????不用怕,本篇将结合我的开发日常,将一些常用的操作分享出来,希望可以帮到像我一样不怎么会[玩]Gradle 的同学,相信会对大家有所帮助。模板代码提取这是最基础的操作了,对于一个普通 model.gradle ,默认的配置如下:如果我们每个 model 都这样写,那岂不是很麻烦,那么让我们提取通用代码:优化步骤新建一个 gradle 文件,命名为 xxx.

2022-01-17 10:07:35 2322

原创 浅谈2022Android端技术趋势,什么[值得]学?

2021 已经过去了,那么 2022 ,原生Android 端会有什么技术趋势呢?又有哪些 [新] 技术值得我们去学?对我们开发者而言,Android团队 又是如何推荐的呢?

2022-01-16 23:55:35 2173

原创 如何写一个Compose状态页组件 (修正篇)

在上个月前,我写了这样的一篇文章,开源 | 如何写一个好用的 JetPack Compose 状态页组件 。里面讲了如何去写一个 compose 状态页组件,结果这反而是错误的开始,本篇就是对上述的一个修正及反思过程。反思在上篇中,我简单实现一个 compose 中的状态页,但为了解决重组后造成的重新加载问题,当时没有想到该更好的如何处理这个问题,于是采用了命令式的方式去操纵实现了整个流程,这与 compose 的声明式明显格格不入。旧的整体流程如下所示:在 viewModel 中定义了一个当前状

2021-12-17 11:16:40 975

原创 Hi,这是一个普通Android开发的2021小结

Hi ,今年是我入行的第二年,每一年的年终,按照习惯,都会记录一下。轻轻敲击键盘,文字就如鱼得水。找几个关键字描述关于今年:工作、焦虑、健身、思考、生活、猫今年发生了不少事,作为一个有趣青年,那就先用一段 rap 简单给本篇开个头。????‍♀️来段不正经Rap?呦呦呦,谢邀呦,人在家里,刚躺床上,开始胡扯。今年感觉呢,一半一半啊,闲的时间多,但就不乐动,就是躺平哎?心里有声,告诉自己,NO,NO,NO !怎么办,怎么办?怎么办?今天焦虑,明天情绪,压抑压抑,膨,炸了 ->投

2021-12-08 19:49:37 6147

原创 开源 | 如何写一个好用的 JetPack Compose 状态页组件

引言世界很大,也很小,组件很多,也很少。关于开发中常见的状态页组件,我们已经见了很多,但是在 JetPack Compose 中该如何去写呢?虽然也有大佬写了相关demo ,但是如果要应用到实际中,不免有些捉襟见肘 。本篇要解决的就是如何定制一个符合 实际开发 的状态页工具,并分析具体原理与设计思路。效果图这个效果图很简单,就是普通的一个状态页,所以也没什么值得说的,我们接下来分析一下,如果要实现一个状态页组件,需要有哪些基础功能。需求分析支持 compose 与 view分层设计,按需

2021-11-04 18:04:56 545

原创 浅析 JetPack Compose 是如何安装到View视图上

Hi , : )看完本文可以帮你解开什么问题?为什么 Compose 无需在意 view 层级问题,怎样嵌套都行? (最简单10s就能明白);Compose 如何安装到传统 View 视图上;门外汉-从布局窥一眼这是一段 Compose 的简单代码,我们演示了多层嵌套下的示例:如果按照传统 View 的思维,我们不难发现,当前 content(R.id.content(FrameLayout)->) 布局中存在5层嵌套,这是极不可取的一种做法。但是现在是 Compose ,最终的绘

2021-11-01 14:09:20 533

原创 JetPack Compose主题配色太少怎么办,来设计自己的颜色系统吧

引言JetPack Compose 正式版已经发布好几个月了,在这段时间里,除了业务相关需求之外,我也开始了 Compose 在实际项目中的落地实验,因为一旦要接入当前项目,那么遇到的问题其实远远大于新创建一个项目所需要的问题。本篇要解决的就是 Compose 默认 Material 主题颜色太少,如何配置自己的业务颜色板,或者说,如何自定义自己的颜色系统,并由点入深,系统的分析相关实现方法与原理。问题在开始之前,我们先看看目前创建一个 Compose 项目,默认的 Material 主题为我们提供

2021-10-27 18:36:01 1772 3

原创 小知识 | 善用Mac自动化,少掉头发多喝茶

引言相信对使用 mac 的小伙伴来说,命令行肯定是必不可少的一个基操。但是开发中有些命令行贼长,比如当你要安装一个 aab 时,这个步骤很是麻烦,于是乎有没有一种更简单的方式呢?答案是肯定的,现如今各种第三方工具,都可以支持一键干这干呢。那么有没有双击就可以的呢?当然也可以,双击执行 shell 去安装,提前写一个脚本即可,但今天我想分享一下使用 mac 自带的 自动操作 来做这些事,即 AppleScript 脚本在 Android 开发中实际常见应用场景。什么是自动操作?让 Mac 替你执行重复

2021-10-22 15:27:18 1414

原创 小知识 - Gradle7.0之后JitPack发布组件需要注意的几个问题

最近在使用 JitPack 发布组件时候,遇到了这几个问题,着实找了好一会才解决,分享一下。????问题1 - 调整jdk版本为11What went wrong:An exception occurred applying plugin request [id: ‘com.android.application’]Failed to apply plugin ‘com.android.internal.application’.Android Gradle plugin requires

2021-10-13 21:02:39 3339 1

原创 你好,23岁的 Petterp

今天是我的????,和大多数人一样,这一天总有特别的感受,我觉得应该写一点什么记录下来。你好,23岁的Petterp。关于 往昔我相信每个人在不同的年纪都有不同的想法,这些想法一般随着时间的流逝,后来的我们往往会觉得当时还是太年轻。在外人看来,我是一个乐观的人,似乎不会有什么太烦心的事,但其实我挺悲观主义,这里的悲观指的是对于事物的变化,总无可避免想到结果。经常一个人容易陷入不知道做什么的情况中,于是这个时候就会想起我的那帮同学,我会给他们打一个电话,其实并没有什么事,只是想找他们聊聊天,尽管打过

2021-09-09 00:33:10 361

原创 一个普通程序员和他的猫

正逢北京下雨,写完一篇技术文后,突然想写一下我养的一只小猫咪—— 皮卡丘 ,认真想想,我的确没有怎么写过它。我想以这样的方式让大家认识认识它。初到去年9月的时候,我第一次遇见它。这是它最开始的样子,那时候它很小,我开始担负起了铲屎的责任。这是11月的时候,晚上我写代码的时候,它就会在窗子哪里瞎看,我不知道它是不是也对这个世界充满好奇,但我也希望他能永远相信光。这是它的姐姐-奶糕,它刚来这个家庭时,奶糕经常这样以友好的形式问候。日子一天天过去,它两的关系也越来越好了。熟悉皮卡丘总是对

2021-08-15 17:57:30 469

原创 记一次inline使用不当导致编译期Null指针的排查过程

起因周五的一个下午,我哼着小曲和往常一样合完代码。准备运行试试看,结果build时发现了这样一个异常。InlineParameterChecker NullPointerException一般对于这种编译期间的异常,原因往往并不是很容易能快速定位,因为往往都是业务代码出现的问题,如果某次合并更改很多,比如我这一次,重构了底层的某个组件,所以直接当场裂开????。于是接下来整个任务都变成了如何找到 错误的 代码处。先说结论当方法添加了 inline 修饰后,即也就是内联之后,如果方法参数是一个函

2021-08-15 16:38:34 318

原创 Android免权限悬浮窗组件 - FloatingX

FloatingX ,一个强大的免权限悬浮窗组件,支持全局,以及局部悬浮窗。背景在前几个月的业务开发中,我们 app 需要对悬浮窗进行更改,常见的悬浮窗实现方式分为两种:前者是获取权限后,利用 WindowManager 实现后者是基于 DecorView 实现的插入悬浮窗选用怎样的方案,主要根据业务的定向, 因为我们的业务不是视频通话类,而是菜谱工具类,所以我们不愿意让用户为此去设置中授予权限,这是一件成本较大的事,故采用了后者的方案,业内知乎也使用的这种方案。在之前的版本中,我们已经采用

2021-08-11 11:52:07 2080 3

原创 解决Android Studio更新最新北极狐版本后出现的中文乱码问题

今天好多同学都更新了最新版北极狐,然后发现有些同学出现了中文乱码问题,这个问题其实已经是老问题了,在之前的Canary中就存在了。虽然很简单,但是还有不少同学在问,就发一下解决方法,很简单,希望能帮到大家。解决方法:去 设置-Appearence-font 改变默认字体即可。当然如果你改完后不习惯更换后的字体,可以先将字体换为新的,然后保存后。查看无乱码后,重启as,再次设置原本的 默认字体即可。另外 mac的默认字体为 .AppleSystemUIFont...

2021-07-29 22:28:16 1176 1

原创 浅析 synchronized 底层实现与锁相关 | Java

引言一切的最开始都是源自为什么?为什么加了锁 synchronized 关键字,就可以实现同步?synchronized 底层到底做了什么优化?Java 中的各种锁及锁膨胀?用户态、内核态与上下文切换到底是什么鬼?什么叫自旋锁,它与 CAS 的关系?对象头是什么玩意,什么又是 MarkWord ?概述synchronizrd 是开发中解决同步问题中最常见,也是最简单的一种方法。从最开始学习并发编程,我们都知道,只要加上这个 synchronizrd 关键字,就可以很大程度上轻松解决

2021-06-24 20:31:51 260

原创 深入浅出,从 ReentrantLock 到 AQS | Java

引言如果问一个 Android 同学,请你简单说一下 Java AQS 的基本思想,那么有不少于一半的同学可能是懵逼状态????。什么玩意,AQS 是什么,我咋没听过????。的确,对于非Java后端同学来说,没听过倒也不是什么太过分的事,但是如果你深入学习过 Java 并发相关,那么肯定会去了解各种锁,而作为一个 有志青年 的你必然会在心里来一句,为什么加了锁就可以同步 ? 此时必然也会看到 AQS 的影子。从技术的角度讲,当我们谈到 ReentrantLock ,不难也会说到 AQS 。如

2021-05-24 09:48:22 342

原创 Java | 并发编程的那些事 - 开篇引子

引言大家好,我是一个练习时长 一年半的 Android Developer 。不知道从什么时候开始,我变得只注重新东西,开始变得浮躁,容易定不下来做一些事,对一些想要写的组件分析,却因为觉得简单,没什么可写就草草了去,反而其实自己也只是停留在 [使用阶段] ,源码也只是大概了解。往往因一些反而是看起来基础的东西,总是在被突然问起时,又通通吐吐,捉摸不定????,回答总是差强人意。慢慢的,我似乎明白了,其实是我在逃避一些我不愿意面对的 [基础] 问题,对于我来说,关于并发编程的方方面面,似乎也都能

2021-04-13 23:49:36 221 1

原创 Java | 静态代理与动态代理真的超简单

静态代理: 由我们开发者自己手动创建或者在程序运行前就已经存在的代理类,静态代理通常只代理一个类,动态代理是代理一个接口下的多个实现类。动态代理: 在程序运行时,运用java反射机制动态创建而成,静态代理事先知道要代理的是什么,而动态代理不知道要代理什么东西,只有在运行时才知道,通常动态代理实现方式是通过实现 jdk 的 InvocationHandler 接口的 invoke 方法代码实践需要代理的接口interface IBook { fun toBookName(name: Strin

2021-04-06 00:40:39 249

空空如也

空空如也

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

TA关注的人

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