- 博客(59)
- 资源 (5)
- 收藏
- 关注
原创 Gradle使用记录
初始化阶段(Initialization):在这个阶段,Gradle 会确定哪一个项目会参与构建过程,并创建相应的 Project 实例。配置阶段(Configuration):在这个阶段,Gradle 脚本会被执行,用于配置每个项目中的所有任务。在此阶段,所有声明的变量和任务都会被解析并配置。执行阶段(Execution):在这个阶段,Gradle 会根据依赖关系图来运行所有需要执行的任务。只有在这个阶段,任务才会真正被执行。
2024-05-15 15:16:35
352
原创 Android绘制的Window和View
installDecor方法最终创建DecorView。在测量Layout绘制之前需要有哪些准备工作。Window和View是什么关系。addView什么时候能获取宽高。DecorView什么时候创建的。View什么时候能获取准确宽高。View树什么时候建立好的。
2023-10-27 16:51:48
166
原创 Android启动优化
Android启动优化启动分类冷启动热启动启动监控生命周期监控首屏渲染监控用户可交互监控启动报表50分位,90分位图分段图,1s到2s,2s到3s不同Android版本,不同设备,不同app版本启动时间启动优化懒加载线程池加载任务,减少线程创建,减少GC图片OSS裁剪后下载任务有向无环图并行加载使用合理数据结构,防止频繁GC细颗粒化处理初始化代码,只保留必要的部分
2023-08-28 18:08:02
389
原创 Hybird开发,webview和H5交互
封装一个统一的接口,供H5页面调用原生的功能,比如获取设备信息、打开相机、分享内容等。这样,H5页面只需调用这个接口,而无需关心具体的原生实现细节。
2023-07-18 16:56:40
2342
原创 Android设计模式应用举例
设计模式是在软件工程中广泛使用的解决特定问题的经过实践验证的最佳实践方法。下面是一些主流的设计模式:创建型模式:创建型模式涉及处理对象创建机制,旨在帮助在创建对象时提供更好的灵活性和复用性。这些模式包括:工厂模式、抽象工厂模式、单例模式、建造者模式和原型模式。结构型模式:结构型模式涉及处理对象之间的关系,以便更好地协作。这些模式包括:适配器模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式和代理模式。行为型模式:行为型模式涉及处理对象之间的通信方式,以便更好地协作。
2023-04-13 11:13:40
1231
原创 Java VS kotlin 泛型
Java语言中的泛型则不一样,它只在程序源码中存在,在编译后的字节码文件中,就已经替换为原来的原生类型(Raw Type,也称为裸类型)了,并且在相应的地方插入了强制转型代码,因此,对于运行期的Java语言来说,ArrayList<int>与ArrayList<String>就是同一个类,所以泛型技术实际上是Java语言的一颗语法糖,Java语言中的泛型实现方法称为类型擦除,基于这种方法实现的泛型称为伪泛型。获取泛型type通过匿名内部类获取父类的元数据定义,来获取type,获取泛型的具体类型。协变逆
2022-07-06 11:55:18
602
原创 android 架构搭建
android 官方推荐案例:https://github.com/android/sunflower参考:https://www.jianshu.com/p/4ad7aa0fc356https://github.com/huannan/XArch
2022-05-02 17:05:15
408
原创 Kotlin语法
kotlin语法lamda表达式原理kotlin委托机制https://juejin.cn/post/6958346113552220173#heading-13函数对象// 函数对象fun b(i: Int): String { return "100" + i}fun useFun(fun1: (Int) -> String, s: String) { System.out.println(fun1(1))}useFun(::b, "ss") // ::函数对象
2022-04-19 16:01:43
2242
原创 Android APT
APT流程在javac编译时,先通过SPI机制加载所有的APT实现类java源文件中所有的注解信息与APT声明的支持处理的注解信息进行匹配,若匹配,则调起APT实现类的process方法。在process方法中读取被注解代码的信息,在添加处理逻辑,生成java文件。在运行时调用编译生成的java对象。ButterKnife原理也是基于APT,在process方法中读取被注解的View对象,读取Res Id,在生成的Java文件中根据读取的view和id依次调用findViewById。//使
2022-04-13 20:13:02
1583
原创 Android 开发技术趋势
架构趋势MVC -> MVP -> MVVM -> MVI。虽然RN已经穷途末路了,但是React 单项数据流,UI state数据去驱动UI更新的设计思想还是潮流啊,Android Compose的MVI架构就往这个思路上走的。
2022-04-09 20:24:37
2422
原创 Glide源码分析
线程池build Glide的时候构建了三个线程池(核心线程和最大线程数是固定的,阻塞队列是PriorityBlockingQueue),sourceExecutor核心数是计算的,diskCacheExecutor的核心数是1,// GlideBuilder.java@NonNull Glide build(@NonNull Context context) { if (sourceExecutor == null) { sourceExecutor = GlideExecu
2022-04-08 20:00:14
1102
原创 OkHttp源码解析
阅读源码目标了解底层原理,有助于使用API,排查问题学习设计模式学习系统架构面试功能及原理功能同步请求异步请求WebSocket自定义拦截器处理缓存,重定向,请求体管理Bridge,链接管理核心流程RealCall 保存了拦截器List// RealCall.kt @Throws(IOException::class) internal fun getResponseWithInterceptorChain(): Response { val intercep
2022-04-06 20:44:53
2255
原创 Java 异常
教程https://www.runoob.com/java/java-exceptions.html类型定义检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
2022-04-05 19:52:36
101
原创 Android开发中的JAVA类型
SpaseArray两个数组,分别存储Key和Value。Key是有序的,必须是intput 是根据key二分查找后找到合适位置插入,根据计算好的位置,也就是数组下标,对Key和Value的数组进行同步操作。get 是根据Key二分查找后根据数组下标去Value数组中取值。ArrayMap类似SpaseArray,Key可以是任何对象,一个数组存储Key的HashCode,一个顺序存储Key+ValueTreeMapKey是自然排序的Map,可以自定义排序比较方法,或者根据数字大小的自然顺
2022-04-04 21:14:41
1420
原创 Synchronized原理
锁升级偏向锁对象MarkWord中存储了持有锁的线程ID。轻量级锁(自旋锁)设计目的场景:两个线程交替获取锁来执行。重量级锁自旋获取锁失败升级为重量级锁。流程线程A获取偏向锁,在MarkWord中设置标记为偏向锁,设置ThreadID为自己。线程B通过CAS竞争锁,如果A不再使用锁,则设置ThreadID为B。如果A还在使用锁,挂起A,锁升级成轻量级锁(标记位改变,对象指针指向线程栈帧中锁记录),A继续同步执行,B通过自旋尝试获取锁。线程B如果获取到了锁,会继续保持轻量级锁,并且把
2022-04-02 15:27:01
281
原创 Choreographer原理
Choreographer整体处理流程Choreographer构造并接受Vsync信号更新UI的流程(UIThread)通知更新UI涉及到同步屏障:void scheduleTraversals() { if (!mTraversalScheduled) { mTraversalScheduled = true; //为了提高优先级,先 postSyncBarrier mTraversalBarrier = mHandler.getLoop
2022-04-01 18:03:39
1251
转载 Android AIDL
1. AIDL概念2. AIDL使用2.1 大致流程2.2 案例2.2.1 定义aidl接口2.2.2 服务端实现接口2.2.3 客户端与服务端进行通信2.3 in,out,inout关键字2.4 oneway 关键字2.5 线程安全2.6 aidl 监听器(观察者? 双向通信?)2.7 Binder 死亡通知2.8 权限验证3. 原理3.1 AIDL是怎么工作的?3.2 详细解读 资料文中示例代码均可在demo中找到1. AIDL概念Andr.
2022-03-25 19:54:30
798
原创 开发问题记录
考虑一个异步回调问题问题描述:启动或者初始化一个服务在一个线程,访问这个服务有很多个对象,并且可能在服务未初始化之前就开始访问,需要服务支持这种异步的访问。比如MagicServiceManager,在启动服务前就有人调用了服务的方法,需要把调用者的回调先保存起来,启动服务后在一一执行服务逻辑最后执行回调列表中的回调。...
2022-03-25 19:49:21
478
原创 Android Java基础面试题
Android Java基础ClassLoad双亲委派模式的原因防止自定义类加载器优先加载了顶层公用的类,比如Object类,这样系统中就存在多个形同的类。Java内存区域堆,函数栈(多个栈帧(返回地址,操作数栈,局部变量表,动态链接)),程序计数器,本地方法栈,方法区(常量,类,静态对象)...
2022-03-25 19:41:43
3288
原创 JetPack思考
JetPack思考LifeCycle实现基础原理:遍历注解再反射实现机制:ComponentActivity实现LifecycleOwner 接口,利用ReportFragment来处理生命周期分发State事件事件状态处理类存储FastSafeIterableMap<LifecycleObserver, ObserverWithState> mObserverMap,及观察者+观察者当前状态的map如何同步状态分发状态更新的回调?a.添加观察者的时候,判断当前观察者状态和当前的
2022-03-20 17:38:15
2294
原创 Gradle插件开发
中文文档:https://chaosleong.gitbooks.io/gradle-for-android/content/introduction/
2021-12-24 15:24:46
1737
原创 Android 设备唯一标识
Android 设备唯一标识:设备信息IMEIIMSIMEIDAndroid IDSim卡序列号Serial Numberadb shell getprop ro.serialnoMAC地址
2021-11-17 17:37:44
3965
原创 Android签名证书
Android签名概述我们已经知道的是:Android对每一个Apk文件都会进行签名,在Apk文件安装时,系统会对其签名信息进行比对,判断程序的完整性,从而决定该Apk文件是否可以安装,在一定程度上达到安全的目的。给定一个Apk文件,解压,可以看到一个META-INFO文件夹,在该文件夹下有三个文件:分别为MANIFEST.MF、CERT.SF和CERT.RSA。这三个文件分别表征以下含义:MANIFEST.MF:这是摘要文件。程序遍历Apk包中的所有文件(entry),对非文件夹非签名文件的文件,
2021-09-29 14:05:54
1379
原创 优化-ANR
ANR提问什么是 ANR?系统是如何设计 ANR 的?发生 ANR 时系统都会获取哪些信息以及工作流程?导致 ANR 的原因有哪些?遇到这类问题该如何分析?如何能更加快速准确的定位问题?面对这类问题我们能主动做些什么?ANR思考ANR是系统对Activity,Service,Input,BroadCastReceiver等组件的超时监控,对超时抛出异常。系统有很多服务启动监控,在超时时间内完成任务会关闭监控,没完成则触发超时报警。ANR时,系统会捕获当前运行线程的堆栈信息,执行的
2021-03-26 11:53:12
189
原创 Android,启动,生命周期,binder,事件分发,绘制,activity-window-view
启动模式singleTasksingleInstancesingleTopstandard生命周期onCreateonStart 可见不可交互onResume 可见可交互onPause 持久化操作onStoponRestartonDestoryonSaveInstanceState 执行时机,系统行为杀死APP的时候会调用,给APP一个保存状态的时机,用户主动杀死时候不会调用。对比:onSaveInstanceState 只适合用于保存一些临时性的状态,而onPause()适合
2021-03-25 14:40:30
221
1
原创 听歌小记
《旅途》…我们路过高山我们路过湖泊我们路过森林路过沙漠路过人们的城堡和花园路过幸福我们路过痛苦路过一个女人的温暖和眼泪路过生命中漫无止境的寒冷和孤独
2021-03-25 11:46:59
78
原创 java多线程编程
java 多线程编程目的都是让不同线程,不同任务安装预计同步顺序执行。Join作用,用法作用是在A线程执行过程中加入B线程的任务执行,A线程阻塞直到B线程结束。也就是A上半部分内容,B插入执行,A下半部分内容,有序同步执行。wait notify1.必须用sychronized2.目的也是控制两个线程有序执行。用同步锁控制进入同步代码块,A线程执行,A线程wait,等待B线程完成任务,唤醒锁对象notify。 public class Demo { final static
2021-03-23 21:46:33
88
原创 Android Q适配
一、Android Q 隐私权变更:分区存储Android Q在外部存储设备中,为每个应用提供了一个隔离分区(也叫隔离存储沙盒),简单而言就是应用专属文件夹,并且访问这个文件夹无需权限。谷歌官方推荐应用在沙盒内存储文件的地址为Context.getExternalFilesDir()下的文件夹。比如要存储一张图片,则应放在Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)中。所以在Android Q中,所有的外部存储都应该存到沙盒隔
2021-03-22 22:11:52
183
原创 Java泛型、注解、线程池、同步操作
Java基础-泛型泛型是解决什么问题的?泛型是提供代码架构设计的抽象,设计类或者函数的时候,不指定具体类型,用泛型替代。泛型类:public class Generic<T>{ //key这个成员变量的类型为T,T的类型由外部指定 private T key; public Generic(T key) { //泛型构造方法形参key的类型也为T,T的类型由外部指定 this.key = key; } public T get
2021-03-22 22:04:07
170
原创 Java 内存模型、垃圾回收、面向对象编程
Java 内存模型1.建立内存模型是为了解决什么问题?1.目的是解决 java虚拟机和操作系统之间协同工作的。这个模型可以处理java代码运行需要的内存环境如何映射到操作系统的cpu,内存,高速缓存,cpu寄存器。2.解决多线程代码如何同步执行,保证多线程读同步,写同步,原子性,可见性。有工作内存,主内存的概念,但不是实际存在,同步就是不同线程在工作内存中操作了共享变量,同步到主内存后才可以让另外一个线程继续读主内存中那个共享变量。了解内存模型对开发有什么帮助?1.有助于理解多线程编程中对锁相关概
2021-03-17 10:29:13
146
1
原创 Rxjava 详解
Rxjava详解Rxjava文章很多了,自学所用。如下链接解析的很好,本文写一下小demo实战。http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/1012/3572.html#toc_1基本概念:异步库,序列式编写,可线程控制 "a library for composing asynchronous and
2017-01-20 10:08:52
348
Pyramid已配置好环境
2016-03-18
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人