- 博客(96)
- 收藏
- 关注
原创 Android高手笔记-屏幕适配 & UI优化
Android高手笔记-屏幕适配 & UI优化屏幕与适配由于Android碎片化严重,屏幕分辨率千奇百怪,而想要在各种分辨率的设备上显示基本一致的效果,适配成本越来越高;屏幕适配究其根本只有两个问题:在不同尺寸及分辨率上UI的一致(影响着用户体验);从效果图到UI界面代码的转化效率(影响着开发效率);适配方式:px在标识尺寸时,Android官方并不推荐使用px(像素),因为不同分辨率的屏幕上,同样像素大小的控件,在分辨率越高的手机上UI显示效果越小;(因为分辨率越高单位
2022-02-23 10:23:17
2095
原创 设计了一个红包封面,快来领取吧
分享一个红包封面哈喽,大家好,我是 今阳,最近微信团队送给了我一批微信红包封面的额度,以「小老虎」为主题设计了一款微信红包封面,在这里分享给大家,提前祝各位新春快乐,万事如意!预览效果如下:领取方式关注公众号"今阳说", 查看最新推送或回复关键字"红包封面"即可领取我是今阳,如果想要进阶和了解更多的干货,欢迎关注微信公众号 “今阳说” 接收我的最新文章...
2022-01-26 10:11:22
522
原创 Android进阶笔记-6. 从源码看View体系(坐标,滑动,分发,绘制)
坐标系Android中有两种坐标系,Android坐标系和视图坐标系Android坐标系定义:屏幕左上角顶点为Android坐标系原点,向右为X轴正方向,向下为Y轴正方向;MotionEvent提供的getRawX()和getRawY()获取的坐标都是Android坐标系的坐标;视图坐标系View获取自身宽高:getWidth(),getHeight();View自身坐标(View到其父控件原点的距离):getTop(),getLeft(),getRight(),getBottom(
2022-01-20 16:16:08
1994
原创 探索Android开源框架 - 11. 热修复原理
热修复技术介绍重新发布版本代价大,成本高,不及时,用户体验差,对此有几种解决方案:Hybird:原生+H5混合开发,缺点是人工成本搞,用户体验不如纯原生方案好;插件化:移植成本高,对老代码的改造费时费力,而且无法动态修改;热修复技术,将补丁上传到云端,app可以直接从云端下来补丁直接应用;热修复技术对于国内开发者来说是一个比较实用的功能,可以解决如下问题:发布新版本代价较大,用户下载安装成本高;版本更新的效率问题,需要较长时间来完成版本覆盖;版本更新的升级率问题,不升级版本的用
2022-01-14 18:45:38
1634
原创 Android高手笔记-D8, R8编译优化
在之前的文章Android高手笔记-包体积优化中提到过通过编译优化包体积,涉及到了ProGuard,D8,R8,其中关于ProGuard及包体积优化方案已经进行了详细介绍,那么今天我们来说说D8和R8;D8D8是一款用于取代 DX、更快的 Dex 编译器,可以生成更小的 APK;开启D8的好处编译更快、时间更短编译时占用内存更小.dex文件更小.dex 文件拥有更好的运行时性能支持在代码中使用 Java 8 语言开启与关闭Android Studio 3.0 需要主动在gr.
2022-01-13 18:35:52
5638
原创 Android进阶笔记-5. IPC机制 & Binder 原理
IPC机制一次进程间通信至少包含两个进程,由于进程隔离机制的存在,通信双方必然需要借助 IPC(进程间通信,inter-Process Communication)来实现;Linux中的IPC机制种类管道(pipe)继承自Unix,半双工通信方式(数据只能在一个方向上流动);原理:通信双方利用内存的共享文件来传递信息;信号(sinal)异步通信方式,软件层对中断机制的一种模拟,例如内核通知用户空间进程发生了哪些系统事件不适用于信息交换,适用于进程中断控制;信号量(semophore
2022-01-12 18:42:12
868
原创 Android进阶笔记-4. BroadcastReceiver的注册、发送和接收
关于BroadcastReceiverBroadcastReceiver(广播接收者)是一个系统全局的监听器,用于监听系统全局的Broadcast广播消息,使用观察者模式,基于消息的发布/订阅事件模型;广播的分类普通广播:开发者自身定义intent的广播;系统广播:Android中内置的多个系统广播,每个广播都有特定的Intent - Filter;有序广播:发送的广播被广播接收者按照priority属性值大小排序,priority相同的,动态注册的广播优先//发送有序广播val in
2022-01-11 18:58:56
1272
原创 Android进阶笔记-3. Service 启动过程 & 绑定过程
startService和bindServiceService的启动方式主要有两种,分别是startService和bindService使用startService启动时是单独开一个服务,与Activity没有任何关系,而bindService方式启动时,Service会和Activity进行绑定,当对应的activity销毁时,对应的Service也会销毁startService多次,onStart()会执行多次,onCreate()只执行一次,onStartCommand()也会执行多次。bi
2022-01-07 18:44:42
1920
原创 重学Java系列-2. JVM内存模型 & 类加载机制
Java内存模型 & JVM内存分区线程之间的通信在命令式编程中,线程之间的通信机制有两种共享内存和消息传递。共享内存:线程之间通过写-读内存中的公共状态来隐式进行通信,典型的共享内存通信方式就是通过共享对象进行通信。消息传递:线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信,在java中典型的消息传递方式就是wait()和notify(),notifyAll()。Java内存模型Java的并发采用的是共享内存模型,JMM决定一个线程对共享变量的写入何时对另一
2022-01-06 15:57:04
945
原创 重学Java系列-1. GC原理 & 垃圾回收算法
GC原理GC即垃圾收集,追踪仍然使用的所有对象,并将其余对象标记为垃圾然后进行回收;GC判断策略(例如引用计数法,可达性分析法)GC收集算法(标记清除法,标记清除整理法,标记复制清除法,分带法)GC收集器(例如Serial,Parallel,CMS,G1);判断策略(哪些内存需要回收)引用计数法:每个对象都有一个引用计数器,当对象被引用一次的时候,计数器+1,当对象引用失效的时候,计数值-1,实时性, 但不能解决循环引用的问题;可达性分析法:从GC Root作为起点开始搜索,,那么整
2022-01-04 18:24:18
369
原创 干掉RxJava系列--2. 手写FlowBus替代RxBus/EventBus/LiveDataBus
LiveData的不足LiveData 是一个专用于 Android 的具备自主生命周期感知能力的可观察的数据存储器类,被有意简化设计,这使得开发者很容易上手,但其不足有如下两点:LiveData只能在主线程更新数据(postValue底层也是切换到主线程的,而且可能会有丢数据的问题);LiveData操作符不够强大, 对于较为复杂的交互数据流场景,建议使用 RxJava 或 Flow;LiveData与Android平台紧密相连,虽然LiveData在表现层中运行良好,但它并不适合领域层,因
2021-12-31 10:10:32
1710
原创 干掉RxJava系列--1. 手写权限请求替代RxPermission
起因最近在对公司项目做APK包体积优化, 其中少不了对一些不必要的三方库的移除,在此过程中发现项目中居然有一系列的Rx相关库,RxJava,RxBus,RxPermission,于是心中起了一丝杀意。当然RxJava还是相当强大的,基于事件流的链式调用,进行耗时任务,线程切换,是一个很好的异步操作库,毕竟我上一个系列文章才写过探索Android开源框架 - 3. RxJava使用及源码解析,如果想更深入的了解RxJava的话可以看一下,不过随着现在kotlin的普及,其协程和Flow基本也可以替代Rx
2021-12-29 19:06:53
718
原创 探索Android开源框架 - 10. 插件化原理
什么是插件化插件化技术最初源于免安装运行apk的想法,这个免安装的apk可以理解为插件将app中一些不常用的功能模块做成插件,一方面减小了安装包的大小,另一方面可以实现app功能的动态扩展;插件框架有两个作用:一是“自解耦”,二是“免安装”自解耦指的是一个应用原本由一份代码编译而成,希望改成将其中的一些功能单独编译,像插件一样动态插在主应用上。这样一来可是使主应用体积变小,下载安装更方便。二来可以是比较独立的功能可以单独开发调试,甚至单独更新版本。免安装指的一个应用原本需要安装过程才能启动运行
2021-12-27 14:40:49
424
原创 探索Android开源框架 - 9. ARouter使用及源码解析
最近对项目进行组件化重构,要进行组件化就少不了组件间通信的路由,于是就再次研究了一下阿里的ARouter,关于组件化可以查看我之前写的组件化架构系列文章,这里就不过多提及了Android组件化架构 - 1. 组件化基础Android组件化架构 - 2. 组件间通信机制(1)Android组件化架构 - 2. 组件间通信机制(2)Android组件化架构 - 3. 组件间跳转 & ARouter路由Android组件化架构 - 4. 动态创建 & 反射机制Android组件化架.
2021-12-10 19:12:05
2036
原创 探索Android开源框架 - 8. Gson使用及源码解析
Gson 是 我们经常用来在 Java 对象和 JSON 数据之间进行映射的 库,今天我们就来分别讲一讲其使用和源码分析使用详解1. 基本的解析与生成Gson提供了fromJson() 和toJson() 两个直接用于解析和生成的方法,前者实现反序列化,后者实现了序列化解析基本数据类型val gson = Gson()val i = gson.fromJson("100", Int::class.java) //100val d = gson.fromJson("99.99", D.
2021-12-03 18:17:36
2533
原创 探索Android开源框架 - 7. LeakCanary使用及源码解析
简介LeakCanary是Square公司研发的一个可视化的内存泄漏分析工具LeakCanary2.x从2.x版本开始有了比较大的升级完全使用Kotlin重写;使用新的Heap分析工具Shark,替换了之前的haha,按官方的说法,内存占用减少了10倍泄露类型分组使用添加依赖最新的LeakCanary只需引入依赖,不需要初始化代码,就能执行内存泄漏检测;debugImplementation 'com.squareup.leakcanary:leakcanary-andr
2021-11-15 16:43:49
2461
原创 探索Android开源框架 - 6. ButterKnife使用及源码解析
相关知识ButterKnife中最重要的就是先自定义注解,再通过APT在编译期解析注解,解析器中又会用到反射,然后通过javapoet库来生成模板代码,要想学习其源码,首先要基本的了解注解和反射的知识;注解Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制;Java中的类、方法、变量、参数和包等都可以被标注,Java 标注可以通过反射获取标注内容;在编译器生成类文件时,标注可以被嵌入到字节码中,Java 虚拟机可以保留标注内容,在运行时可以获取
2021-11-11 11:25:05
1696
原创 探索Android开源框架 - 5. EventBus使用及源码解析
相关概念定义Android事件发布/订阅框架,简化应用程序内组件间,组件与后台线程间的通信;优点代码简洁,使用简单,将事件发布和订阅充分解耦;五种ThreadModePOSTING(默认)接收事件方法应执行在发射事件方法所在的线程MAIN接收事件方法应执行在主线程MAIN_ORDERED接收事件方法会被扔进 MessageQueue 中等待执行BACKGROUND发射事件方法在主线程中执行,则接收事件方法应执行在 EventBus 维护的单一子线程 执行发射
2021-10-19 15:13:05
761
原创 探索Android开源框架 - 4. Glide使用及源码解析
使用1. 添加依赖implementation 'com.github.bumptech.glide:glide:4.12.0'annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'2. 基础使用加载图片Glide.with(this) .load(imgUrl) .into(imageView1)取消加载Glide.with(this).clear(imageView1)实际上,当 G
2021-10-15 16:50:50
683
原创 探索Android开源框架 - 3. RxJava使用及源码解析
相关概念Android多线程编程的原则:不要阻塞UI线程;不要在UI线程之外访问UI组件;ReactiveXReactive Extensions的缩写,一般简写为Rx;是一个使用可观察数据流进行异步编程的编程接口,ReactiveX结合了观察者模式、迭代器模式和函数式编程的精华;RxJavaReactive Extensions for the JVM:,RxJava就是ReactiveX在JVM平台的实现;基于事件流的链式调用,进行耗时任务,线程切换,其本质是一个异步操作库;
2021-09-30 13:54:51
273
原创 探索Android开源框架 - 2. Retrofit使用及源码解析
Retrofit是目前Android最优秀的网络封装框架,是对OkHttp网络请求库的封装App应用程序通过Retrofit请求网络,实际上是使用Retrofit接口层封装请求参数,之后由OkHttp完成后续的请求操作;服务器数据返回后,OkHttp将原始的结果交给Retrofit,根据用户需求对结果进行解析;使用简单使用添加依赖retrofit2内置了OkHttp,所以无需再单独添加OkHttp依赖了implementation 'com.squareup.retrofit2:retr.
2021-09-17 14:42:09
199
原创 探索Android开源框架 - 1. OkHttp源码解析
使用1. 添加依赖implementation 'com.squareup.okhttp3:okhttp:3.14.9'2. 常用请求方法1. 同步GET请求执行请求的操作是阻塞式的,直到http响应返回1. 创建OkHttpClient对象直接创建val client = OkHttpClient()通过Builder模式创建val client = OkHttpClient.Builder() .build()2. 创建Request对象val requ
2021-09-14 17:09:59
264
原创 Android Jetpack系列--9. Hilt使用详解
相关知识依赖注入Dependency Injection,简称DI;依赖项注入可以使代码解耦,便于复用,重构和测试什么是依赖项注入类通常需要引用其他类,可通过以下三种方式获取所需的对象:在类中创建所需依赖项的实例class CPU () { var name: String = "" fun run() { LjyLogUtil.d("$name run...") }}class Phone1 { val cpu = CPU()
2021-09-14 17:05:21
230
原创 Android Jetpack系列--8. DataStore使用详解
SharedPreferences 和 DataStore 对比SharedPreferences:可能阻塞UI线程,导致ANR异常(需要等等sp文件加载完成,而且存储数据越多,文件越大,加载越慢,所有我们之前使用时都会分类存储在不同的sp文件中,如用户信息,业务信息,统计信息等)且不能用于跨进程通信// ContextImpl.getSharedPreferences()public SharedPreferences getSharedPreferences(File file, int m
2021-09-03 09:33:08
2575
原创 Android Jetpack系列--7. WorkManager使用详解
相关知识交换空间:当系统内存资源已被耗尽,但是又有额外的内存资源请求的时候,内存中不活动的页面会被移动到交换空间。交换空间是磁盘上的一块区域,因此其访问速度比物理内存慢。Android基于Linux内核,两者主要差别在于Android系统没有交换空间(Swap space)于是Android系统引入了OOM( Out Of Memory ) Killer 来解决内存资源被耗尽的问题。其作用是根据进程所消耗的内存大小以及进程的“visibility state”来决定是否杀死这个进程,从而达到释放内
2021-09-02 09:07:09
174
原创 Android高手笔记-包体积优化
为什么要优化包体积下载转化率:安装包越小,转化率越高;推广成本:渠道推广成本和厂商预装的单价应用市场:App Store和Google Play对安装包大小都有限制;应用性能:安装时间:文件拷贝、Library 解压、编译 ODEX、签名校验运行内存:Resource 资源、Library 以及 Dex 类加载这些都会占用不少的内存ROM空间:闪存空间不足,非常容易出现写入放大的情况包体积优化APK分析使用 ApkTool 反编译工具分析 APK;使用AS 2.2之后提供的A
2021-09-01 10:23:26
409
原创 Android Jetpack系列--6. Paging3使用详解
定义Google 推出的一个应用于 Android 平台的分页加载库;Paging3和之前版本相差很多,完全可以当成一个新库去学习之前我们使用ListView和RecyclerView实现分页功能并不难,那么为啥需要paging3呢?它提供了一套非常合理的分页架构,我们只需要按照它提供的架构去编写业务逻辑,就可以轻松实现分页功能;关联知识点:协程、Flow、MVVM、RecyclerView、DiffUtil优点使用内存缓存数据;内置请求去重,更有效率的显示数据;RecyclerVi
2021-09-01 10:11:50
776
1
原创 Android高手笔记 - 耗电优化
耗电的背景知识电池技术:电池容量,充电时间,寿命,安全性;电量和硬件:应用程序不会直接去消耗电池,而是通过使用硬件模块消耗相应的电能;CPU、屏幕、WiFi 和数据网络、GPS 以及音视频通话都是我们日常的耗电大户。电量和应用程序:电能 = 电压 * 电流 * 时间,手机电压一般不会改变,所以模块电量(mAh) = 模块电流(mA) * 模块耗时(h);模块电流应该怎样去获取呢?Android 系统要求不同的厂商必须在 /frameworks/base/core/res/res/xml/powe
2021-08-31 09:15:11
710
原创 Android Jetpack系列--5. App Startup使用详解
定义一个可以用于加速App启动速度的库;提供在 App 启动时初始化组件简单、高效的方法,可以使用 App Startup 显示的设置初始化顺序;提供了一个 ContentProvider 来运行所有依赖项的初始化,避免每个第三方库单独使用 ContentProvider 进行初始化,从而提高了应用的程序的启动速度;解决了什么问题如果你在项目当中引入了非常多的第三方库,那么Application中的代码就可能会变成这个样子(这还只是我们实际项目的部分代码):class MyApplica
2021-08-31 09:09:14
289
原创 Android高手笔记 - 网络优化
很难找到一款完全不需要网络的应用,即使是单机应用,也会存在数据上报、广告等各种各样的网络请求网络基础Http & Https定义:https:Hypertext Transfer Protocol over Secure Socket Layer 超文本传输协议的安全套接字层http:一种详细规定了浏览器和万维网服务器之间互相通信的规则区别:https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。http是超文本传输协议,信息是明文传输,https则是具有安全.
2021-08-30 09:25:24
734
原创 Android Jetpack系列--4.DataBinding使用详解
定义即数据绑定,使数据对象和xml布局绑定,支持双向绑定,是Android团队实现MVVM架构的一种方法;优点省去大量模板代码:findViewById,onClickListener,setText等;使view与逻辑解耦,不用向MVC那样混乱,也不用向MVP那样定义大量接口;view与数据对象双向绑定,开发时只需关注数据对象,无需关系view的各种操作;xml中可以完成简单逻辑(尽量不要在xml中实现逻辑);简单使用开启DataBinding支持,在module的build.g
2021-08-30 09:06:01
310
原创 Android高手笔记 - 存储优化
存储基础存储分区:定义:将设备中的存储划分为一些互不重叠的部分,每个部分都可以单独格式化,用作不同的目的;不同的分区可以使用不同的文件系统;分类/system:操作系统预留,用来存储系统文件和框架;存放Google提供的Android组件以只读方式 mount,稳定,安全,内容不会收到破坏或篡改;/data:存储用户数据目的是为了实现数据隔离,如系统升级和恢复时会擦除/system分区而不影响/data分区,恢复出厂设置则只会擦除/data分区数据;/cache:
2021-08-27 15:51:10
290
原创 Android Jetpack系列--3.ViewModel使用及源码解析
ViewModelLiveData和ViewModel是一对好搭档定义视图模型,以感知生命周期的形式来存储和管理视图相关的数据,让数据可在发生屏幕旋转等配置更改后继续留存;特点页面数据丢失(转屏、闪退等生命周期重建现象),可以使用onSaveInstanceState()保存数据,单仅适用于数据量少(IPC对Bundle有1M的限制),且需要支持序列化,而ViewModel对数据量和序列化均没有要求(ViewModel生命周期长于Activity);有效的将逻辑代码和视图控制器分开,防
2021-08-27 15:49:10
222
原创 Android Jetpack系列--2.LiveData使用及源码解析
LiveData定义一种可观察的数据存储器类,直译为实时数据(是一个数据持有者,给源数据包装一层,源数据使用LiveData包装后,可以被observer观察,数据有更新时observer可感知);具有生命周期感知能力,可确保 LiveData 仅更新处于活跃生命周期状态(STARTED、RESUMED)的应用组件观察者(observer);特点确保界面符合数据状态:当生命周期状态变化时,LiveData通知Observer,可以在observer中更新界面。观察者可以在生命周期状态更改时
2021-08-26 14:43:23
138
原创 Android高手笔记 - IO优化
IO 优化不就是不在主线程读写大文件吗,真的只有这么简单吗?IO 基础IO流程:应用程序 发送逻辑IO命令给文件系统,文件系统发送物理IO命令给存储设备/磁盘文件系统文件读(read)过程:应用程序调用read() 方法,系统会通过中断从用户空间进入内核处理流程,然后经过 VFS、具体文件系统、页缓存,如果数据没有在页缓存中,就需要真正向磁盘发起I/O请求文件系统:存储和组织数据的方式,如iOS的HFS+,APFS(Apple File System,iOS 10.3+), Androi.
2021-08-26 14:36:47
828
原创 Android Jetpack系列--1.Lifecycle使用及源码解析
Jetpack简介定义Jetpack 是一个由多个库组成的套件;主要包括架构(Architecture)、基础(Foundation)、行为(Behavior) 、界面(UI)四个方面;特点提高开发效率和应用质量,具有向后兼容性,可以减少崩溃和内存泄露,让开发者可以更专心于写真正重要的代码;消除样板代码,管理各种繁琐的 Activity(如后台任务、导航和生命周期管理);AACJetpack的精华主要是Architecture,全称是Android Architecture Com
2021-08-25 10:49:11
402
原创 Android高手笔记 - 启动优化
启动, 打开APP的必经之路, 第一体验,关系到用户留存和转化率等核心数据;启动分析启动类型Android Vitals可以对应用冷,热,温启动时间做监控。 通过adb shell am start -W ... 命令执行启动并打印启动耗时信息,下面的启动监控中会详细讲解1. 冷启动应用从头开始启动,系统进程在冷启动后才创建应用进程 启动流程:Click Event -> IPC -> Process.start -> ActivityThread -> bi..
2021-08-25 10:35:20
799
原创 Android高手笔记 - 卡顿优化
Android高手笔记 - 卡顿优化如何定义发生了卡顿现象:如果App的FPS平均值小于30,最小值小于24,即表明应用发生了卡顿。线下很难复现,与发生场景强相关(所以需要我们去做卡顿监控,收集现场信息)CPU相关知识现在最新的主流机型都使用了多级能效的CPU架构(即多核分层架构) 从 CPU 到 GPU 再到 AI 芯片NPU,随着手机 CPU 整体性能的飞跃, 我们可以充分利用移动端的计算能力来降低高昂的服务器成本; 评价一个 CPU 的性能,需要看主频、核心数、缓存等参数,具体
2021-08-17 10:13:40
726
原创 初识Harmony鸿蒙 - 1.搭建开发环境
软件安装下载和安装Node.js登录Node.js官方网站,下载Node.js软件包。请选择LTS版本,Windows 64位对应的软件包 https://nodejs.org/en/download/ 点击下载后的软件包进行安装, 一路Next,直至Finish;安装过程中,Node.js会自动在系统的path环境变量中配置node.exe的目录路径。 安装成功后,打开命令行工具,输入node -v命令可以检查版本号信息;下载和安装DevEco Studio进入HUAWEI Dev
2021-08-16 16:51:11
451
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人