
【Android】
文章平均质量分 78
理想主义的许佳佳
一位理想主义的程序员,祝你健康幸福。
展开
-
常用adb 命令 整理
查看当前界面Activity:adb shell “dumpsys activity top | grep ACTIVITY | tail -n 1”查看Activity任务栈(仅适用android11以及以上):adb shell “dumpsys activity activities | grep ‘* ActivityRecord{’”查看当前界面Fragment:adb shell “dumpsys activity top | grep '#[0-9]: ’ | tail -n 1”原创 2022-04-17 16:15:37 · 3210 阅读 · 0 评论 -
GradientDrawable 获取单一颜色
概述GradientDrawable 虽然功能很强大,在平时的使用中,有很多场景只会使用其形状相关的功能,比如用来画一个圆形或者画一个圆角矩形,一般代码会如下: View vTest = findViewById(R.id.v_main_test); GradientDrawable gradientDrawable = new GradientDrawable(); gradientDrawable.setColor(0xFFFF0000);原创 2022-02-12 20:22:34 · 1821 阅读 · 0 评论 -
Android activity动画无效问题汇总
概述android activity动画是一个比较简单的功能。但是使用时总会由于各种小问题导致动画失效,笔者根据自己经验,整理了各种可能导致的原因,期望能对你有所帮助。activity动画方式在AndroidMenifest中添加activity的动画属性windowAnimationStyle <item name="android:windowAnimationStyle">@style/anim_fade</item>在activity代码中添加 overr原创 2021-10-31 10:47:23 · 3812 阅读 · 0 评论 -
android 圆角实现方案小结
概述在实际工作中,android经常有需要实现圆角的场景。笔者根据自己的经验,整理了下几种可行的圆角实现方案,分别适合不同的场景,期望能够对你有所帮助。方案类型一、定义drawable文件二、自定义需要实现圆角的View三、自定义圆角View的父布局四、使用第三方库一、定义drawable文件例子<shape xmlns:android="http://schemas.android.com/apk/res/android"> <corners androi原创 2021-10-23 09:41:34 · 3615 阅读 · 0 评论 -
Rxjava 源码解析(三) - Schedulers默认线程池
概述前文已经分析过rxjava中我们常见用法的一些源码,还没有了解的读者推荐看下:Rxjava 源码解析(一) - subscribe源码Rxjava 源码解析(二) - 线程切换源码本文将分析下rxjava线程池相关的源码。本文的内容大概有以下:Scheduers.io()源码线程工厂RxThreadFactory源码线程池CachedWorkerPool源码Worker的创建与调用Scheduers.io()源码rxjava内置的线程池除了io,还有newThead,singl原创 2021-08-28 08:47:18 · 1621 阅读 · 0 评论 -
Rxjava 源码解析(二) - 线程切换源码
概述前文已经讲了rxjava 简单subscribe的源码,有兴趣的读者可以看下。Rxjava 源码解析(一) - subscribe源码本文将基于前文的分析,继续讲下rxjava中断线程切换。Demo主要逻辑如下:Observable调用create()创建 ObservableCreateObservableCreate调用map,返回ObservableMapObservableMap调用subscribeOn,返回ObservableSubscribeOn返回Observable原创 2021-08-20 09:15:54 · 440 阅读 · 0 评论 -
Rxjava 源码解析(一) - subscribe源码
概述rxjava的应用还是较为广泛的,在实际项目中经常与MVP一起使用,可以使代码的可读性更高。在较为复杂的一些场景下,也可以使代码更加的简洁。本文将会是对rxjava源码的探索,适合已经对rxjava的使用有一定经验的读者。对MVP有兴趣的读者可以看下笔者的前文:MVC、MVP、MVVM小记同步Demo主要逻辑如下:Observable调用create()创建 ObservableCreateObservableCreate调用map,返回ObservableMapObservab原创 2021-08-19 08:13:57 · 902 阅读 · 0 评论 -
EventBus源码解析
概述本篇内容适合对EventBus有兴趣,或者已经对EventBus有一定使用经验的读者。如果读者此前还没有具体使用过EventBus,推荐阅读下笔者前文:android为什么要用EventBusregister关键逻辑:遍历当前注册的类,获取其中使用了eventBus注解的方法。将这些方法都注册到两个HashMap中,分别是subscriptionsByEventType和typesBySubscriber。通过synchronized加锁,来保证线程安全。subscripti原创 2021-08-15 09:32:22 · 339 阅读 · 0 评论 -
greenDao 在 qigsaw中报错Could not init DAOConfig
报错org.greenrobot.greendao.DaoException: Could not init DAOConfig场景使用qigsaw宿主模块依赖 greenDAO插件模块使用了greenDAO插件模块使用greenDAO报错:Could not init DAOConfig原因greenDAO源码中通过反射的方式去调用Properties类宿主模块加载greenDAO的ClassLoader是 PathClassLoader插件模块加载AbstractDao实现类原创 2021-08-05 08:16:41 · 981 阅读 · 0 评论 -
由浅入深学习android input系统(五) - input系统的启动
概述前文已经讲过了input系统对事件的抓取以及传递,此文将探索下input系统的启动。input系统的初始化调用的任务栈如下:SystemServer.main()SystemServer.run()InputManagerService构造函数InputManagerService.nativeInit()com_android_server_input_InputManagerService.nativeInit()NativeInputManager构造函数InputManag原创 2021-07-05 07:52:24 · 731 阅读 · 0 评论 -
Android 点击无效问题总结
概述近期碰到比较坑的点击无效的问题,尝试了多种解决方案,最终解决。于是,趁热打铁,做个问题与解决方案的总结,期望能对你有所帮助。点击无效的原因View没有设置点击事件View被其他View遮盖父View拦截了事件被其他window遮盖排查与解决View没有设置点击事件打断点或打log,确认设置点击事件的代码有执行到。View被其他View遮盖可以通过Android studio的工具“Layout Inspector”来协助排查,确认没有被其他View遮盖。父View拦截了事件原创 2021-06-28 07:44:17 · 7415 阅读 · 3 评论 -
由浅入深学习android input系统(四) - input事件采集(InputReader)
概述前面讲到,系统进程是通过InputDispatcher将事件分发给app进程的。前文地址:那么InputDispatcher的事件又是从哪里来的呢?android是怎么收到硬件层的事件的呢?本文将对此进行探索。InputReader本身的答案就是在InputReader这个类中,InputReader会启动一个线程一直循环处理逻辑,主要做两件事:获取硬件设备的事件将获取到的原始数据进行处理后传递给InputDispatchervoid InputReader::loopOnc原创 2021-06-21 08:52:01 · 935 阅读 · 2 评论 -
由浅入深学习android input系统(三) - InputChannel解析
概述根据前文分析,InputDispatcher将事件分发给app进程是通过InputChannel,那么InputChannel又是什么时候建立的呢?InputChannel的初始化InputChannel初始化,调用任务栈如下:ViewRootImpl.setView()IWindowSession.addToDisplay()等同于 WindowManagerService.addToDisplay()WindowManagerService.addWindow()WindowSta原创 2021-06-15 09:10:53 · 2031 阅读 · 4 评论 -
由浅入深学习android input系统(二) - input事件如何传递到app进程( InputDispatcher )
概述前文已经解析的内容是:app进程在接收到input事件后,最终传递到View,经过了哪些操作。本文将继续探索 android input系统,分析下系统进程是怎么将input事件传递到app进程的。InputDispatcher的事件分发系统进程的input事件都通过InputDispatcher这个类来进行分发。比如当有触摸事件发送过来时,InputDispatcher会对其进行判断来分发给哪个进程,哪个window。调用任务栈如下:InputDispatcher.dispatchOnc原创 2021-06-08 08:18:37 · 1656 阅读 · 5 评论 -
Android 混淆 小结
概述官方依赖文档:https://developer.android.com/studio/build/shrink-code?hl=zh-cn不管是独立开发app还是开发aar,混淆都是必须了解的一个模块。混淆作用缩小包大小使关键代码对外不可读开启混淆将minifyEnabled设置为true,就可以打开混淆proguard-android-optimize.txt ,是android预设的混淆规则,包含了大多数常用的混淆规则,比如activity的名字不混淆。proguar原创 2021-06-01 08:27:00 · 411 阅读 · 3 评论 -
由浅入深学习android input系统(一) - input事件如何传递到View
概述”View的事件分发“对于大多数android开发者而言都是比较熟悉的。对此还不了解的读者,推荐看下笔者的相关文章:完全理解android事件分发机制那么这个事件究竟是如何从“触摸屏幕”到“View处理事件”的呢?本系列将针对此疑问展开。ViewRootImpl对事件的传递View的所有更新UI的操作最终都必须经过操作系统在系统进程的处理,才能够通过硬件展示到用户面前。ViewRootImpl担任了window与view的中间人的角色,View可以通过ViewRootImpl将更新U原创 2021-05-24 08:51:07 · 1836 阅读 · 5 评论 -
ViewRootImpl源码解析 (二) - 事件分发
概述前文链接:ViewRootImpl源码解析 (一) - View的更新前文讲了ViewRootImpl中View更新相关的逻辑,此文将讨论下ViewRootImpl中的事件分发逻辑,或者说是事件回传逻辑。此处先列出笔者的个人对ViewRootImpl的理解,如有问题欢迎评论指正。View的所有更新UI的操作最终都必须经过操作系统在系统进程的处理,才能够通过硬件展示到用户面前。ViewRootImpl担任了window与view的中间人的角色,View可以通过ViewRootImpl将更新原创 2021-05-20 09:08:40 · 710 阅读 · 0 评论 -
ViewRootImpl源码解析 (一) - View的更新
概述前文讲解了windowManager.addView() 源码相关的知识,有兴趣的读者可以看下:前文讲到ViewRootImpl,但是属于浅尝辄止,没有继续深入了,因此笔者再开几篇文章,继续深入讲下ViewRootImpl的源码。此处先列出笔者的个人对ViewRootImpl的理解,如有问题欢迎评论指正。如下:View的所有更新UI的操作最终都必须经过操作系统在系统进程的处理,才能够通过硬件展示到用户面前。ViewRootImpl担任了window与view的中间人的角色,View可以通过原创 2021-05-10 08:07:18 · 1011 阅读 · 6 评论 -
Android Window系列(二)- windowmanager.addview源码解析(View的更新)
概述前文讲解了window与decorview相关的知识点,有兴趣的读者可以看下:本文将继续探讨下window与view的关系,主要针对“如何在window中添加view”来进行探索。如何在window中添加View这样的场景有非常多,有如下例子:activity在启动的时候向window中添加viewdialog在启动的时候向window中添加viewtoast在启动的时候向window中添加view悬浮窗activity在启动的时候向window中添加view相关逻辑的任务栈调用原创 2021-05-06 07:57:32 · 3188 阅读 · 0 评论 -
Android Input子系统为什么要使用socket,而不是binder?
概述此文出自笔者回答的一个知乎问题,原问题:Android Input子系统为什么要使用socket,而不是binder?Android Input子系统为什么要使用socket,而不是binder?近期正好学习到Binder与input系统相关的知识,觉得这个问题非常有意思。使用socket而不使用binder的原因非常多,笔者仅根据自己的认知回答一下,一定会有考虑不周的地方,有想法的读者可以评论补充或者交流。如果使用binder,会有哪些问题?binder与socket相比太耗资源了。原创 2021-04-27 21:03:00 · 1574 阅读 · 0 评论 -
Android Window系列(一)- window与decorview
概述window是android中非常常见的一个概念。Activity、Dialog、Toast这些常用的知识点都是和window密不可分的。因此,笔者整理了下window相关的知识,期望能对需要的读者有所帮助。window官方描述Window源码中对window的描述如下:/** * Abstract base class for a top-level window look and behavior policy. An * instance of this class should原创 2021-04-25 07:50:02 · 5355 阅读 · 6 评论 -
android gradle 多渠道打包小结
概述多渠道对于android来说是一个比较常见的概念,举几个常见的用法:根据不同的渠道使用不同的资源根据不同的渠道使用不同的依赖根据不同的渠道作不同的数据统计根据不同的渠道,游戏app中对应不同的服务区github地址本文项目基于笔者自己写的demo,对其有兴趣的读者可以自行下载:https://github.com/Double2hao/MultiChannelTestandroid studio的多渠道如果要使用多渠道,仅需要在该项目的build.gradle文件中增加以下代码:原创 2021-04-08 20:57:15 · 3372 阅读 · 3 评论 -
【StudyWebView】android webview架构的一种新思路
github项目地址https://github.com/Double2hao/StudyWebviewStudyWebView架构StudyRouter架构如上图,主要几个模块的功能如下:webview客户端的webview,可以是view,也可以是界面。H5运行于webview上,webview是H5与客户端交互的媒介。BridgesBridges处于业务进程。H5通过单一的通道来调用客户端的功能,由于客户端部分业务会处于业务进程,因此webview会将需要调用业务进程的逻辑封装成b原创 2021-04-06 20:53:19 · 714 阅读 · 0 评论 -
由浅入深 学习 Android Binder(十一) binder线程池
Android Binder系列文章:由浅入深 学习 Android Binder(一)- AIDL由浅入深 学习 Android Binder(二)- bindService流程由浅入深 学习 Android Binder(三)- java binder深究(从java到native)由浅入深 学习 Android Binder(四)- ibinderForJavaObject 与 javaObjectForIBinder由浅入深 学习 Android Binder(五)- binder如何在.原创 2021-03-22 08:51:19 · 7354 阅读 · 3 评论 -
android aar 自动引入依赖
概述android 生成aar后,引用此aar的项目不会自动引用 aar中的依赖,一般情况下,需要开发者在使用这个aar的项目中再自己手动添加需要的依赖。那么如何能让一个项目引用aar后,自动引入相关的依赖呢?实现方式上传aar到maven仓库前,修改maven中的pom文件,在其中写入aar相关的依赖。build.gradle代码plugins { id 'com.android.library' id 'maven'}android { compileSdkVersion原创 2021-03-13 19:32:48 · 1394 阅读 · 2 评论 -
android小程序多任务栈管理
概述微信小程序要知道什么是小程序的任务栈管理,直接看微信小程序即可:一次最多启动5个小程序小程序启动到达上限后,会关闭最久未使用的小程序,并且打开新的小程序。微信小程序使用时,如下图:实现要点小程序的任务栈管理,主要有以下要点:如何启动多个任务栈的小程序如何限制任务栈的启动个数DemoDemo的github地址如下:https://github.com/Double2hao/ProcessTaskTestDemo如下图:Demo中打开多任务栈的场景如下:关键实原创 2021-03-02 07:17:48 · 1159 阅读 · 0 评论 -
android监听软键盘弹出弹回事件
概述针对“软键盘的遮挡”问题,最简单的方式就是将activity的windowSoftInputMode设置成adjustResize或者adjustPan。android:windowSoftInputMode="adjustResize"android:windowSoftInputMode="adjustPan"其效果一般如下: 如上图,这样设置后能保证“当前操作的布局”在软键盘之上。但是实际业务场景,可能需要的是“将整块布局”设置在软键盘之上,即Demo中的两个输入框和按钮都需要在软原创 2021-02-11 07:50:15 · 4996 阅读 · 3 评论 -
Android 进程恢复
概述在android多进程的场景中,进程被意外杀死的情况非常场景,可能是用户手动杀死进程,也有可能是操作系统内存不够主动回收。某个进程被杀死,会导致其他进程与这个进程的通信失效,因此,一旦发生这种情况,就需要在其他进程,对这个被杀死的进程作“进程恢复”。进程恢复重要步骤在进程死亡的时候重启进程。检查进程间通信逻辑,如果失效需要做恢复。此处的恢复,简单来说就是一些初始化操作,可能包括io,网络等操作。DemoDemo 的github地址:https://github.com/Doubl原创 2021-02-10 11:08:08 · 733 阅读 · 0 评论 -
Android跨进程传图片(解决TransactionTooLargeException)
跨进程传图片方案直接intent传bitmap使用文件读写intent传递自定义binder,binder中传递image使用网络传输直接intent传bitmap优势使用简单劣势相关代码可能有侵入性,必须在四大组件中接收。intent传递数据的总大小是1MB,其中还包括启动四大组件相关的信息。因此使用intent传递的图片不宜超过500KB,甚至应该更小,因为还可能会传递其他数据。如果通过此方案传递大图片,必须先压缩后传输。开发者需要自己评估业务场景是否适用,毕竟很多场景不原创 2021-02-10 07:28:21 · 1104 阅读 · 3 评论 -
序列化小结
为什么要序列化wiki的描述如下:序列化在计算机科学的资料处理中,是指将数据结构或对象状态转换成可取用格式(例如存成文件,存于缓冲,或经由网络中发送),以留待后续在相同或另一台计算机环境中,能恢复原先状态的过程。笔者个人理解如下:序列化:“把当前环境的数据结构 转化成一种 可存储 或者 可传输的形式” 的过程。反序列化:”这种可传输或者可存储的形式 还原成 当前环境的数据结构“的过程。此处为了便于读者理解举个例子:现在有一个 Student类,有name,age等参数。需求一原创 2021-02-09 06:29:49 · 318 阅读 · 0 评论 -
由浅入深 学习 Android Binder(十)- 总结
概述笔者在大学学习Android时也一直对Binder非常有兴趣,奈何多次探索,多次无功而返。现在想想,不仅是缺乏Binder实践的经验,更多的也是故步自封,没有考虑过直接剖析native层源码来理解binder。(那时候总想着java层都还没搞明白,直接看native层没有意义)后来随着工作经验的积累,对Binder和多进程也有一定的实践经验,再次回顾时,发现很多细节也是可以理解了,于是就开始思考如何去整理Binder这一些系列的知识。我个人非常明白,不能”直接开始解析某个类“地来写,这样的后果就原创 2021-01-17 11:35:16 · 953 阅读 · 2 评论 -
由浅入深 学习 Android Binder(九)- service_manager 与 svclist
概述前文讲过了java层与native层的IServiceManager,两者最终其实都是通过transact方法 走到了binder driver。之后binder driver便会把工作交给service_manager来处理,这个类的path是/frameworks/native/cmds/servicemanager/service_manager.c。前文地址:由浅入深 学习 Android Binder(七)- IServiceManager与ServiceManagerNative(原创 2021-01-17 11:26:39 · 1084 阅读 · 2 评论 -
由浅入深 学习 Android Binder(八)- IServiceManager与BpServiceManager(native层)
概述前文已经讲解过java层ServiceManager的逻辑,如果没有了解过的读者建议看下:由浅入深 学习 Android Binder(七)- IServiceManager与ServiceManagerNative(java层)此文承接前文,继续讲下在native层的IServiceManager,具体的path是/frameworks/native/libs/binder/IServiceManager.cpp。native层还有/frameworks/native/cmds/servi原创 2021-01-11 08:34:26 · 2340 阅读 · 0 评论 -
由浅入深 学习 Android Binder(七)- IServiceManager与ServiceManagerNative(java层)
概述ServiceManager于android binder来说是非常重要的一部分。ServiceManager在java层与native层都有各自的逻辑,本文主要讲下java层ServiceManager的逻辑。如果了解过binder的读者,可能也多少会听说过binder与serviceManager的关系为了方便读者有个整体的认知,附上整体的流程图:何处使用了ServiceManager前文由浅入深 学习 Android Binder(二)- bindService流程中,在clie原创 2021-01-04 08:47:51 · 3382 阅读 · 0 评论 -
由浅入深 学习 Android Binder(六)- IPC 调用流程
概述如果使用aidl来进行IPC,在client进程执行的transct方法后最终会执行到server进程的onTransact方法,如下图:对aidl还不是很了解的读者可以看下笔者的前文:由浅入深 学习 Android Binder(一)- AIDL那么在client进程调用transact后,究竟触发了哪些逻辑呢?本文将针对此点深入探索。此文探讨的是两个进程之间的IPC。如果是同一个进程之间调用,流程会简单一些,有兴趣的读者可以自行探索。调用流程先给出流程图,便于读者有一个整体原创 2020-12-19 07:55:03 · 2814 阅读 · 4 评论 -
由浅入深 学习 Android Binder(五)- binder如何在进程间传递
概述前文分析过bindService源码,该文章地址如下:由浅入深 学习 Android Binder(二)- bindService流程最终得到时序图如下:如上图,client进程与server进程是通过系统进程来进行通信的。实际demo中,有两个场景我们会接触到binder:client进程通过serviceConnection获取到系统进程传递的binder。server进程将service.onbind()返回的binder传递给系统进程。我们就以server给系统进程传递bi原创 2020-12-12 10:16:49 · 2667 阅读 · 1 评论 -
由浅入深 学习 Android Binder(四)- ibinderForJavaObject 与 javaObjectForIBinder
概述前文已经解析了java层binder在native层的形式。前文地址:由浅入深 学习 Android Binder(三)- java binder深究(从java到native)前文由于篇幅限制,没有继续探索JavaBBinder与BinderProxy,此文则将继续深入相关逻辑。ibinderForJavaObject 与 javaObjectForIBinderjava与native之间通过JNI来实现数据的传递与交互。主要就是通过native层的ibinderForJavaObje原创 2020-12-11 08:31:36 · 1638 阅读 · 0 评论 -
由浅入深 学习 Android Binder(三)- java binder深究(从java到native)
概述前文地址:由浅入深 学习 Android Binder(二)- bindService流程前文讲到bindService流程,其中多次碰到用binder实现的IPC,有以下几个:client进程 通过IPC 通知AMS进程去bindServiceAMS进程 通过IPC 通知server进程去bindServiceserver进程 通过IPC 通知AMS进程bindService结果AMS进程 通过IPC 告诉client进程bindService结果本文就选择”client通知AM原创 2020-12-06 05:12:49 · 1615 阅读 · 2 评论 -
由浅入深 学习 Android Binder(二)- bindService流程
概述前文已经讲过了binder在aidl的IPC中所起到的作用。其中的Binder是通过ServiceConnection+bindService获取到的。本文承接前文,详细探索一下从bindService到ServiceConnection.onServiceConnected()的流程。bindService流程bindService的流程其实有两种场景:Service冷启动Service热启动本文为了分析的更加全面,因此主要分析”Service冷启动“的场景。笔者此处先列出流程,读原创 2020-11-22 08:46:47 · 3513 阅读 · 0 评论 -
由浅入深 学习 Android Binder(一)- AIDL
概述demo项目 github地址:aidl是常用的android IPC方式,本文将根据一个demo来解析下AIDL的原理。为了便于读者理解,本文不会探究Binder的实现细节,可以认为Binder在此文的分析中被看做是一个“黑盒”。有一定经验的读者可以直接到文末看总结,最终流程图如下:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bLrLwiAU-1605878532480)(evernotecid://214C33E9-92BC-434E-8AEC-B93原创 2020-11-22 08:37:59 · 8063 阅读 · 9 评论