android rom
文章平均质量分 84
android底层相关知识
爱炒饭
每天进步一点点
展开
-
dialog token null is not valid; is your activity running源码分析
大家直到在android中普通dialog(不是系统级dialog)构造函数的context必须是activity类型的,不能是application类型的context,为什么呢?本文从源码角度来分析下,分为androidX场景和非androidX场景。下面是一个简单的普通dialog弹出,关键在于第一Builder的构造参数是application的context,毫无意外,运行会报错。AlertDialog alertDialog = new AlertDialog.Builder(getAppl原创 2021-12-11 15:55:32 · 3385 阅读 · 1 评论 -
单例模式以及在android中的使用
一、原理程序中某个对象可能比较消耗内存或者创建多个对象实例会引起运行错乱,此时就要求程序中只有一个该对象的实例,也就是单例模式的由来。为了防止开发者创建多个实例,一般会将单例类的构造器设为私有(private),这样你在其它地方去new单例类会失败;然后创建一个该单例类的静态方法去初始化实例对象并返回实例对象,当然实例对象也要是private static的,这样就必须通过静态方法获取该类的实例对象了。考虑到创建对象的过程并不是原子的,也要兼顾多线程安全问题。二、分类有多种构建单例的方式,它们都有优缺原创 2021-08-14 16:27:54 · 1162 阅读 · 0 评论 -
高通设备进入高通9008模式
1、通过下面adb 命令进入adb reboot edl2、上面adb 命令进入9008失败的话,设备关机,通融过usb线连上电脑,同时按住音量上键、音量下键和电源键一会,即可进入9008模式附上进入9008成功的电脑端口截图:...原创 2021-08-12 11:34:57 · 85206 阅读 · 1 评论 -
模板方法模式以及在android中的应用
一、原理模板方法模式封装了一个算法(方法)流程的基本步骤,有些步骤的实现已经在父类中实现好,而另外一些步骤则可以推迟到子类中等待子类去具体实现,子类就可以在不改变算法结构的情况下,重新定义算法中的某些步骤。这样做有什么好处呢?首先,体现了面向对象的封装性,一些算法的基本步骤不允许修改,防止子类随意的修改算法流程;其次,对于一些公共代码可以直接将实现封装在父类,这样就起到了代码复用的目的;同时,也可以在父类的封装算法中添加一些钩子,让子类可以适当的改变算法的部分可变流程,增加算法的拓展性。模板方法模式和原创 2021-08-09 19:59:54 · 215 阅读 · 0 评论 -
Scheduling restart of crashed service解决方案与源码分析
测试发现一个bug,service中某个方法由于空指针导致程序挂掉,接着触发程序的保活机制触发程序重启,但是这个异常service先启动访问未初始化资源导致程序连续循环重启,log中打印一个信息很关键。ActivityManager: Scheduling restart of crashed service com.shan.mvvm/.MyService in 1000ms for start-requested系统按照程序启动时要求重新启动了service。这就要提到Service的onStar原创 2021-07-17 10:30:43 · 11079 阅读 · 1 评论 -
Project Butter与invalidate
一、Project Buttergoogle希望摆脱android UI交互方面的滞后、卡顿问题,在android4.1提出了Project Butter,力争UI如黄油般丝滑。为了确保一致的帧速率,Android 4.1 将Vsync 计时扩展到了所有由 Android 框架完成的绘图和动画中。包括应用渲染、轻触事件、画面构成和显示刷新在内的一切操作均按照 16 毫秒的 Vsync 检测信号同步运行,因此帧不会提前或延迟。Android 4.1 还在图形管道中添加了三重缓冲,以实现更加一致的.原创 2021-05-12 21:20:25 · 252 阅读 · 5 评论 -
anr原因二:BroadcastQueue
本文基于android9.0源码分析。android出现经常与四大组件有紧密联系,主要有四种情况1、activity界面输入事件超时 2、broadcastReceiver发送以及接收事件超时 3、service处理事务超时 4、contentProvider处理事务超时。在上一篇文章《anr原因一:inputDispatcher》中对输入事件的anr源码进行了分析,本文则对broadcastReceiver产生的anr进行分析。一、发送广播先从发送广播说起吧,执行sendBroad原创 2021-04-29 17:53:35 · 865 阅读 · 1 评论 -
anr原因一:inputDispatcher
android出现经常与四大组件有紧密联系,主要有四种情况1、activity界面输入事件超时 2、broadcastReceiver发送以及接收事件超时 3、service处理事务超时 4、contentProvider处理事务超时。先透露一下,anr弹框最终会调用ProcessRecord的appNotResponding方法,搜索源码发现有四个地方调用了ProcessRecord.appNotResponding方法,这也验证了上面的说法。本文只分析activity相关的inputDisp原创 2021-04-23 15:49:18 · 2839 阅读 · 1 评论 -
AccessibilityService事件输入源码
android底层Input事件传递流程一文从源码角度介绍了android底层输入事件的来源与分发,那么本文就专门介绍下无障碍服务的来源与分发。本文基于android9.0源码进行分析,从AccessibilityService绑定到系统服务以及系统服务发送事件消息给AccessibilityService两个过程来分析。1、服务绑定在无障碍服务和悬浮框一文中介绍了应用层实现无障碍服务的一个例子。我们知道应用层要实现无障碍服务首先要创建一个AccessibilityService的子类,并在这个子类原创 2021-04-21 19:42:37 · 1356 阅读 · 1 评论 -
android底层Input事件传递流程
在android事件分发机制一文中介绍了Touch事件的分发,那么Touch事件从哪里来的呢?本文基于android9源码进行分析。一、IMS首先,触摸事件肯定需要驱动去接收,android是在/dev/input节点获取事件。由于WindowManagerService.java(后面简称WMS)负责界面窗口的管理,既然是屏幕事件那么肯定和WMS有关了,WMS是在SystemServer.java的startOtherServices方法中启动的,WMS的构造参数有InputManagerSe原创 2021-04-16 15:22:35 · 1231 阅读 · 1 评论 -
android aidl --支持类型?同步还是异步?
aidl用于android中进程间通信,远程服务端的接口方法在aidl中声明,当客户端 绑定服务器成功后返回的binder对象转成aidl支持的类型并调用之前声明的接口方法即可实现客户端与远程服务器的跨进程通信。其实不提供aidl文件也可以实现Binder,之所以提供aidl文件,是为了方便系统为我们生成代码,我们也可以手动写一个Binder。aidl支持如下数据类型:1、基本数据类型2、Stri...原创 2018-05-15 11:15:34 · 3589 阅读 · 1 评论 -
ERROR:STATUS_BROM_CMD_SEND_DA_FALL(0xC0060003)
昨天使用mtk工具SP_Flash_Tool_exe_Windows_v5.2052.00.000刷机失败,提示ERROR:STATUS_BROM_CMD_SEND_DA_FALL(0xC0060003)。上网搜了下,有如下回答1、手机驱动安装不完全我电脑安装驱动精灵和驱动人生扫描驱动,但是并不需要更新,所以不是驱动问题2、windows10电脑不兼容,我的异地同事也是windows10电脑并且使用的是相同版本的SP_Flash_Tool工具,他却可以,所以也不是版本的问题3原创 2021-04-08 19:40:48 · 13515 阅读 · 5 评论 -
Window相关
1、ViewRootImpl的数量android中Window.java的唯一实现类是PhoneWindow.java,WindowManager.java的实现类是WindowManagerImpl.java,WindowManagerImpl.java中的WindowManagerGlobal用于具体操作View。WindowManagerGlobal.java添加View时会调用ViewRootImpl的setView(view, wparams, panelParentView, userId)原创 2021-03-15 20:59:27 · 137 阅读 · 0 评论 -
Android.bp使用
Android.bp以及相关支持,从Android Nougat开始加入,从Android Oreo(8.0)开始默认开启。推荐个源码查看网址:http://aospxref.com/可以在http://aospxref.com/android-10.0.0_r2/xref/build/soong/androidmk/cmd/androidmk/android.go网页上看到Android.bp和Android.mk的对应关系func init() {91 addStandardPrope原创 2020-05-23 15:32:48 · 3632 阅读 · 0 评论 -
从Activity的setContentView方法说起
一、布局文件加载在Activity中的onCreate方法中一般都有通过setContentView设置布局。 //Acvivity.java public void setContentView(@LayoutRes int layoutResID) { getWindow().setContentView(layoutResID); i...原创 2020-02-29 20:06:46 · 409 阅读 · 0 评论 -
Android源码编译
一、编译流程1、在源码根目录打开命令行,使用如下命令初始化编译环境source build/envsetup.sh2、选择编译版本lunch xxVersion(适用于版本号已知)lunch (从弹出的选择版本列表中选择版本)3、make (或者make -j 并行编译, j 取cpu核心数的两倍比较适宜)二、踩坑之旅1、FAILED: out/target/c...原创 2019-01-17 21:07:11 · 1138 阅读 · 0 评论 -
Android.mk编译内置无源码apk
有个编译好的第三方apk,合入到系统中,在packages\apps目录创建文件夹wukong,将第三方wukong.apk拷贝到wukong文件夹下,并在wukong文件夹创建Android.mkLOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_MODULE:= wu...原创 2019-09-20 19:24:30 · 403 阅读 · 0 评论 -
从startActivity说起
不管是从一个应用的界面跳转到另外一个应用界面还是点击桌面应用程序图标进入应用界面都有一个跳转的动作,而这个跳转的具体流程就要从startActivity说起(本文基于android9.0-api28)。一、暂停旧的activityActivity的startActivity方法继承自其父类ContextWrapper(ContextWrapper中的startActivity方法又继承自抽...原创 2019-09-21 23:12:05 · 302 阅读 · 0 评论 -
Settings启动以及加载第三方系统apk
Settings源码在\packages\apps\Settings目录下(vendor下可能也有oem定制的设置)。查看AndroidManifest.xml可以看出Settings的主Activity是Settings,但是进入Settings.java发现里面只是声明了一些Activity,所有的Activity都继承SettingsActivity。<activity an...原创 2019-09-25 20:27:11 · 1757 阅读 · 0 评论 -
startService过程
在Activity中执行 startService(new Intent(this, MyService.class)),双击进入发现进入了ContextWrapper的startService方法里面@Overridepublic ComponentName startService(Intent service) { return mBase.startService(se...原创 2019-09-30 20:15:52 · 606 阅读 · 0 评论 -
Android.mk文件学习
1、LOCAL_PATH:= $(callmy-dir)‘:=’是赋值的意思,LOCAL_PATH定义了当前模块的相对路径,必须出现在所有的编译模块之前。它用于在开发树中查找源文件。在这个例子中,宏函数’my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。2、include $( CLEAR_VARS)CLEAR_VARS由编译系统提...原创 2019-02-15 17:00:17 · 792 阅读 · 0 评论