笔记
DJLZPP
不积跬步无以至千里,不积小流无以成江海
展开
-
增加一个物理按键导致外接耳机音量键和暂停键无法响应
前段时间开发了一个功能,kaios设备上新增了一个物理按键,此按键用来进行快捷拨号,可以添加一个号码,通过点击三次实现拨号,我实现此功能的策略是选择了一个系统不用的按键F12,通过替换的方式,将F12替换为新增按键Qd,具体实现可见新增物理按键处理-kaios,当时开发完成之后详细测试了设备的基础功能,已经按键,没发现问题,最近测试同事给报出来外接耳机无法响应音量键和暂停键了,这里记录下调查此问题...原创 2020-03-16 19:26:26 · 1770 阅读 · 1 评论 -
AndroidQ SystemUI之锁屏加载(上)滑动锁屏
本篇来分析下Android锁屏的加载流程,锁屏加载比较复杂,涉及framework和SystemUI,这篇主要分析SystemUI部分,锁屏有两种,一种滑动锁屏,另一种密码锁屏,也叫Bouncer。前面AndroidQ SystemUI之启动 中分析了SystemUI启动过程中会加载一个config数组,里面定义了SystemUI的重要的类,之后遍历此数组,以此调用其Start方法,锁屏的加载就...原创 2020-02-29 11:30:53 · 2696 阅读 · 0 评论 -
AndroidQ SystemUI之插件化基本用法实例
上一篇文章AndroidQ SystemUI之插件化机制Plugin以SystemUI启动时加载的一个插件化接口分析了插件化的基本原理,这篇来看看插件的用法:回顾上一篇文章,SystemUI启动加载了一个插件接口OverlayPlugin,Dependency.get(PluginManager.class).addPluginListener( new Plu...原创 2020-02-24 17:13:05 · 3439 阅读 · 0 评论 -
AndroidQ SystemUI之插件化机制Plugin
这篇文章接着上一篇SystemUI之启动未分析完的SystemUI插件化机制相关的代码SystemUI插件SystemUI插件提供了一种快速创建SystemUI功能原型的简便方法,可以在运行时更改SystemUI的行为。 这是通过创建插件可以期望在SysUI中使用的一组基本接口来完成的,然后可以以比当前更快的速度迭代由该接口控制的部分代码。简单来说就是可以快速替换SystemUI原有的组件,...原创 2020-02-20 18:36:05 · 6771 阅读 · 1 评论 -
AndroidQ SystemUI之启动
从本篇开始准备写一下关于SystemUI相关的东西,SystemUI包含的东西挺多的,顶部的StatusBar,中间的Lockscreen,底部的NavigationBar等等,可以说SystemUI就是一台手机的门面,是用户对手机系统的第一印象,非常重要我们从SystemUI的启动开始分析,SystemUI作为一个系统Service,是在SystemServer中启动的SystemServe...原创 2020-02-20 16:34:31 · 1540 阅读 · 2 评论 -
AndroidQ Handler消息机制(native层)
本篇接着AndroidQ Handle消息机制(java层)分析native层的相关实现,我们一般了解handler的都知道在有消息的时候取出消息进行处理,没有消息则陷入休眠,但我们从上一篇并没有看到哪里有明显的睡眠和唤醒,其实这都是在native层实现的,可以说handler消息机制的核心就在native层,所以我们这篇文章来看看native的实现细节MessageQueue中有许多的nati...原创 2020-02-19 10:32:20 · 987 阅读 · 0 评论 -
AndroidQ Handler消息机制(java层)
本篇文章基于AndroidQ分析Handler消息机制java层的实现Handler消息机制一般用于线程间的通信,A线程可以通过消息机制向B线程发送消息,只要获取到B线程的Looper对象,我们用的最多的就是在子线程获取数据之后在主线程更新UI,我们从一个简单的例子开始源码分析:public class MainActivity extends Activity { private ...原创 2020-02-18 14:21:30 · 767 阅读 · 2 评论 -
Activity启动窗口(StartingWindow)的添加流程
本篇基于Android Q分析在Activity启动的时候,Android系统会它一个启动窗口,作用是在应用程序主Activity还没有显示出来的时候,它作为一个预览窗口先让用户能看到一个画面,起到缓冲的作用,我们来分析下启动窗口的添加流程ActivityStack.startActivityLockedvoid startActivityLocked(ActivityRecord r, A...原创 2020-01-19 10:42:31 · 4150 阅读 · 0 评论 -
Android特殊窗口之输入法窗口的添加策略
本篇基于Android Q代码根据AppWindowToken和WindowToken的添加流程和排序规则我们知道Android细分了四大窗口容器,分别是存储输入法相关的mImeWindowsContainers,存储系统窗口的mAboveAppWindowsContainers,存储应用窗口的TaskStackContainers,存储壁纸窗口的mBelowAppWindowsContaine...原创 2020-01-13 23:05:21 · 2837 阅读 · 2 评论 -
AppWindowToken和WindowToken的添加流程和排序规则
本篇基于AndroidQ代码分析我们知道Android系统有三种类型窗口,应用窗口,系统窗口,子窗口,无论哪种窗口在WMS都会用一个WindowState来描述,Android窗口Z轴计算以及WindowState排列规则详细介绍了WindowState的排列规则,每个窗口都需要一种token以识别身份...原创 2020-01-10 18:29:14 · 7790 阅读 · 10 评论 -
从一个截屏窗口的创建看Android的窗口机制
从一个Dialog的创建看Android的窗口机制(上篇)和从一个Dialog的创建看Android的窗口机制(下篇) 从应用类型窗口的创建分析了Android的窗口机制,这篇打算从系统窗口再来分析下,看看不同类型窗口的添加有何异同,选了一个比较简单的截屏窗口来看,我们都知道Android默认提供了截屏功能,通过POWER+音量下键可以完成截屏,接着从代码角度看看截屏窗口是如何添加的在Syste...原创 2020-01-09 11:54:47 · 912 阅读 · 0 评论 -
Android窗口Z轴计算以及WindowState排列规则
本篇基于Android Q代码,建议先看从一个Dialog的创建看Android的窗口机制(上篇)和从一个Dialog的创建看Android的窗口机制(下篇)大致了解窗口的添加机制再看本篇本篇主要分析Android窗口的Z轴计算规则以及根据Z轴对窗口的排列规则,从之前两篇关于Dialog的分析知道了窗口的添加最终会到WMS的addWindow方法中,窗口的Z轴计算就是在addWindow方法中进...原创 2020-01-07 20:14:41 · 5571 阅读 · 7 评论 -
从一个Dialog的创建看Android的窗口机制(下篇)
从从一个Dialog的创建看Android的窗口机制(上篇)讲到一个Dialog是如何将自己的布局文件加载到DecorView的,这篇主要讲DecorView如何添加到Window上去WindowManagerGlobal.addViewpublic void addView(View view, ViewGroup.LayoutParams params, Displ...原创 2020-01-06 15:10:28 · 1598 阅读 · 0 评论 -
从一个Dialog的创建看Android的窗口机制(上篇)
本篇从Dialog的创建来看一看Android的窗口是如何添加的,写个Demo,简单的例子创建一个Dialog,点击button,Dialog显示出来public class MainActivity extends Activity { private Button button; @Override protected void onCreate(Bundle sa...原创 2020-01-04 18:20:35 · 1906 阅读 · 4 评论 -
Android系统时间同步NetworkTimeUpdateService
Android系统时间更新有两种方式:NITZ时间和NTP时间,NITZ由运营商提供,通过sim卡更新时间,NTP为通过网络,访问服务器获取时间,这里主要介绍NTP的方式。NetworkTimeUpdateService启动NetworkTimeUpdateService作为Android系统服务,在SystemServer中启动private void startOtherServices...原创 2020-01-03 23:04:12 · 2404 阅读 · 0 评论 -
Android Q完全禁止NavigationBar滑出来
背景最近项目集成了三方锁屏应用,系统针对这个应用也需要做相应的特殊处理,比如禁用NavigationBar全部功能google提供了隐藏NavigationBar的API,但这个API只能在隐藏并不能完全禁止NavigationBar,如果自己从底部还是可以将NavigationBar滑出来的 View decorView = getWindow().getDecorView(); int...原创 2019-12-27 14:34:38 · 2296 阅读 · 2 评论 -
Android Q上三方应用调用disableKeyguard接口带来的问题
概述今天测试同事报了一个问题,概率性的,不管在什么界面玩手机,玩着玩着,就可能突然跳出来keyguard给把手机锁屏了,拿到手机看了下,测试机没有设置pin/password/pattern,首先猜测是某个三方应用将锁屏禁用掉了,google提供了禁用锁屏的API,但是google已经不建议用了,未来或许会删除 KeyguardManager keyguardManager =...原创 2019-12-26 19:32:42 · 2825 阅读 · 2 评论 -
Android窗口与Token对应策略
概念Android窗口分为三种类型,应用窗口,子窗口,系统窗口每种类型窗口必须对应有一个身份标识Token,Token一般是一个binder对象主要来看三种窗口的Token是如何分配的addView任何窗口的添加都会到这个方法,该方法会设置Window对应的Token,并且创建三个ArrayList,每一个Window的View,ViewRootImpl,LayoutParams会一一对...原创 2019-12-20 11:15:36 · 1731 阅读 · 1 评论 -
Android Q安全锁屏下进入google photos不弹bouncer界面
复现步骤Andoird 10平台,设置锁屏密码(pin/passowrd/pattern)->双击power键启动camera->拍照->点击左下角预览->进入google photo->(KO,此时无法弹出bouncer界面输密码,而是直接返回锁屏界面)还有个比较奇怪的现象是当photos启动之后主activity未被销毁即没有点击back就不会复现此问题了,当...原创 2019-12-17 19:14:27 · 1163 阅读 · 1 评论 -
新增物理按键处理-kaios
最近新项目设备新增了一个物理按键,功能是quick dialer,快捷拨号功能,设置好一个手机号码通过快速点击三下实现拨打功能,我主要负责事件上报到上层js,并在三次点击之后发送event以通知dialer拨打电话,记录一下实现流程,因为做这个功能的时候新设备还没到因此用VolumeDown模拟quick dialer实现上报。先将/system/usr/keylayout下的所有定义了Volu...原创 2019-12-12 16:43:08 · 1069 阅读 · 1 评论 -
AIDL中的in,out,inout原理篇
AIDL中的in,out,inout用法篇主要对跨进程传输对象三种定向tag方式的用法进行了讲解,验证了以下结论:in:由cilent端流向server端,server端可以收到此对象的所有数据,收到之后会重新创建一个新的对象将数据填充进去,因为cilent端和server端是两个不同的对象,所以server端对数据的修改不会影响到client端的对象。out:由server端流向client...原创 2019-12-08 16:34:22 · 978 阅读 · 1 评论 -
AIDL中的in,out,inout用法篇
Android两个进程间内存相互独立不能互相访问,跨进程传输非默认类型对象需要先序列化,而不能直接简单传递引用,序列化的目的是将对象数据以能够在内存中流通的形式从一个进程传递到另一个进程,两个进程对象的传递类似深度clone,client端将对象数据写入Parcel(writeToParcel),server端从Parcel(readFromParcel)读取对象数据并重新创建一个同样的对象将读取...原创 2019-12-08 16:23:58 · 3555 阅读 · 1 评论 -
[Google CTS]android.app.usage.cts.UsageReportingTest#testSplitscreenSameTokenTwoMissedStop test fail
testSplitscreenSameTokenTwoMissedStop今天出现一条CTS的fail,之前没出现过,复现步骤必须设置锁屏为none,设置swipe能跑过的,比较奇怪的是之前版本没有出现过,问了测试同事,发现我们这次跑的时候是用多台机器分开跑,于是想明白了,以前全跑的时候应该是跑这条case之前有其他case将锁屏设置为swipe了,这次由于分开跑,这条case和设置swipe的...原创 2019-12-06 15:54:58 · 748 阅读 · 1 评论 -
Android Q notification创建发送流程-SystemUI篇
Android10 notification创建发送流程-framework篇分析了通知是如何从framework发送到NotificationListenerService的onNotificationPosted方法的,这个方法其实并没有具体实现,需要子类实现具体逻辑,这篇文章接着上一篇分析SystemUI部分通知的处理流程。NotificationListenerWithPlugins继承...原创 2019-12-06 12:20:19 · 2480 阅读 · 10 评论 -
Android Q notification创建发送流程-framework篇
基于Android10源码分析notification创建到添加到systemui的流程本篇主要分析framework部分以下是发送一个简单notification的示例代码: public static final int NOTIFY_ID = 110; NotificationManager notificationManager; private void se...原创 2019-12-04 19:16:33 · 3298 阅读 · 4 评论 -
Android无法解锁debug
Android密码验证这条流程几乎没什么log,遇到无法解锁或者解锁慢的问题需要手动添加log(1)frameworks层log/frameworks/base/services/core/java/com/android/server/locksettings/LockSettingsService.javaprivate static final boolean DEBUG = fals...原创 2019-12-03 15:58:49 · 1661 阅读 · 1 评论 -
C++层打堆栈
C/C++打函数调用栈#include <utils/CallStack.h>android::CallStack stack((“djtang”));11-28 16:40:20.478 28858 29024 D djtang : #00 pc 01272b2b /system/b2g/libxul.so (_ZN20GeckoInputDispatcher9notify...原创 2019-11-28 16:41:50 · 811 阅读 · 1 评论 -
应用窗口与InputDispatcher之间的桥梁:InputChannel
InputDispatcher接收InputReader读取到的事件,分发给对应窗口,InputDispatcher属于system_server进程和各个应用不在同一进程,它们之间的联系靠的就是InputChannel。handleResumeActivity直接从ActivityThread的handleResumeActivity开始,Activity的DecorView会被添加到Win...原创 2019-11-26 15:38:38 · 2324 阅读 · 1 评论 -
数据结构之循环队列
队列队列是一种先进先出的数据结构,就像排队买火车票,先去的人先买到票先走,后去的人就只能排在最后面,队列只允许在两端进行操作,即尾部插入元素,头部取走元素,普通队列处理元素有两种方式,一是头部元素依次出队,后面的元素跟着向前移动一位,当数据量非常大时这样效率比较低。二是指针从头部往后移,依次取出所有元素,这种方式会导致取出元素的位置空了但是不能继续往里面放,即尾部已满但头部还是空的,这样会浪...原创 2019-11-23 16:49:46 · 2979 阅读 · 2 评论 -
Scancode到Keycode的映射
之前分析的InputReader读取底层事件可以得知 InputReaderThead启动之后会通过mEventHub->getEvents读取设备节点的所有事件,通过parsekey方法解析kl文件存入数据结构map,在读取节点事件之前先扫描设备,如果没有打开则打开设备,在打开设备时会将scancode和keycode一一映射,此篇文章记录他们是如何建立映射关系的起来的/framewor...原创 2019-11-22 18:54:25 · 3663 阅读 · 1 评论 -
新增物理按键处理流程-Android
最近项目新增了一个物理按键,当system添加好scancode之后,记录一下上层的处理流程。djtang:/data1/localProject/Tokyo_TF$adb shellSeoul_TF:/ $ Seoul_TF:/ $ geteventadd device 1: /dev/input/event2 name: "mtk-tpd"add device 2: /d...原创 2019-11-20 19:59:11 · 877 阅读 · 1 评论 -
集成三方锁屏应用带来的CTS/GTS问题
最近项目要求集成三方锁屏应用代替原生swipe锁屏,出现了几个CTS/GTS问题,记个小笔记1.因为三方锁屏需要完全替代掉原生swipe,所以将swipe禁用掉了,Settings中也是不可以选的,结果出现 [Google CTS]android.app.usage.cts.UsageReportingTest#testSplitscreenSameTokenTwoMissedStop tes...原创 2019-11-19 19:33:10 · 1022 阅读 · 0 评论 -
NDK环境搭建
1.环境搭建1.Android Studio中下载如下图的三个tools2.配置ndk环境变量,path中添加ndk的路径3.命令行输入ndk-build,出现如下图输出,代表环境变量配置成功4.Android Studio中新建native方法并导入链接库文件5.打开Android studio自带终端,进入项目app\src\main\java目录,执行:javah -jn...原创 2019-11-16 16:44:35 · 954 阅读 · 3 评论 -
SystemUI常见问题修改方法
AndroidO,AndroidP SystemUI问题修改笔记修改NavigationBar ‘back’ 触控范围SystemUI/src/com/android/systemui/statusbar/phone/NearestTouchFrame.java @VisibleForTesting NearestTouchFrame(Context context, At...原创 2019-05-09 18:03:24 · 2920 阅读 · 9 评论