![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Android
文章平均质量分 91
普通网友
这个作者很懒,什么都没留下…
展开
-
为什么鸿蒙系统那么火,就业岗位却很少?而且很少有公司愿意培养新人?
近期某乎上有这么一则问答提问:“都说2024是原生鸿蒙的关键一年,华为鸿蒙各种大动作也没有停过。根据智联招聘数据显示,2023年9月-12月,鸿蒙相关职位数同比增速从33.8%攀升至216.1%;从零开始培养,无论是时间,还是金钱等各方面因素来说,代价都特别高。公司是需要发展的,更何况各大公司都在加速完成所以说时间很紧张。那公司都是招聘一些什么样的人群来进行完成鸿蒙版本的适配呢?大多数招聘中都写明了会鸿蒙开发或有相关经验的人优先。所以,具备大前端开发经验人群可以在短时间内学会鸿蒙开发。原创 2024-04-01 22:47:12 · 893 阅读 · 0 评论 -
HarmonyOS NEXT应用开发之跨文件样式复用和组件复用
本示例主要介绍了跨文件样式复用和组件复用的场景。在应用开发中,我们通常需要使用相同功能和样式的ArkUI组件,例如购物页面中会使用相同样式的Button按钮、Text显示文字,我们常用的方法是抽取公共样式或者封装成一个自定义组件到公共组件库中以减少冗余代码。原创 2024-03-20 15:42:23 · 1091 阅读 · 0 评论 -
理解Android线程基础与多线程编程模型
在Android中,线程是程序执行的最小单元。每个应用都有一个主线程(也称为UI线程),负责处理用户界面的事件和更新UI。同时,应用可以创建额外的线程来执行后台任务,以避免阻塞主线程。进程是程序运行的一个实例。一个应用可能包含多个进程,每个进程有自己的独立内存空间,但它们可以共享应用的资源。在Android中,每个应用都运行在自己的进程中。// 一些需要同步的代码块关键字用于实现线程同步,确保多个线程不会同时执行某个方法或代码块,从而避免数据竞争和不一致性。原创 2023-11-20 21:13:02 · 139 阅读 · 0 评论 -
面试题:设置view点击事件不回调的几种方式和原理
其实,这个逻辑还是蛮简单的,主要是要点一下代码。view 的dispatchTouchEvent 有默认实现,当重写后,放弃super,那么直接影响了点击事件和触摸事件等事件的分发,滚动也被影响了。所以点击事件回调就无法触发,因为没有代码调用到点击事件。setEnabled 将flag 修改成了DISABLED,导致onFilterTouchEventForSecurity返回了false,所以触摸事件回调和onTouchEvent 事件都没有调用到。而点击事件回调在onTouchEvent 里面。原创 2023-11-20 14:46:48 · 211 阅读 · 0 评论 -
学会Bitmap内存管理,你的App内存还会暴增吗?
相信伙伴们在日常的开发中,一定对图片加载有所涉猎,而且对于图片加载现有的第三方库也很多,例如Glide、coil等,使用这些三方库我们好像就没有啥担忧的,他们内部的内存管理和缓存策略做的很好,但是一旦在某些场景中无法使用图片加载库,或者项目中没有使用图片加载库而且重构难度大的情况下,对于Bitmap内存的管理就显得尤为重要了,一旦使用出现问题,那么OOM是常有的事。原创 2023-11-18 20:20:07 · 303 阅读 · 0 评论 -
Android源码分析 - Service启动流程
Service的整个启动流程到这里基本上都分析完了,至于Service的停止,重建等流程,我将会在后面的文章中再慢慢分析。原创 2023-11-17 15:19:39 · 293 阅读 · 0 评论 -
深入浅出 JetPack Compose UI 自动更新原理
可以看到,Compose 内部做了非常多有趣的优化,我不认为只使用 Compose 去编写 UI 能够发掘出这些东西。Compose 的编译器插件会对我们写的 Composable 函数作处理,生成 SlotTable 所需要的组信息以及用于重组时调用的 LambdaSlotTable 会在应用运行后创建Composable 监听使用到的 State 发生改变是由快照系统实现的重组发生时会从 SlotTable中取出旧数据对比是否发生改变,以跳过不必的重组。原创 2023-11-16 16:30:59 · 484 阅读 · 0 评论 -
缓存优化必备:掌握冷热分离和重排序的优化技巧
玩儿东西还是要弄明白这个东西的成立基础是什么,或者负面因素有哪些。需要有足够的数据支持冷热分离和重排序,否则这些优化可能不会带来明显的性能提升,甚至可能会造成额外的开销。冷热分离和重排序的实现需要考虑数据的生命周期,避免数据被错误地缓存或销毁。冷热分离和重排序可能会导致数据的展示顺序不符合用户的期望,需要进行适当的处理,以保证数据的展示效果。在实现时需要考虑多线程安全问题,避免因并发访问导致的数据错乱或其他异常情况。原创 2023-11-15 20:49:17 · 128 阅读 · 0 评论 -
Android 启动优化案例-WebView非预期初始化排查
去年年底做启动优化时,有个比较好玩的 case 给大家分享下,希望大家能从我的分享里 get 到我在做一些问题排查修复时是怎么看上去的。原创 2023-11-15 15:05:49 · 376 阅读 · 0 评论 -
Android 布局优化,看过来 ~
但是 CPU 和 GPU 写数据是不可控的,所以会出现 buffer 里有些数据根本没显示出来就被重写了,即 buffer 里的数据可能是来自不同的帧,当屏幕刷新时,此时它并不知道 buffer 的状态,因此从 buffer 抓取的帧并不是完整的一帧画面,即出现画面撕裂。屏幕刷新的机制大概就是: CPU 执行应用层的测量,布局和绘制等操作,完成后将数据提交给 GPU,GPU 进一步处理数据,并将数据缓存起来,屏幕由一个个像素点组成,以固定的频率(16.6ms)从缓冲区中取出数据来填充像素点。原创 2023-11-14 21:39:03 · 268 阅读 · 0 评论 -
Android JNI静态和动态注入方法
……原创 2023-11-14 15:19:24 · 314 阅读 · 0 评论 -
插件式换肤框架原理解析
收集到需要换肤的控件确定控件中需要换肤的属性和资源ID加载插件APK,构造并生成插件的Resource类,就可以加载插件包中的资源执行换肤:通过ID加载插件包中的资源,然后再通过控件的属性的set方法改变属性即可1、怎样去获取皮肤包中的资源?2、怎么确定当前页面中有哪些资源要进行替换?原创 2023-11-13 22:32:35 · 210 阅读 · 0 评论 -
面试 | 再也不怕被问 Binder 机制了
Binder 机制是 Android 特有的一种进程间通信(IPC)方式。原创 2023-11-13 16:22:38 · 355 阅读 · 0 评论 -
今天知道LiveData的ktx是真的香
其实,LiveData 要写,还是有很多知识点可以写的,但是这里只是进行了简单的逻辑的概述吧。我们通过属性变量的创建时机去进行接口请求或者缓存请求,那么在一定程度上是要比调用initData 更快的,而且这种逻辑非常清晰,我们将首次和刷新从逻辑层分离出来,这种代码看起来还是非常简洁的。在这个逻辑上,我们可以发现compose 的中的界面数据,通过这种方式的刷新,反而更加的贴合吧。当然通过Flow,或者channel 等方式 转LiveData 也是一种思路,但是在简单的界面请求中,感觉没有必要。原创 2023-11-11 20:41:32 · 187 阅读 · 0 评论 -
通过 dump 虚拟机线程方法栈和堆内存来分析 Android 卡顿和 OOM 问题
除了线程方法栈的dump,其他的方式都不适合线上分析。不要以为学会了方法栈的dump和虚拟机堆内存的dump就能够彻底解决这些问题,他们只是帮你发现这些问题,要彻底解决这些问题还需要很多其他方面的知识。原创 2023-11-10 21:04:22 · 1554 阅读 · 0 评论 -
安卓现代化开发系列——从状态保存到SavedState
古法状态保存由于历史的原因,设计的缺陷非常的大,开发者很难在复杂的业务中精准、高效地保存页面状态。的提供者。StateRegistryController:间接控制。SavedStateRegistry:状态的管理者。SavedStateProvider:状态的提供者。本章中,我们从最古早的方法回调的方式了解如何保存与恢复状态,发现出许多旧版方式存在的缺陷,然后从SavedState库着手,以一种新的方式完成状态保存。可以看出近些年来谷歌在努力着手解决安卓整体框架的缺陷。原创 2023-11-10 14:46:50 · 360 阅读 · 0 评论 -
[Framework] Android Handler 工作原理
在 Android Framework 中有两个主要的主线程Handler,一个是中的H,它主要来处理四大组建的各种生命周期;还有一个是中的,它主要负责绘制,动画,输入等操作。这两个Handler负责的工作和用户体验都极为密切,主线程也可以说非常忙。在项目中我经常发现很多的代码都会在主线程执行,明明有的操作不需要主线程执行。原创 2023-11-09 15:44:08 · 193 阅读 · 0 评论 -
劝学:Android 14 Framework 引入了哪些“新”技术栈
写到这里,我想回到本文的标题,细心的读者会发现,我给”新技术栈的”新“字打了引号,为什么?因为对于那些关注技术发展,同时在 Android 应用层和框架层之间工作的同学来讲,这些其实早就不是新技术了,有些甚至可以说是应用层”玩剩下的“。为什么这些技术时至今日才被引入 Android 框架?我想无外乎还是为了追求稳定,就像当年 Kotlin 也是在社区,在 App 开发层火了好多年,Google 后面才参与进来,并最终引入框架一样,很多东西的可行性和稳定性也需要时间去验证。原创 2023-11-07 21:47:26 · 846 阅读 · 1 评论 -
深入浅出 JetPack Compose UI 自动更新原理
可以看到,Compose 内部做了非常多有趣的优化,我不认为只使用 Compose 去编写 UI 能够发掘出这些东西。Compose 的编译器插件会对我们写的 Composable 函数作处理,生成 SlotTable 所需要的组信息以及用于重组时调用的 LambdaSlotTable 会在应用运行后创建Composable 监听使用到的 State 发生改变是由快照系统实现的重组发生时会从 SlotTable中取出旧数据对比是否发生改变,以跳过不必的重组。原创 2023-11-07 15:30:08 · 393 阅读 · 0 评论 -
Android 应用流量监控实践
在Java层, 创建Socket的方式是直接构造 java.net.Socket对象,我们先跟踪其构造函数的实现。在构造函数中,会调用setImpl()函数,继续跟踪setImple()实现setImpl()函数先判断 factory是否为空,如果不为空则 使用factory创建SocketImpl实例,否则直接通过 SocksSocketImple()构造函数创建。原创 2023-11-06 21:44:46 · 1222 阅读 · 0 评论 -
Zygote进程通信为什么用Socket而不是Binder?
Zygote进程是Android系统中的一个特殊进程,它在系统启动时被创建,并负责孵化其他应用进程。它的主要作用是预加载常用的系统类和资源,以提高应用启动的速度。在Android系统中,每个应用都运行在独立的进程中,这样可以保证应用之间的隔离性。然而,创建新进程需要消耗一定的时间和资源。为了减少应用启动的时间,Android引入了Zygote进程。Zygote进程在系统启动时会先加载一些常用的系统类和资源,然后通过fork()系统调用创建新的应用进程。原创 2023-11-03 17:46:34 · 562 阅读 · 0 评论 -
从0开始搭建一个APP:compose搬砖的一天
OK,先水到这,主要是阐述了一些第一次开发可能遇到的简单问题,也没有啥知识点,水一下,也挺好。再提一嘴,compose和Kotlin的学习是差不多的,要把格局打开,就是想象力得打开,打开了就会发现,很多东西,他其实已经存在了。原创 2023-11-02 14:32:21 · 272 阅读 · 0 评论 -
猫耳 Android 播放框架开发实践
猫耳FM是中国最大的 95 后声音内容分享平台,是B站重要平台之一,深度合作国内顶级声优工作室,打造了数百部精品广播剧,全站播放总量超过百亿次。MEPlayer 是猫耳 Android 技术团队研发的一款适用于音视频、直播、特效播放等多种场景的跨进程播放框架。音视频、直播、特效播放。支持自定义播放内核,目前内置了 exo、bbp(多媒体部门开发的轻量级播放内核),都添加了边下边播支持,可以自行扩展支持 ijk 等内核,实现固定的几个接口即可。与业务完全解耦,已在公司内多个团队使用。原创 2023-11-01 15:00:48 · 459 阅读 · 0 评论 -
掌握Android自定义View与独家优化技巧
自定义View是Android开发中的重要概念,允许你创建不同于标准UI组件的用户界面元素。这些自定义View可以是各种形状、颜色和交互方式,完全满足你的设计需求。创造性和定制性:自定义View允许你创建完全独特的用户界面元素,无限扩展Android原生UI组件的功能和外观。灵活性:自定义View可以满足各种复杂的设计需求,从简单的动画效果到高度定制的绘图应用。可重用性:一旦创建自定义View,它可以在应用中多次重复使用,提高代码的可维护性和可重用性。分离关注点。原创 2023-10-31 15:40:25 · 99 阅读 · 0 评论 -
Jetpack Compose | State状态管理及界面刷新
remember 在重组后保持状态,但不会在配置更改后保持状态;如果想在配置更改后保持状态,可以使用 rememberSaveable 代替;rememberSaveable 会自动保存可保存在 Bundle 中的任何值;如果不支持Bundle存储,可以将对象声明为 @Parcelize 可序列化,如果不能序列化,还可以将其传入自定义 Saver 对象。//1、使用@Parcelize注解//记得引入 apply plugin: 'kotlin-parcelize'插件@Parcelize。原创 2023-10-30 16:09:16 · 533 阅读 · 0 评论 -
Android帧率监测与优化技巧
帧率是指在一秒内,应用程序能够渲染的图像帧数量。通常以FPS(Frames Per Second)表示。例如,一个应用在每秒内渲染了60帧,那么它的帧率就是60 FPS。帧率越高,用户体验越流畅,但帧率的稳定性也同样重要。原创 2023-10-27 15:09:53 · 1200 阅读 · 0 评论 -
多 Activity 多 Page 的 UI 架构
世上没有最好的架构,只有最适合自己的。UI往往是变动最频繁的业务,所以了解各个组件的优缺点,根据业务逻辑去选用最适合的,才是高效开发的捷径。不管怎样,都是有无数坑点的,趋利避害才是UI的归宿。UI最好的经验就是知道各个组件有什么坑点,如何避开。不然随便一个坑,就够开发加好一会儿班了。原创 2023-10-26 15:33:45 · 907 阅读 · 0 评论 -
自动跳过APP启动页广告
在具体的代码实现中已经做了很多优化工作,不会影响APP正常使用,也不会导致耗电增多或导致系统卡顿之类的问题,完全可以放心使用。为了防止我们的广告服务被系统杀死,可以设置我们的APP为系统白名单或者允许后台运行等一系列保活方法让它多活一会吧。为了帮助到大家更好的全面清晰的掌握好启动优化,准备了性能优化相关的核心笔记(包含了启动优化、内存优化、网络优化……原创 2023-10-25 15:44:17 · 262 阅读 · 0 评论 -
关于Fragment的生命周期,你知道多少?
Fragment是一种可以嵌入到Activity中的模块化UI组件,它可以在一个Activity中承载多个Fragment,并且可以在不同的Activity之间共享。Fragment与Activity之间的关联关系是通过FragmentManager和FragmentTransaction进行管理的,同时也可以通过Fragment的生命周期回调方法和通信机制实现二者之间的交互。这四个方法是与Activity的生命周期相对应的,可以在这些方法中进行与Activity交互的操作。原创 2023-10-24 17:00:30 · 875 阅读 · 0 评论 -
思辨:移动开发的未来在哪?
从广义角度来看,移动开发是指为移动设备(如智能手机、平板电脑等)创建软件、应用程序和服务的过程。这包括了为各种移动操作系统(如 iOS、Android 和 Windows Phone)设计、开发、测试和发布应用程序。移动开发旨在为用户提供高质量的、功能丰富的移动体验,以满足其日常需求和娱乐需求。广义上的移动开发可以包括原生应用程序开发、跨平台应用程序开发、移动网页应用程序开发,以及相关的后端服务和API开发等。从狭义角度来看,移动开发通常指开发针对特定移动操作系统的应用程序,如 iOS 和 Android。原创 2023-10-23 21:42:05 · 134 阅读 · 0 评论 -
Android屏幕刷新机制
在每个扫描线上,Android系统会将要显示的像素数据发送给显示控制器,然后显示控制器会将这些像素数据转换为电信号,通过显示屏幕上的像素点显示出来。在Android中,屏幕的刷新是通过逐行扫描的方式实现的。Android屏幕刷新机制的演变是从最初的VSYNC同步刷新到Choreographer的引入,再到SurfaceFlinger的出现和双缓冲机制的引入。Android屏幕的刷新是通过逐行扫描的方式实现的,每个扫描线上的像素数据会被发送给显示控制器,并通过显示屏幕上的像素点显示出来。原创 2023-10-21 16:03:02 · 382 阅读 · 0 评论 -
深度剖析Android Binder IPC机制
Binder是Android系统中的IPC机制,它允许不同进程之间进行高效、安全的通信。Binder基于客户端-服务器模型,其中一个进程充当服务器,另一个进程充当客户端。客户端可以获取服务器进程提供的Binder对象引用,通过该引用调用服务器进程的方法。下面是Binder的基本工作原理:1.Binder对象:Binder通信的基本单元是IBinder接口,所有Binder对象都实现了这个接口。在系统内核层,Binder对象是以C/C++结构体的形式存在的,其中包括引用计数和标识符等信息。原创 2023-10-20 14:00:00 · 278 阅读 · 0 评论 -
分析并实现Android中的MVC、MVP架构模式
MVC的话它本来不属于Android的架构模式,而是来自于web前端。在Android发展的前期照搬了前端这一套模式。MVC模式就是Model、View和Controller。View的职责就是处理显示相关的逻辑以及接收用户行为。再把用户行为转发到Controller,Controller再根据请求去更新或者是获取Model层的数据。Controller更像是一个中转站或者是调度站。Model 负责管理数据、执行业务逻辑。MVC在前端的作用是为了分离数据和视图这两层,但是在Android上面它就不灵光了。原创 2023-10-19 13:00:00 · 505 阅读 · 0 评论 -
Android性能优化系列-腾讯matrix-流量监控之TrafficPlugin源码分析
流量监控的实现方式是通过hook c++层socket的发起和接收相关的方法,拦截到对应方法从而对过程中涉及到的流量信息进行采集,采集到的数据就可以实时的获取到,以做进一步的分析。原创 2023-10-18 13:00:00 · 396 阅读 · 0 评论 -
从简单到复杂,MVI 架构定义与封装使用总结
时间回到一年多前讨论度很高的 MVI 架构,现在也已尘埃落地,没有什么争议并各自都有自己的一套实现方案了,接下来我们就看看这些网上各种各样的 MVI 架构是如何从简单到复杂,从 Java 到 Kotlin 到协程再到 Compose 的各个场景的应用。首先你能点进来看到这篇文章,说明你或多或少都对 MVI 架构有些了解,我这里就不贴一些重复的图去解释 MVI 架构原理流程什么的了。原创 2023-10-16 13:00:00 · 518 阅读 · 0 评论 -
Android 音频可视化
通过给Visualizer设置OnDataCaptureListener之后,可以onFftDataCapture函数中获取快速傅里叶变换后的数据,但如何处理返回后的fft数据呢?通过FFT的数组格式,获取到每个频率点的实部和虚部。!.size//取频率点实部与虚部的模!!按照官方代码示例,我们去实数与虚数的模作为数据绘制点,模代表幅值的大小。拿到数据magnitudes之后在View中进行绘制。i++) {原创 2023-10-14 18:17:16 · 1054 阅读 · 0 评论 -
Android渲染系列之原理概述篇
渲染离不开屏幕,Android中的屏幕碎片化比较严重,尺寸大小不一,材质也是屏幕重要的因素。目前智能手机主流的屏幕可分为两大类即液晶显示器;原创 2023-10-13 14:00:00 · 680 阅读 · 0 评论 -
Android优化篇|网络预连接
通过 http(s) 的连接复用机制,我们可以考虑使用预连接来优化 APP 中某些场景的网络请求速度,这需要我们根据实际业务场景以及服务器压力来判断是否进行预连接。另外我们可以适当调大连接池的容量和超时时间,由于连接是双向的,即使客户端把 Connection 一直保留,服务端也会根据实际连接数量和时长来自动关闭连接的,所以调大连接池一般不会增大服务器压力。原创 2023-10-12 14:00:00 · 276 阅读 · 0 评论 -
Android斩首行动——应用层开发Framework必知必会
继承View这种类型常见于要绘制一些不规则的图形,需要重写它的onDraw方法。需要的注意的是,View的Padding属性在绘制过程中默认是不起作用的,如果要使Padding属性起作用,就需要自己在onDraw中获取Padding后绘制。另外,onMeasure时需要考虑wrap_content和padding的情况,上文也有提到过。继承ViewGroup这种类型比较少,一般用于实现自定义的布局。那就意味着要自定义布局规则,也就是自定义onMeasureonLayout。在onMeasure。原创 2023-10-11 11:30:00 · 264 阅读 · 0 评论 -
面试中常聊 AMS,你是否又真的了解?
每当这时候,内心真是一万只草泥马奔腾而过……大部分Android开发者一遇到这种面试题就直接懵逼了,不少人不是没有看过相关的解答,但也都只是浅尝辄止,没有深入掌握其中原理,面试的时候自然会被问个措手不及。下面这张图想必大家都看过,Google官方提供过一张经典的四层架构图,从下往上依次分为:Linux内核、系统库和Android运行时环境、框架层、应用层,其中每一层都包含大量的子模块或子系统。其中,),四大组件的启动、各个生命周期方法的调用基本都需要通过它来处理,所以它涉及到的知识点也非常多。。原创 2023-10-10 14:30:00 · 118 阅读 · 0 评论