- 博客(71)
- 收藏
- 关注
原创 安卓入门六十九 Framework-PMS
当用户安装应用程序的时候,Android PMS会负责将APK包解析成对应的Java对象,并将相关信息存储到系统目录下的data/data/packageManager.xml文件中,同时将APK包保存到系统目录下的data/app文件夹中。当用户卸载应用程序的时候,Android PMS会负责将系统目录下的data/data/packageManager.xml文件中对应该应用程序的信息删除,并将data/app文件夹下的该应用程序的APK包删除,同时删除该应用程序的数据和缓存。
2025-02-27 10:30:00
605
原创 安卓入门六十八 Framework-AMS
SystemServer->run()->startBootstrapServices()->setSystemServiceManager()、setInstaller()、initPowerManagement()、setSystemProcess():AMS创建后进行了一系列相关的初始化和设置。SystemServer->run()->startOtherServices():AMS启动后的后续工作,主要调用systemReady()和运行调用时传入的goingCallback。
2025-02-26 14:45:00
566
原创 安卓入门六十七 Gradle核心
与初始化阶段相关的脚本文件是 settings.gradle,而一个 settings.gradle 脚本对应一个 Settings 对象,我们最常用来声明项目的层次结构的 include 就是 Settings 对象下的一个方法,在 Gradle 初始化的时候会构造一个 Settings 实例对象,以执行各个 Project 的初始化配置。接着,在注释2处,在 JsonChao task 闭包内输出了 hello~,这里的代码将会执行在 gradle 生命周期的第二个阶段,即配置阶段。
2025-02-26 09:45:00
1009
原创 安卓入门六十六 Gradle-Groovy
此外,在 GString 中新增了一系列的操作符,这能够让我们对 String 类型的变量有 更便捷的操作。但是,如果你这个类或变量要用于其它模块的,建议不要使用 def,还是应该使用 Java 中的那种强类型定义方式,因为使用强类型的定义方式,它不能动态转换为其它类型,它能够保证外界传递进来的值一定是正确的。可以看到,如果我们直接在类、方法、变量中定义一个闭包,那么这三种关键变量的值都是一样的,但是,如果我们在闭包中又嵌套了一个闭包,那么,this 与 owner、delegate 的值就不再一样了。
2025-02-25 14:45:00
691
1
原创 安卓入门六十五 开发框架-Gradle核心配置类
需要注意的是,要注意我们当前项目的实际最低版本,比如它为 18,现在我们开启了 speedDebug,项目编写时就会以 21 为标准,此时,就 需要注意 18 ~ 21 之间的 API,例如我在布局中使用了 21 版本新出的 Material Design 的控件,此时就是没问题的,但实际我们需要对 21 版本以下的对应布局做相应的适配。AspectJ扩展了Java语言,引入了一套新的注解和语法,用于描述切面和切点,并提供了一套工具和API,用于编译、织入和运行AspectJ代码。
2025-02-25 09:45:00
1004
原创 安卓入门六十四 APK瘦身
应用安装包大小对应用使用没有影响,但应用的安装包越大,用户下载的门槛越高,特别是在移动网络情况下,用户在下载应用时,对安装包大小的要求更高,因此,减小安装包大小可以让更多用户愿意下载和体验产品。插件化,比如功能模块放在服务器上,按需下载,可以减少安装包大小。
2025-02-24 15:30:00
231
原创 安卓入门六十三 稳定性与流畅性
稳定性就是减少crash流畅性就是优化gpu与cpu使用GPU优化通过上述内存优化检查GPU消耗对代码进行优化CPU优化如何从 CPU 层面进行速度优化?我们知道,所有的程序最终会被编译成机器码指令,然后交给 CPU 执行,CPU 以流水线的形式一条一条执行程序的机器码指令。当我们想要提升某些场景(如启动、打开页面、滑动等)的速度时,本质上就是降低 CPU 执行完这些场景指令的时间,这个时间简称为 CPU 时间。想要降低 CPU 时间,我们需要先知道程序所消耗 CPU 时间的计算公式:CPU 时间=程序的指
2025-02-24 09:45:00
565
原创 安卓入门六十二 电量优化
BatteryStatsService 框架的核心是 BatteryStatsService 持有的一个叫 BatteryStats 的类,BatteryStats 又持有一个 Uid [] 数组,每一个 Uid 实例实际上对应一个 APP,当高功耗任务安装或者卸载 APP 的时候,BatteryStats 就会更新相应的 Uid 元素以保持最新的映射关系。这样可以降低设备的能耗并延长电池寿命。在上面的代码中,我们创建了一个ClassVisitor的子类,该子类用于访问类中的方法,并在必要时修改字节码。
2025-02-19 15:30:00
1607
1
原创 安卓入门六十一 内存优化
通过点击Android Studio右下角的Memory Monitor标签,打开工具可以看见较浅蓝色代表free的内存,而深色的部分代表使用的内存从内存变换的走势图变换,可以判断关于内存的使用状态,例如当内存持续增高时,可能发生内存泄漏;MAT 是一个快速,功能丰富的 Java Heap 分析工具,通过分析 Java 进程的内存快照 HPROF 分析,从众多的对象中分析,快速计算出在内存中对象占用的大小,查看哪些对象不能被垃圾收集器回收,并可以通过视图直观地查看可能造成这种结果的对象。
2025-02-19 09:30:00
597
原创 安卓入门六十 内存优化
与以前的 Android Monitor 工具中的内存计数相比,新的内存分析器以不同的方式记录您的内存,因此,您的内存使用量现在看上去可能会更高些。但是,如果您的应用分配内存的速度比系统回收内存的速度快,当回收器要释放足够的内存以满足您的分配需要时,您的应用可能会产生延迟。但是,Android 8.0 及更高版本附带一个设备内置性能剖析工具,该工具可跟踪所有分配,因此,在 Android 8.0 及更高版本上,此数字始终表示您的应用中待处理的 Java 对象总数。当您退出分析会话时,会丢失堆转储。
2025-02-18 14:30:00
726
原创 安卓入门五十九 布局优化
随着绘制一帧所需的像素数的增加,GPU 可能需要更长的时间来处理新命令,并要求系统的其余任务等待,直到它跟上进度。因此,此图可显示您的应用可能在何处执行不必要的渲染工作,这可能是 GPU 多此一举地渲染用户不可见的像素所导致的性能问题。Hierarchy Viewer 可测量每个节点相对于同级视图的性能,因此分析结果中总是有红色节点(除非所有视图以完全相同的方式执行),并且这并不一定意味着红色节点就是表现不佳(只不过它是本地视图组中最慢的视图而已)。视图层次结构是布局的快照,因此它不会自动更新。
2025-02-18 09:30:00
820
原创 安卓入门五十八 网络优化
大家需要注意,使用 CDN 后,如果某个资源需要更新,更新完成后是需要清理缓存的,这些优化不涉及客户端,同时也不要忘了减少传输量,注意请求的时机和频率,这一条和我们前面讲到的流量优化相关。例如,针对网络情况,返回不同的图片数据,一种是高清大图,一种是正常图片,一种是缩略小图。请求头也占用一定的体积,在请求头不变的情况下,我们可以只传递一次,以后都只需要传递上一次请求头的 MD5 值,服务端做一个缓存,在需要请求头中的某些信息时,就可以直接从之前的缓存中取。
2025-02-17 15:00:00
968
4
原创 安卓入门五十七 应用卡顿解决
但是问题来了,这两个Activity的逻辑十分复杂,代码也不是我写的,相关联的代码量也十分庞大,更加郁闷的是很难判断是哪个版本修改导致的,这时候只知道有泄露,却无法定位具体原因,使用MAT分析解决掉了一个可疑泄露后发现泄露又变成了概率性的。右侧剧中显示选中View的当前属性状态;可以看见,所谓的我们的Service在后台跑着跑着挂了,或者盒子上有些大型游戏启动起来就挂(之前我在上家公司做盒子时遇见过),有一个直接的原因就是这个阈值定义的太大,导致系统一直认为已经达到阈值,所以进行优先清除了符合类型的进程。
2025-02-17 09:30:00
1793
原创 安卓入门五十六 性能优化
从软件角度出发,其实就是我们开发的应用软件,操作系统除了计算资源和内存资源的管理,其他都是通过IO来管理,那么软件的本质其实就是IO,进和出,没错,举几个例子:如我们的软件在系统中是一个个的进程,创建/销毁,在进程中有一个个的线程,创建/销毁,在线程中有一个个的对象,创建/销毁,在一个对象中有一个个方法,创建/销毁,在方法中有一个个成员变量和局部变量,创建/销毁。但其实我想告诉你,性能优化最终其实就一件事,基于 Linux对Android的运行时优化,这就是我们找到的最基础的底层逻辑。
2025-02-12 14:00:00
659
原创 安卓入门五十五 开门狗机制
类似于现实生活中的看门狗,如果应用程序或系统在一定时间内没有发送心跳信号或响应特定事件,开门狗机制会触发并采取相应的操作,例如重启应用程序或系统,以恢复正常运行。结合 Android 相关源码分析可知,输入事件的 ANR 检测是基于输入事件本身驱动的,系统要求在 App进程中处理完成每个输入事件后,通知系统进程事件处理完毕,以此判断 App是否无响应。开门狗机制在Android系统中用于监控系统或应用程序的异常情况,并触发相应的处理动作,以确保系统的稳定性。注意:要产生 ANR,至少得有两个输入事件。
2025-02-12 09:00:00
222
原创 安卓入门五十四 ANR
综上,创建 Service 触发 ANR的原理就是:在创建 Service 的时候,也就是调用 Service 的 onCreate 方法前会发送一个延时消息(如果是前台服务,延时时间就是 SERVICE_TIMEOUT(值20*1000豪秒),否则延时时间是SERVICE_BACKGROUND_TIMEOUT(10 * SERVICE_TIMEOUT豪秒))。否则就会执行这个延时消息,并触发 ANR。此方法中Service逻辑处理完成则移除之前延时的消息SERVICE_TIMEOUT_MSG。
2025-02-11 14:00:00
828
原创 安卓入门五十三 ANR
app端收到system server的binder回调scheduleServiceArgs后,发送消息到主线程的Handler,等到相关消息被执行,Service的onStartCommand方法执行完后,通过binder serviceDoneExecuting告知system server执行完毕,移除MainHandler中相关的delay消息。具体逻辑处理都在system server端,包括发送超时消息,移除超时消息,处理超时消息以及ANR弹框展示等;
2025-02-11 09:00:00
740
原创 安卓入门五十二 Native Crash
此外,可以使用一些工具来帮助诊断和调试 Native Crash,例如使用 Android SDK 提供的 ndk-stack 工具来解析堆栈,使用 Clang 或 GCC 编译器提供的 Address Sanitizer、Memory Sanitizer 等工具帮助检测内存错误等。Native Crash 是指由于 JNI 代码(Java Native Interface)与底层 C/C++ 代码交互时出现错误导致的崩溃。在读写文件时,要注意数据格式的正确性,确保数据的有效性。
2025-02-10 14:15:00
125
原创 安卓入门五十一 Java crash
指标Java crash、Native crash、Anr < 0.05%crash一直是影响app稳定性的大头,同时在随着项目逐渐迭代,复杂性越来越提高的同时,由于主观或者客观的的原因,都会造成意想不到的crash出现。同样的,在android的历史化过程中,就算是android系统本身,在迭代中也会存在着隐含的crash。我们常说的crash包括java层(虚拟机层)crash与native层crash。Java崩溃:Java崩溃通常是由于未捕获的异常或错误引发的。
2025-02-10 09:00:00
986
原创 安卓入门五十 View布局过程
如:底部导航条中的条目,一般都是上图标(ImageView)、下文字(TextView),那么这两个就可以用自定义ViewGroup组合成为一个Veiw,提供两个属性分别用来设置文字和图片,使用起来会更加方便。由于 步骤2:drawBackground()、步骤3:onDraw()、步骤5:onDrawForeground(),与单一View的draw过程类似,此处不作过多描述。下面我将对每个步骤和方法进行详细分析:draw过程的入口 = draw()至此,单一View的draw过程已分析完毕。
2025-02-08 14:30:00
716
1
原创 安卓入门四十九 View布局过程
如:底部导航条中的条目,一般都是上图标(ImageView)、下文字(TextView),那么这两个就可以用自定义ViewGroup组合成为一个Veiw,提供两个属性分别用来设置文字和图片,使用起来会更加方便。此处需复写ViewGroup的onLayout(),其具体实现逻辑是指:计算子View的位置,即计算四顶点位置 = 计算Left、Top、Right和Bottom。在非人为设置的情况下,View的最终宽/高(getWidth() / getHeight())那么,“非一般”情况是什么?
2025-02-08 09:00:00
1268
原创 安卓入门四十八 Measure
原因是:onMeasure()方法的作用是测量View的宽/高值,而不同的ViewGroup(如LinearLayout、RelativeLayout、自定义ViewGroup子类等)具备不同的布局特性,这导致它们的子View测量方法各有不同,所以onMeasure()的实现也会有所不同。上面提到,当测试规格的模式(mode)是UNSPECIFIED时,使用的是提供的默认大小(即getDefaultSize()的第一个参数size)。因此,ViewGroup无法对onMeasure()作统一实现。
2025-02-07 15:00:00
887
原创 安卓入门四十七 DecorView创建
ViewRootImpl对象中接收的各种变化(如来自WmS的窗口属性变化、来自控件树的尺寸变化、重绘请求等都引发performTraversals()的调用及完成相关处理,并最终显示到可见的Activity中。此时,DecorView(即顶层View)已创建和添加Activity中设置的布局文件中,但目前仍未显示出来,即不可见。DecorView是显示的顶层View,那么View的绘制准备从DecorView创建开始说起。DecorView的创建开始是从大家最熟悉的setContentView()开始。
2025-02-07 09:00:00
261
原创 安卓入门四十六 View工作流程
从上面的performTraversals()可知:View的绘制流程从顶级View(DecorView)的ViewGroup开始,一层一层从ViewGroup至子View遍历测绘。在Activity中通过 setContentView()所设置的布局文件其实是被加到内容栏之中的,成为其唯一子View = id为content的FrameLayout中。即:自上而下遍历、由父视图到子视图、每一个 ViewGroup 负责测绘它所有的子视图,而最底层的 View 会负责测绘自身。计算视图(View)的位置。
2025-02-06 16:00:00
550
原创 安卓入门四十五 渲染原理
由于所有的绘制内容都没有变成最终的像素,所以它们之间是相互独立的,那么在界面内容发生改变的时候,只要把发生了改变的 View 调用 invalidate() 方法以更新它所对应的 GPU 操作就好,至于它的父 View 和兄弟 View,只需要保持原样。另外,由于设置了 View Layer 后,View 在初次绘制时以及每次 invalidate() 后重绘时,需要进行两次的绘制工作(一次绘制到 Layer,一次从 Layer 绘制到显示屏),所以其实它的每次绘制的效率是被降低了的。这就是「硬件加速」。
2025-02-06 09:00:00
1742
原创 安卓入门四十四 其他动画
Lottie 是 Airbnb推出的一套跨平台的动画完整解决方案,它能够帮助开发者直接加载json格式的文件在 iOS、Android 和 React Native之上,实现 100% 与设计稿相同的动画效果,而无需关心中间的实现细节。跨平台的即时通信软件Telegram推出的新的Sticker贴纸格式,这个全新的 Sticker 贴纸格式为 .tgs,其实就是基于Lottie json文件改造而来的一种格式。
2025-01-28 15:00:00
243
原创 安卓入门四十三 转场动画
这些动画虽然牛皮,但是记得5.0以上才生效的哦,同时我们也不能看着什么动画炫酷都想上,转场动画也是在主线程执行的,如果定义不当也会造成卡顿的。5.0之后在MD中还有其他的动画,比如揭露动画,不知道算不算转场动画的一种。因为一般也是用于转场的时候使用,但是这个动画我们使用的很少很少。Google在Android 5.0之后推出的一种动画效果,就是以某种方式从一个场景以动画的形式过渡到另一个场景,可以参考。,常用于点击列表页中的图片跳转到大图或由列表页跳转到详情页。
2025-01-28 09:00:00
200
原创 安卓入门四十二 过渡动画
那边是一个button 共享名字叫“share” 那边是拿到的view 不是button 转过来定义的是view。在Java文件中同样可以通过 overridePendingTransition 来实现。3种转场动画 ,1种共享元素。那边共享的是button 共享名字叫tab 共享过来也定义的button。同样可以在xml中定义 ,也可以使用java代码控制。对应的Activity实现指定的样式即可实现。4.1 Android5.0以前的过渡动画。4.2 Android5.0以后的过渡动画。
2025-01-27 15:00:00
444
原创 安卓入门四十一 属性动画
工作原理:在一定时间间隔内,通过不断调用set方法对值进行改变,并不断将该值赋给对象的属性,从而实现该对象在该属性上的动画效果。• AnimatorSet.before(Animator anim) :将现有动画插入到传入的动画之前执行。• AnimatorSet.after(Animator anim) :将现有动画插入到传入的动画之后执行。• AnimatorSet.with(Animator anim) :将现有动画和传入的动画同时执行。补充补间动画的一些缺点。直接更改View 的属性来实现的动画。
2025-01-27 09:00:00
376
原创 安卓入门四十 补间动画
无需关注每一帧,只需要定义动画开始与结束两个关键帧,并指定动画变化的时间与方式等。主要有四种基本的效果。一句话说明补间动画:只能给View加,不能给对象加,并且不会改变对象的真实属性。可以在xml中定义,也可以在代码中定义!
2025-01-23 15:30:00
198
原创 安卓入门三十九 逐帧动画
Android3.0之前版本,逐帧动画,补间动画Android3.0之后版本,属性动画Android4.4中,过渡动画Android5.0以上MD的动画效果。过渡动画【TransitionAnimation】,实现Activity或View过渡动画效果。包括5.0之后的MD过渡动画等。补间动画【TweenAnimation】,View的动画效果可以实现简单的平移、缩放、旋转。属性动画【PropertyAnimation】,补间动画增强版,支持对对象执行动画。
2025-01-23 09:30:00
234
原创 安卓入门三十八 手势检测GestureDetector、缩放手势检测ScaleGestureDecetor
onSingleTapConfirmed原理也非常简单,这一个回调函数在单击事件发生后300ms后触发(注意,不是立即触发的),只有在确定不会有后续的事件后,既当前事件肯定是单击事件才触发onSingleTapConfirmed,所以在进行点击操作时,onDoubleTap和onSingleTapConfirmed只会有一个被触发,也就不存在冲突了。这些都是很常用的手势。由于缩放手势检测使用起来非常简单,没有什么复杂的内容,不仅如此,它的实现也非常简单,下面我就带大家简单分析一下它的基本原理。
2025-01-22 14:30:00
1248
原创 安卓入门三十七 特殊控件的事件处理方案
因为所有的View默认都是矩形的,所以事件接收区域也是矩形的,如果直接使用系统提供的View来组合出一摸一样的布局也很简单,但点击区域该如何处理?当我们面对这样比较奇特的控件的时候,有很多处理办法,比较投机的一种就是背景贴一个静态图,按钮做成透明的,设置小一点,放在对应的位置,这样可以保证不会误触,当然了如果想要点击效果可以在按钮按下的时候更新一下背景图,这样虽然也可以,但是这样会导致可点击区域变小,体验效果变差,设计方案变得复杂,而且逻辑也不容易处理,是一种非常糟糕的设计。
2025-01-22 09:45:00
1191
原创 安卓入门三十六 MotionEvent详解
例如:上层View是一个RecyclerView,它收到了一个ACTION_DOWN事件,由于这个可能是点击事件,所以它先传递给对应ItemView,询问ItemView是否需要这个事件,然而接下来又传递过来了一个ACTION_MOVE事件,且移动的方向和RecyclerView的可滑动方向一致,所以RecyclerView判断这个事件是滚动事件,于是要收回事件处理权,这时候对应的ItemView会收到一个ACTION_CANCEL,并且不会再收到后续事件。
2025-01-21 15:30:00
683
原创 安卓入门三十五 事件分发机制详解
安卓为了保证所有的事件都是被一个View消费的,对第一次的事件(ACTION_DOWN)进行了特殊判断,View只有消费了ACTION_DOWN事件,才能接收到后续的事件(可点击控件会默认消费所有事件),并且会将后续所有事件传递过来,不会再传递给其他View,除非上层View进行了拦截。中我们了解到事件是通过ViewGroup一层一层传递的,最终传递给View,ViewGroup要比它的ChildView先拿到事件,并且有权决定是否告诉要告诉ChildView。
2025-01-21 09:00:00
852
原创 安卓入门三十四 事件分发机制原理
这种设计是非常精巧的,上层View既可以直接拦截该事件,自己处理,也可以先询问(分发给)子View,如果子View需要就交给子View处理,如果子View不需要还能继续交给上层View处理。如下图,View是一层一层嵌套的,当手指点击View1的时候,下面的ViewGroupA、RootView等也是能够响应的,为了确定到底应该是哪个View处理这次点击事件,就需要事件分发机制来帮忙。前面我们了解到了我们的View是树形结构的,基于这样的结构,我们的事件可以进行有序的分发。
2025-01-20 15:15:00
826
原创 安卓入门三十三 Matrix Camera
我们的手机屏幕是一个2D的平面,所以也没办法直接显示3D的信息,因此我们看到的所有3D效果都是3D在2D平面的投影而已,而本文中的Camera主要作用就是这个,将3D信息转换为2D平面上的投影,实际上这个类更像是一个操作Matrix的工具类,使用Camera和Matrix可以在不使用OpenGL的情况下制作出简单的3D效果。当View和摄像机在同一条直线上时:此时沿z轴平移相当于缩放的效果,缩放中心为摄像机所在(x,y)坐标,当View接近摄像机时,看起来会变大,远离摄像机时,看起来会变小,近大远小。
2025-01-20 09:00:00
867
原创 安卓入门三十二 Matrix方法详解
不过有一点需要注意,测控点选取都应当是不重复的(src与dst均是如此),如果选取了重复的点会直接导致测量失效,这也意味着,你不允许将一个方形(四个点)映射为三角形(四个点,但其中两个位置重叠),但可以接近于三角形。作为开发人员,写出来的代码出了要让机器”看懂”,没有歧义之外,最重要的还是让人看懂,以方便后期的维护修改,从上边的表格中可以看出,前面的几种种情况都可以有更直观的替代方法,只有四个参数的情况下的特殊形变是没有替代方法的。如果参数为空,则重置当前Matrix,相当于。
2025-01-19 14:00:00
802
原创 安卓入门三十一 Matrix简介
所以就得出了pre先执行,而post后执行这一说法,但从严谨的数学和程序角度来分析,完全是不可能的,还是上面所说的,pre和post不能影响程序执行顺序,而程序每执行一条语句都会得出一个确定的结果,所以,它根本不能控制先后执行,属于完全扯淡型。以下图为例,我们的内容区和屏幕坐标系还相差一个通知栏加一个标题栏的距离,所以两者是不重合的,我们在内容区的坐标系中的内容最终绘制的时候肯定要转换为实际的物理坐标系来绘制,Matrix在此处的作用就是转换这些数值。
2025-01-19 09:30:00
944
原创 安卓入门三十 绘制基础
分类与流程自定义View绘制流程函数调用链(简化版)一.自定义View分类我将自定义View分为了两类(sloop个人分类法,非官方):1.自定义ViewGroup自定义ViewGroup一般是利用现有的组件根据特定的布局方式来组成新的组件,大多继承自ViewGroup或各种Layout,包含有子View。例如:应用底部导航条中的条目,一般都是上面图标(ImageView),下面文字(TextView),那么这两个就可以用自定义ViewGroup组合成为一个Veiw,提供两个属性分别用来设置文字和图片,使用
2025-01-18 18:13:55
907
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人