android
文章平均质量分 77
怪伽先森
在迷茫中执着前行
展开
-
Mac 上配置 ./gradlew环境
背景需要查看 Android studio 中项目里的 app:dependencies, 命令如下:./gradlew :app:dependencies1. Install Gradle Build Tool具体过程参考官方文档:How to Set $JAVA_HOME environment variable on macOSGradle Installation 官方文档对我而言,主要就是:brew install gradle2. gradle 查看包的依赖关系参原创 2021-12-05 08:47:47 · 5241 阅读 · 4 评论 -
Android 内存泄漏检测开源库LeakCanary 研究
1. Android 内存现状Facebook 有一个叫 device-year-class 的开源库,它会用年份来区分设备的性能2. Android 内存空间会引发的问题PSS : Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)PSS相对于RSS计算共享库内存大小是按比例的。N个进程共享,该库对PSS大小的贡献只有1/N。VSS : Virtual Set Size 虚拟耗用内存(包含共享库占用的内存),即单个进程全部可访问的地址空间,其大小原创 2021-09-01 07:29:10 · 5242 阅读 · 0 评论 -
Android View 绘制流程
1. 概述2. 什么是 ViewRootImpl1. 概述简单的可以说,如 measure,layout,draw 分别对应测量,布局,绘制三个过程深一些可以引申出 Handler,同步屏障,View 的事件传递,甚至 activity 的启动过程总体而言,Android 的绘制基本可以分为顶级 View 的绘制Viewgroup 的绘制View 的绘制三个方面顶级 View 就是 ViewrootImpl现在从以下问题开始来了解 Android View 的绘制流程2..转载 2021-07-05 21:08:19 · 5530 阅读 · 0 评论 -
Tencent/matrix错误:Cause: need sign apk but apksigner *\Sdk/build-tools/*/apksigner was not exist
apkCheckerPath = "${project.configurations.apkCheckerDependency.resolve().find { it.name.startsWith("matrix-apk-canary") }.getAbsolutePath()}"sevenZipPath = "${project.configurations.sevenZipDependency.resolve().getAt(0).getAbsolutePath()}"//Notice: You原创 2021-06-30 20:46:21 · 5014 阅读 · 2 评论 -
探究 Android MVC、MVP、MVVM 的区别以及优缺点
面试题:说一下对 MVVM 的了解面试题:为何使用 Android Jetpack?MVVM面试题:说一下对 MVVM 的了解举例说明,好证明自己确实对 MVVM 有着正确、深入的理解eg:分析为什么使用 MVVM,它相对于其他MVP这类架构师如何解决你的项目问题的,另外,还要回答jetpack使用过程中遇到的坑是怎样的。最后,面试官估计会问你对各种架构的选择的对比原则之类的哦面试题:为何使用 Android Jetpack?快速开发组件可以单独采用(不过这些组件是为协同工作而构建的),.原创 2021-06-30 13:48:01 · 8354 阅读 · 0 评论 -
深入分析 Handler 内存泄露
1. 在 Activity 中直接使用 Handler 时候编译器警告内存泄漏1.1 Javapublic class SampleActivity extends Activity { private final Handler mLeakyHandler = new Handler() { @Override public void handleMessage(Message msg) { // ... } };}在实际编写中,我们往往会得到如下原创 2021-06-29 11:05:56 · 4604 阅读 · 0 评论 -
GC 回收机制
1. 概述1.1 什么是垃圾1.2 可达性分析1.3 GC Root 对象1.4 什么时候回收2. 垃圾标记算法2.1 引用计数算法2.2 根搜索算法3. 清除算法3.1 标记-清除算法3.1.1 小结3.2 复制算法3.2.2 小结3.3 标记-压缩算法4. JVM分代回收策略4.1 新生代4.2 老年代5. GC Log 分析6. Java 四种引用7. Android 中的内存抖动8. 参考链接1. 概述1.1 什么是垃圾所谓垃圾就是内存中已经没有用的对象。 既然是”垃圾回收",那就必须知道.原创 2021-06-22 10:52:41 · 4830 阅读 · 0 评论 -
UI 渲染流程及优化
CPU 与 GPUXML 布局显示到屏幕的流程优化渲染过程过度绘制UI 优化解决方案CPU 与 GPUCPU 作为 中央处理器,除了要负责逻辑计算以外,还需要做内存管理,显示操作,因此随着各种复杂 App 的出现,其实际运算的性能会大打折扣设计原由:为了提高图形显示效率以及复杂的图形,设计出了 GPU主要功能:为了帮助 CPU 分担图形显示XML 布局显示到屏幕的流程优化渲染过程过度绘制布局嵌套会答复拖慢界面的加载,这种拖慢的原因在于各种 Layout 的重复测量这让布局层级的数.原创 2021-06-22 07:49:40 · 4559 阅读 · 0 评论 -
Activity、Window、View 之间的关系
1. 什么是ActivityActivity 并不负责视图控制,它只是控制生命周期和处理事件。真正控制视图的是 Window。一个 Activity 包含了一个 Window,Window才是真正代表一个窗口。Activity就像一个控制器,统筹视图的添加与显示,以及通过其他回调方法,来与 Window、以及 View 进行交互。2. 什么是WindowWindow 是一个抽象类,实际在 Activity 中持有的是其子类 PhoneWindow。PhoneWindow 中有个内部类Decor原创 2021-06-21 22:29:23 · 5272 阅读 · 0 评论 -
HandlerThread
1. Source code 概述2. HandlerThread 应用场景参考链接1. Source code 概述HandlerThread 是一个带有 looper 的线程, looper对象可以用于创建 Handler类来进行来进行调度,而且start()方法必须被调用。在 Android 开发中,不熟悉多线程开发的人一想到要使用线程,可能就用 new Thread(){…}.start() 这样的方式。实质上在只有单个耗时任务时用这种方式是可以的,但若是有多个耗时任务要串行执行呢?那不得要.原创 2021-06-21 14:35:46 · 4356 阅读 · 0 评论 -
LeakCanary 2.7 原理分析
1. LeakCanary 初始化我们直接引入依赖即可,无需代码初始化,LeakCanary 会在 app 初始化时自动初始化自身。debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7' Application->attachBaseContext =====> ContentProvider->onCreate =====> Application->onCreate ===原创 2021-06-16 18:10:14 · 6227 阅读 · 5 评论 -
Android 虚拟机进化史
Android 虚拟机进化史1. 按时间顺序开始介绍吧Dalvik or ART?Android 诞生之初 ——> 单纯的 DalvikAndroid 2.2 ——> JIT 首次登场JIT 的缺点Andorid 4.4 ——> ART 和 AOTAndroid 5.0 ——> ART 全面取代 Dalvik(只有 AOT)Android 7.0 ——> JIT 回归2. ART 相对 Dalvik 的优缺点3. 相关概念ARTDalvikDalvik 和 ART 的区别1.原创 2021-06-11 10:36:51 · 6687 阅读 · 1 评论 -
Handler 如何实现线程间切换
例如现在有A、B两个线程,在A线程中有创建了handler,然后在B线程中调用handler发送一个message。当在A线程中创建handler的时候,同时创建了MessageQueue 与 Looper你在子线程向主线程发消息,这个 mMainHandler 是在主线程初始化的,意思是用了主线程的 Looper.loop(), Looper 在主线程中调用 loop 进入一个无限的 for 循环从 MessageQueue 中取消息子线程调用 mMainHandler 发送一个 mess原创 2021-05-30 10:08:45 · 6287 阅读 · 2 评论 -
Android 点击 App icon 发生了什么?
Gityuan – startActivity启动过程分析点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求;system_server 进程接收到请求后,向 zygote 进程发送创建进程的请求;Zygote 进程 fork 出新的子进程,即 App进程;App进程,通过 Binder IPC向 sytem_server 进程发起 attachApplication 请求;system_server 进程在收.原创 2021-05-29 22:36:03 · 4864 阅读 · 0 评论 -
Android 中为什么主线程不会因为 Looper.loop() 里的死循环卡死?
来自知乎的问题,一直没搞明白,今天好好梳理一下知乎原文 ==》 Android中为什么主线程不会因为Looper.loop()里的死循环卡死为什么主线程不会因为 Loop 死循环里卡死1. 问题2. 需要的知识背景3. Android中为什么主线程不会因为Looper.loop()里的死循环卡死?4. 没看见哪里有相关代码为这个死循环准备了一个新线程去运转?4.1 主线程的死循环一直运行是不是特别消耗CPU资源呢?5. Activity的生命周期是怎么实现在死循环体外能够执行起来的?1. 问题a转载 2021-05-29 19:47:08 · 4620 阅读 · 0 评论 -
APT 及实现ButterKnife
了解 APT 的相关知识,相信手动实践后你会更容易理解像 Dagger、ARouter、ButterKnife 等这种使用了编译时注解的框架,也更容易理解其内部源码实现,内容如下:编译时和运行时注解注解处理器APTAbstractProcessorElement和Elements自定义注解处理器使用自定义注解处理器编译时和运行时注解1. 译时和运行时注解先了解一下编译时和运行时的区别:编译时:指编译器将源代码翻译成机器能够识别的代码的过程,Java 中也就是将 Java 源代码编原创 2021-05-29 13:52:43 · 4661 阅读 · 0 评论 -
5 道刁钻的 Activity 生命周期问题
1. A Activity 打开 B Activity 时都有哪些生命周期回调1.1 standard 且无可复用实例A.onPause -> B.onCreate -> B.onStart -> B.onResume -> A.onStop 这仅在 B Activity 的 launchMode 为 standard 或者 B Activity 没有可复用的实例时是这样的。1.2 singleTop 已经在栈顶时当 B Activity 的 launchMode 为原创 2021-05-27 14:14:43 · 4540 阅读 · 0 评论 -
Android 如何 catch 程序中的异常呢?
1. 先从 Thread.setDefaultUncaughtExceptionHandler 说起我们先定个小目标,把 App 里所有的 Crash catch 住,防止 app crash.1.1 简单实现 Thread.UncaughtExceptionHandler 接口看看效果//定义CrashHandlerclass CrashHandler private constructor(): Thread.UncaughtExceptionHandler { private var原创 2021-05-27 13:11:24 · 4764 阅读 · 0 评论 -
Binder 核心原理分析(一)
这里写目录标题1. 什么是 Binder?2. Binder 简单例子3. Binder 由来3.1 传统 Linux 提供的进程间通讯方式优劣3.2 传统管道通信3.3 所以 Android 为什么用 Binder 做为进程间通信机制呢?4. Binder 四个重要角色4.1 Binder驱动 和 Binder5. Binder 四个重要对象5. Binder 通信机制流程6. Binder 架构设计1. 什么是 Binder?Binder 是 Android 中特有的一种跨进程通信方式,它模糊了进程原创 2021-05-27 00:19:13 · 436 阅读 · 0 评论 -
Android intent 传递数据的大小限制
我们知道可以通过 Intent 和 bundle 在 activity 或 fragment 间进行通信,但是 Intent 传递数据时,如果数据太大,可能会出现异常。1. Intent 传递不同大小数据时的问题Activity间通过Intent传递数据的大小限制 – 具体数据博客学Android 这么久,intent传递数据最大多少呢?传 512K 以下的数据的数据可以正常传递。传 512K~1024K 的数据会出错,闪退。传 1024K 以上的数据会报错:TransactionTooLar原创 2021-05-26 07:15:48 · 943 阅读 · 0 评论 -
Android Handler 同步屏障
参考链接Android筑基——可视化方式理解 Handler 的同步屏障机制每日问答 Handler应该是大家再熟悉不过的类了,那么其中有个同步屏障机制,你了解多少呢?Android Handler 源码分析揭秘 Android 消息机制之同步屏障:target==null ?简单理解异步消息相比同步消息要优先执行,好比 :当一堆人在排队进周杰伦演唱会时候,周杰伦来了,就通知保安,周杰伦来了,于是优先给周杰伦进去,等周杰伦进去后,其他人再按顺序进去专业解释就是:当开启了同步障碍时原创 2021-05-25 13:40:02 · 394 阅读 · 0 评论 -
sun.security.validator.ValidatorException: PKIX path building failed...
error msgCould not resolve all dependencies for configuration ':app:devDebugRuntimeClasspath'.Could not determine artifacts for androidx.swiperefreshlayout:swiperefreshlayout:1.0.0Could not get resource 'https://dl.google.com/dl/android/maven2/androidx/原创 2021-03-31 21:33:41 · 362 阅读 · 0 评论 -
More than one file was found with OS independent path ‘lib/x86/libc++_shared.so‘
参考链接More than one file was found with OS independent path ‘lib/x86/libc++_shared.so’Solutionandroid { packagingOptions { pickFirst 'lib/x86/libc++_shared.so' pickFirst 'lib/arm64-v8a/libc++_shared.so' pickFirst '原创 2021-03-31 21:27:01 · 546 阅读 · 0 评论 -
Android 高级工程师面试题汇总
阿里巴巴LRUCache 原理图片加载原理模块化实现(好处,原因)JVM视频加密传输统计启动时长,标准如何保持应用的稳定性ThreadLocal 原理谈谈 classloader动态布局热修复,插件化HashMap 源码, SpareArray 原理性能优化,怎么保证应用启动不卡顿怎么去除重复代码SP是进程同步的吗?有什么方法做到同步介绍下 SurfViewHa...原创 2019-04-22 09:53:14 · 3847 阅读 · 0 评论 -
Android 基础面试题(一)
1.ArrayList和Vector的主要区别是什么?ArrayList在 Java1.2引入,用于替换 Vector Vector:线程同步,当Vector中的元素超过它的初始大小时,Vector会将它的容量翻倍ArrayList:线程不同步,但性能很好。当ArrayList中的元素超过它的初始大小时,ArrayList只增加50%的大小2.switch是否能作用在byte上,是否能作用在原创 2017-02-22 22:56:32 · 374 阅读 · 0 评论 -
Android 中为什么主线程不会因为 Looper.loop() 里的死循环卡死?
Looper.loop 死循环分析问题分析参考链接问题app 程序入口中为主线程准备好了消息队列而根据 Looper.loop() 源码可知里面是一个死循环在遍历消息队列取消息而且并也没看见哪里有相关代码为这个死循环准备了一个新线程去运转,但是主线程却并不会因为Looper.loop() 中的这个死循环卡死,为什么呢?分析对于线程既然是一段可执行的代码,当可执行代码执行完成后,线程生命周期便该终止了,线程退出。而对于主线程,我们是绝不希望会被运行一段时间,自己就退出,那么如何保证能一直存活原创 2020-12-30 13:48:58 · 397 阅读 · 1 评论 -
2020-12-16
这里写目录标题一级目录二级目录三级目录一级目录二级目录三级目录能否让APP永不崩溃—小光与我的对决Github Cockroachme – Android Crash 原理分析me – Android app 崩溃 & Crash 分析(一)me – Android app 崩溃 & Crash 分析(二)奇怪的 TimeoutExceptionme – Android Crash框架Recoveryme – ADB(一) 模拟应用被杀掉原创 2020-12-16 14:02:35 · 127 阅读 · 0 评论 -
耗电优化(下):耗电的优化方法与线上监控
原创 2020-12-11 15:23:14 · 376 阅读 · 0 评论 -
耗电优化(上):Android App 耗电分析
这里写目录标题1. 电量和硬件1.1 App 通过使用硬件模块消耗相应的电能1.2 资源调度机制是厂商功耗优化最重要的手段2. 电量和应用程序2.1 评估不同应用程序的耗电情况结论:把电量的测量转化为功能模块的使用时间或者次数2.2 尽可能准确的测量电量bug report结合 `Battery Historian` 是最好的排查方法3. Android 耗电的演进历程3.1 野蛮生长:Pre Android 5.03.2 逐步收紧:Android 5.0~Android 8.03.2.1 Android原创 2020-12-11 15:13:10 · 3714 阅读 · 1 评论 -
TextView 太长如何保持与 ImageView 在同一行显
实现效果: 左侧文字,右侧 icon文字短的时候,icon 仅靠 text文字长的时候,text 换行,icon 在右侧 <TextView android:id="@+id/chargingTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="24dp"原创 2020-11-04 13:43:10 · 771 阅读 · 0 评论 -
Android H5拉起 app
工作较忙,暂做记录,稍后整理最后采用的方案参考 openinstall 实现方式:<script type="text/javascript"> //OpenInstall初始化时将与OpenInstall服务器交互,应尽可能早的调用 /*web页面向app传递的json数据(json string/js Object),应用被拉起或是首次安装时,通过相应的android/ios api可以获取此数据*/ var data = OpenInstall.parseUrlParams原创 2020-10-14 09:56:17 · 2911 阅读 · 0 评论 -
.aar 文件修改
1. 背景1.1 升级 gradlePlugin version 后编译报错项目中 gradlePlugin version 从3.5.3 升级到 3.6.0 之后编译报错:jarfile\res\mipmap-xhdpi-v4\allimage_gotoback.png: AAPT: error: failed to read PNG signature: file does not start with PNG signature.意思就是升级之后的 gradle 编译之后有更严格的资源格式检原创 2020-05-14 13:30:35 · 939 阅读 · 0 评论 -
为什么子线程都不能刷新UI?
1. 理论上的原因1.1 Android主线程是线程不安全的?网上文章常常有说:Android主线程是线程不安全的。我就纳闷了,线程还有安全一说?不能说主线程是线程不安全。线程没有安全不安全这一说。而是更新UI的方法不是线程安全的,即只能在单线程中完成UI的更新,不能使用多线程。(为什么呢?因为子线程可能会有多个,存在多个线程同时操作一个控件的情况)因此,只能在主线程中进行UI更新。1...原创 2019-11-04 17:38:53 · 1250 阅读 · 0 评论 -
SharedPreference.Editor 的 apply 和 commit 方法异同
1. apply方法在 官方SDK说明 如下:Commit your preferences changes back from this Editor to the SharedPreferences object it is editing. This atomically performs the requested modifications, replacing whatever is...原创 2019-11-04 11:40:38 · 213 阅读 · 0 评论 -
深入解析 SharedPreferences
一. 概述SharedPreferences 是Android中很常用的数据存储方式,SP 采用 key-value形式, 主要用于:轻量级的数据存储, 尤其适合保存应用的配置参数不建议使用SP 来存储大规模的数据, 可能会降低性能SP 采用 xml 文件格式来保存数据, 该文件所在目录位于 /data/data//shared_prefs/1.1 使用示例SharedPrefe...转载 2019-11-04 11:24:00 · 824 阅读 · 0 评论 -
findViewById 原理
有人问了 findViewById 到底做了什么事情,有点懵逼,在此深入研究以下findViewById 流程图1. Activity 的 findViewById点进去看源码进入 Activity.class 类里的方法: /** * Finds a view that was identified by the id attribute from the XML t...原创 2019-10-16 15:05:17 · 1943 阅读 · 0 评论 -
Android Studio 项目提升编译速度
大多数 Android 工程都是基于 Gradle 工具进行构建和编译的,大型项目构建时间可能会耗时很久,这时候我们可以进行优化、减少构建时间。1. 分析问题Gradle 官方在最近的版本更新中推出了一个神器 build scan,可视化的深入分析和诊断所有构建相关的数据,并基于此分析结果帮助开发者找出构建问题以及针对构建性能进行优化。2. 一些建议升级 Gradle 版本并采用最...原创 2019-10-15 20:06:59 · 267 阅读 · 0 评论 -
View 的事件分发机制(一)
点击事件的传递规则 所谓点击事件的分发,其实就是对MotionEvent事件的分发过程,即当一个MotionEvent产生以后,需要把这个事件传递给一个具体的View,而这个传递的过程就是分发过程。 点击事件的分发过程由三个很重要的方法共同完成:dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent1.1 dispatchTouchEv原创 2016-11-03 22:34:50 · 322 阅读 · 0 评论 -
单例模式详解
1.饿汉式,线程安全单例会在加载类后一开始就被初始化,即使客户端没有调用 getInstance()方法 饿汉式的创建方式在一些场景中将无法使用:譬如 Singleton 实例的创建是依赖参数或者配置文件的,在 getInstance() 之前必须调用某个方法设置参数给它,那样这种单例写法就无法使用了//Singleton 类加载时 ,就会创建一个实例,不管用户是否调用public class原创 2016-11-05 11:28:11 · 279 阅读 · 0 评论 -
Android6.0运行时权限详解
Android6.0运行时权限详解1. 运行时获得权限: Android 5.0之前是注册即可获取权限,Android 5.0之后安装时可以关闭某些权限,Android 6.0开始,一些隐私权限总在第一次运行时提示是否授权。2. 检查是否获得权限: ContextCompat.checkSelfPermission(context,permission)方法,返回值有两种: Packag原创 2016-11-01 19:33:06 · 845 阅读 · 0 评论