Android
文章平均质量分 68
aaajj
一起学习吧
展开
-
【Android】MediaCodec学习
在开源Android屏幕投屏代码scrcpy中,使用了MediaCodec去获取和display关联的surface的内容,再通过写fd的方式(socket等)传给PC端,这里我们做另外一个尝试,读取手机中的mp4文件,显示到app的surface上,来学习MediaCodec的使用。playVideo的处理需要在另外一个线程中执行,不能在主线程执行,不然只能显示停止的一个画面。如果返回的索引大于等于0,则说明有可用的输出缓冲区。注意,这里的mp4文件放在了sdcard中,需要获取读取权限。原创 2024-01-28 20:23:26 · 1155 阅读 · 0 评论 -
【Android】app中阻塞的looper为什么可以响应touch事件
这里直接给出答案,input事件传送给了系统IMS,IMS通过inputchannel把input传送给应用,而应用中的主线程looper监控了inputchannel的fd,这里,我们考虑一个问题,Android中的应用是一个looper线程,没有任务时就阻塞着,其他线程通过handler调用等方式向主线程looper发送任务,这里,打不过就加入,把inputchannel的fd也加入到主线程looper的epool监控之中。如果点击应用上的按钮,应用是怎么及时响应的呢,这个构造方法,调用其父类的构造。原创 2024-01-21 16:06:55 · 1137 阅读 · 0 评论 -
从权限跳转看Activity的data android:scheme
请注意,根据不同的Android版本和设备制造商,界面的外观和可用选项可能会有所不同。确保你的应用程序具有适当的权限,以请求用户打开通知助手设置界面。在应用申请悬浮窗权限的时候,可以跳转到相应的设置界面,并且自动切换到应用的条目,高亮显示一下,上述代码将打开通知访问权限设置界面,其中用户可以配置通知助手相关的权限。而申请通知访问权限时,在跳转的页面中没有高亮显示应用的条目,为什么呢,上述代码会打开一个系统设置界面,允许用户授予悬浮窗权限。android悬浮窗权限怎么申请。原创 2023-11-22 21:30:56 · 854 阅读 · 0 评论 -
【Android】关于touch设备TOOL_TYPE_STYLUS
在 Android 中,触控笔(Stylus)是一种特殊的输入设备,它可以提供更精确和细致的输入方式。Android 提供了相应的触控笔事件处理机制,以支持触控笔的使用。触控笔事件与触摸事件略有不同,因为触控笔通常提供了更多的信息,如压力、倾斜角度等。方法,可以接收触控笔事件。你可以根据事件的类型和属性来处理触控笔事件。类表示,它提供了许多有用的方法来获取触控笔事件的信息。这里通过log来查看触控笔的motionEvent,方法可以检测事件的工具类型,通过。方法可以获取触控笔的倾斜角度等。原创 2023-10-14 12:35:08 · 566 阅读 · 0 评论 -
Service onUnbind学习
Service 的onUnbind在所有的连接断开后才执行,就是这么设计的,所有连接断开后才通知service,为destory作准备。注意关键词: all clients have disconnected。那么onBinde是只调用一次么,这也是个问题,可以试验一下看看,多个客户端连接的时候,只调用一次,可能也是进行了类似的缓存操作,另外,service没有提供查看连接数量的方法。查看Service onUnbind的定义。原创 2023-07-31 21:38:03 · 290 阅读 · 0 评论 -
问问GPT:android中怎么使用tensorflow
绘制关键点的具体实现可能因应用程序而异,具体的实现方式取决于应用程序的需求。但是,使用 Canvas API 在屏幕上绘制关键点的基本思路是相同的:创建一个 Paint 对象,设置绘制属性,然后使用 drawCircle() 或者其他绘图方法在屏幕上绘制关键点。总之,在 Android 中使用 TensorFlow,你需要将 TensorFlow Lite 库添加到你的项目中,将训练好的 TensorFlow 模型转换为 TensorFlow Lite 模型,然后使用 Java API 加载和运行模型。原创 2023-06-25 07:48:24 · 1018 阅读 · 0 评论 -
游戏中用脚开飞机实现方案
看看这个图片,有人用脚开飞机,用几个踏板去控制,在游戏中,开飞机的操作比较简单,上升,下降,加减油门,方向左,方向右。android设备中,使用模拟点击就可以实现这个功能,在操作踏板的时候发送对应的touch事件,具体可以参考。原创 2023-06-19 21:18:33 · 136 阅读 · 0 评论 -
【Android】CountDownTimer的使用
最后,我们使用CountDownTimer实现了倒计时功能,并在onTick方法中更新了倒计时文本的内容。这样,就实现了根据给定的包名显示应用图标和倒计时的功能。在onTick方法中,可以更新UI上的倒计时时间,而在onFinish方法中,可以执行倒计时结束后的操作。在上述示例中,我们使用了一个单例对象来表示倒计时器,这样我们就可以在任何地方启动倒计时,而不用担心多次创建倒计时器的问题。在onTick方法中,我们更新了UI上的倒计时剩余时间,而在onFinish方法中,我们更新了UI上的提示信息。原创 2023-05-30 21:31:25 · 2375 阅读 · 0 评论 -
从创建AlertDialog发生crash的WindowManager$BadTokenException看Window和Surface
就这个调用,可以作为一个入口来理解绘图机制,WindowManager在这个过程中创建了Surface,WindowManager作为窗口的管理者出现在这里,其他的绘图处理就交给ViewRootImpl和SurfaceFlinger合成了,详细可参考。这个问题,只有设置了TYPE_APPLICATION_OVERLAY 就可以了,因为ViewRootImpl.setView里会判断type的值,对于不符合条件的,就抛出了异常。在service中,进行AlertDialog调用,如。这里重点关注这个堆栈。原创 2023-03-04 20:42:44 · 148 阅读 · 0 评论 -
Bundle的Parcel化处理
在Android中,使用Intent通过binder在不同进程间传送数据是很方便和通用的,Intent保持数据主要是通过Bundle来存储较多的数据。调用writeParcelableCreator,把类名信息保存起来,所以在恢复对象的时候,可以知道是什么类,Bundle中通过map来存储键值对,所以上面的例子中,使用key值来进行查找,就可以获取到value对象。Bundle的Parcel化读写比较复杂,细节较多,这里看一下大致过程,序列化的过程就是这样,再看看反序列化的关键点,调用到Bundle里。原创 2023-01-21 13:01:54 · 1886 阅读 · 0 评论 -
[Android Input系统]MotionEvent的序列化传送
PC端的客户端支持按键和鼠标滑动操作,手机上的云游戏客户端则是和手机游戏一样的touch触控,客户端的touch操作是怎样处理给服务端的呢,猜测是把touch操作“实时”的传送给了服务器,Android服务器上把这些数据转换为相应的MotionEvent事件。这里再进一步考虑一下,在Input事件分发的时候,InputDispatcher把input事件通过InputChannel发送给对应的应用进程的时候,是怎样传送input事件数据的呢,这里从云游戏的触控操作看起,原创 2023-01-15 17:26:38 · 824 阅读 · 1 评论 -
Android13 wifi无线调试adb连接设置
在进行adb调试的时候,有时候需要使用wifi连接,或者wifi连接较为方便,早些的Android上,需要设置端口等操作,手机和电脑连接同一个wifi后,在手机的开发者选项中,可以看到无线调试选项。在Android13上,无线adb连接更加方便了,可以看到,已经设置了默认的端口,不需要我们设置了,输入命令,连接这个IP和端口。可以在通知栏上关闭连接。原创 2023-01-14 13:17:26 · 3521 阅读 · 0 评论 -
Handler同步屏障学习
通常我们使用Handler的时候,post一个消息(命令)到消息队列,然后通过内部的looper处理机制从队列上依次去执行。这个时候,问题来了,如果有的任务优先级比较高,比如UI的绘制,想要优先执行,该怎么办呢?Handler机制中提供了这个功能,MessageQueue#postSyncBarrier()字面上看,对同步操作设置一个障碍,学习资料Handler同步屏障_xiaopangcame的博客-CSDN博客_同步屏障具体代码分析可以查看上面的链接资料,通过postSyncBarrier向消息队列插入原创 2022-12-04 20:10:21 · 364 阅读 · 0 评论 -
android strace使用
这个命令打印出进程的子进程的strace,所以对于应用,传人zygote进程id即可,因为应用是从zygote fork出来的,但是由于现在android上有zygote和zygote64,需要查看下应用进程的父进程是zygote还是zygote64,如果要获取应用打开时的相关strace,可以使用 strace -f -p 命令,再打开chrome,获取其PID,从打印的数据中根据PID进行筛选就可以得到chrome的相关数据。再看看zygote的进程号,原创 2022-11-13 20:05:09 · 1242 阅读 · 0 评论 -
【input学习】App对input事件的反馈与waitqueue
App端通过Looper来监听InputChannel的fd,获取数据后,调用相应的处理方法,最后会再调用InputEventReceiver的finishInputEvent方法,向InputDispatcher进行反馈,表示当前的事件处理完成,InputDispatcher收到反馈后,删除掉waitQueue(wq)中对应的记录。这里我们来看看finishDispatchCycleLocked是怎么处理到waitQueue的,这里进行了waitQueue的dequeue处理,弹出了处理过的事件记录,原创 2022-11-06 19:49:00 · 839 阅读 · 0 评论 -
从MessageQueue的removeMessages来认识anr原理
ANR检查调用超时,显然,需要有相应的检查,没有检查就没有所谓的超时,比如你上班早退了,会有人找你,你旷工,会有人找你,因为这些有监管,而如果你上班超时,到点还不走,却没有人找你,因为对这个没有监管。前面接触了handler,MessageQueue,Looper,这里趁热打铁,通过ANR的原理继续来熟悉handler相关处理。2.扫雷,任务及时完成后,调用removeMessages清理掉指定的message(根据message编码和对象来区分),1. 埋雷,发送延时消息。原创 2022-10-31 21:27:00 · 677 阅读 · 0 评论 -
MessageQueue和Looper学习
而Looper中使用epoll_wait来进行阻塞,在队列头部放入数据后,进行wake操作,通知Looper可以检查了,于是epoll_wait退出阻塞,判断队列头部数据的时间是否原创 2022-10-29 19:38:58 · 970 阅读 · 0 评论 -
sendMessageDelayed学习
这里考虑这样一个场景,比如有3个任务,需要间隔20ms来执行,(比如我们来构造3个连续的点击事件),这个时候就需要考虑怎样发起延迟调用,直接使用sleep也可以实现,但是看上去似乎不是那么优雅,会导致当前线程的sleep。在使用handlre消息队列执行任务时,常规的调用是调用post立即执行,任务按照时间顺序来执行,主要是调用了底层的epoll_wait来实现的,epoll_wait方法有时间参数。Handler中已经实现了这样的功能来方便调用,为什么可以根据传人的时间去调起任务呢,原创 2022-10-22 20:59:07 · 829 阅读 · 0 评论 -
[input分发]从MotionEvent的相对坐标来看view中touch的分发
我们可以再对多窗口进行试验,在onTouchEvent中可以发现,touch的坐标MotionEvent的getX,getY打印出来是坐标是相对于窗口的坐标,而不是屏幕原点的坐标。在前面的讨论中,我们了解到,在InputDispatcher里进行分发处理的时候,如果有2个窗口,会进行splitMotionEvent操作,对MotionEvent进行分割加工,只传递窗口自身的事件给对应的窗口。// 判断触摸点是否产生变化,例如有新的触摸点按下或旧触摸点抬起。// 触摸点ID集合无变化,则不需要进行事件拆分。原创 2022-10-16 13:39:14 · 290 阅读 · 0 评论 -
【input系统】MotionEvent的分解
在打开多窗口的时候,比如A,B两个应用窗口,我们通过onTouchEvent查看log可以发现,在A窗口上的点击事件不会传给B窗口,当有多个点击事件时,A,B接收到的事件是不一样的,也就是说,在InputDispatcher的notifyMotion中的一个MotionEvent,在传送给app的时候,会根据窗口进行拆分。可以看出,touch事件(MotionEvent)的传送多么的不容易,那么多的操作,多次加工,千辛万苦才传给了接收者。在应用中也有类似的拆分处理,原创 2022-09-29 21:03:25 · 522 阅读 · 0 评论 -
[Android]从app的trace打桩原理回顾zygote的fork
其实在应用app诞生的时候,就已经具备了这个功能,设置了回调函数atrace_update_tags,因为这个设置是在zygote里就进行好的,zygote 进程fork出app进程后,app进程已经天然的具备这个功能。应用中看上去并不需要设置属性变化的回调函数,为什么接收到来自AMS的属性变化binder通知后,自动的就可以执行回调函数,获取到相应的属性值变化呢?通过这样的方式,只要引用了这个库,在main函数开始,就会执行traeInit方法,来设置属性变化的回调函数。里,已经引用了trace。原创 2022-09-18 21:49:02 · 1145 阅读 · 0 评论 -
【systrace学习】atrace打开各系统层tag开关的原理
细节很多,这里回顾一下大体过程,atrace里设置tag,标识哪些tag可以进行写trace,然后写到属性值debug.atrace.tags.enableflags里,atrace又进行了binder调用所有系统服务的SYSPROPS_TRANSACTION对应的方法,告诉它们,属性值变化了,可以调用属性变化回调函数了。查看atrace_update_tags的定义,在里面读取属性"debug.atrace.tags.enableflags"的值,更新了atrace_enabled_tags的值,原创 2022-09-10 16:22:02 · 3015 阅读 · 0 评论 -
[Android Input系统学习]从mouse事件再看input分发
但是,我们较为熟悉的事件接收方法View#onTouchEvent里并没有调进去,在onTouchEvent里添加log,在点击的时候会有输出,但是滑动时没有输出,mouse设备的滑动难道不一样?较为直观的分析方法是打开InputDispatcher里的log开关,可以看到,滑动的时候,还是会走到notifyMotion方法,我们还可以抓取systrace来查看方法调用流程。可以看出,mouse设备的事件分发流程和屏幕touch事件的流程是一样的,只是处理细节不一样。原创 2022-09-10 12:02:48 · 950 阅读 · 0 评论 -
【Android显示学习】UIThread和RenderThread
在进行绘制的时候,RenderThread是怎样被调起来进行渲染的呢,在这里,我们继续通过对一个知识点的学习来作为基础发散点,来认识整个流程,实现整个知识点的贯穿:一点一横长,一撇到南阳。在view的绘图方法onDraw(Canvas canvas)中,我们可以添加log和堆栈,可以发现,onDraw所在的线程就是主线程,onDraw是在UI线程中执行的,渲染则是另外处理的,了解了这个主干道,就可以有个大概认识,再去了解各细节。这里回顾下显示系统的经典示意图。......原创 2022-08-28 10:34:05 · 1024 阅读 · 0 评论 -
[Android显示学习]RenderThread渲染
android显示系统中的GPU处理的RenderThread渲染理解原创 2022-08-21 17:58:05 · 2480 阅读 · 0 评论 -
【Android】Activity理解
android activity是应用功能的展现方式原创 2022-07-31 17:30:19 · 439 阅读 · 0 评论 -
minitouch点击原理
minitouch的使用不是太方便,从minitouch的通信方式可以受到启发,我们也可以仿照input命令,来实现一个上层调用接口,input命令没有处理多点事件,这里处理一下就可以了,然后通过injectInputEvent来进行事件的注入。minitouch可以实现touch事件的模拟,其touch注入原理和setevent命令类似,都是写input节点来插入input数据。交互方面,通过socket来和调用者通信,接受touch指令。...原创 2022-07-17 21:55:44 · 2690 阅读 · 0 评论 -
【Android】settings命令幕后-----cmd命令
android中pm,settings等命令,其实是执行的cmd命令调用相应服务的方法原创 2022-06-29 21:56:03 · 1028 阅读 · 0 评论 -
Input系统学习-----InputFilter
android input过滤器InputFilter的一些细节原创 2022-06-19 22:03:17 · 583 阅读 · 5 评论 -
Input系统学习-----move事件的合并
android的move事件在应用端进行了合并,合并到history数据中了原创 2022-06-12 21:09:00 · 532 阅读 · 0 评论 -
【Android】ANR学习
Android anr的原因是什么原创 2022-05-31 21:34:38 · 406 阅读 · 0 评论 -
Input系统学习-----InputDispatcher中的looper
InputReader负责获取设备的输入数据,然后发给InputDispatcher去处理,为了让2个处理独立起来,不相互影响,它们是在不同的线程中执行的,InputDispatcher里的threadLoop方法是继承的Thread的方法,会在一个while中不停的调用起来,不停的调用,会不会太占用资源?4623bool InputDispatcherThread::threadLoop() {4624 mDispatcher->dispatchOnce();4625原创 2022-05-22 22:11:49 · 247 阅读 · 0 评论 -
[Android]一个标签扫描的设计思路
问题的提出:若干个人,每人手中各有若干设备,这些设备由于使用,频繁的在不同的人里转移,没有好的管理的话,就不知道某个设备在谁手中。这个和图书管理系统有些相似,区别在于,图书的交换处理是通过图书馆的服务中心的借书和还书来进行的,书在用户间不进行交换借阅。而这个问题中,设备在用户中可能会很频繁的转移。我们考虑设计一个功能来进行处理,为了方便操作,使用二维码扫描的方式来识别各设备,android上有一些二维码的sdk可以使用。1. 每个设备贴上标识二维码2. 用户也用二维码来标识,使用扫描的方原创 2022-05-15 18:26:46 · 194 阅读 · 0 评论 -
input在应用端的分发流程分支情况
input的处理细节比较复杂,在app端时,是通过监听input channel的fd,把事件接入到主线程的looper中,所以我们可以看到,相关的处理是在主线程中进行的,再进行一个试验,在onTouchEvent方法中,对MOTION_DOWN和MOTION_MOVE 事件处理分别打印堆栈,大家觉得会是一样的么?试一下,就会发现,处理流程不一样,头尾是相同的,但是中间出现了分支,同样的touch事件,分成了2种流程,一种相思两处闲愁,这样的处理确实让人发愁。move事件的处理调用到chor原创 2022-04-30 18:39:02 · 896 阅读 · 0 评论 -
AMS学习2--线程角度看service
service主要是用来提供服务功能的进程,和activity相比,偏向于无界面形式,有几个地方需要注意:1. service的onCreate,onStart是在主线程里执行的,也是通过ActivityThread的looper来进行调度的,可以再通过消息机制再来执行其他任务,一个耗时任务可能不会引起ANR,但是如果这个耗时任务后有一个UI任务,就会导致UI任务得不到及时响应,发生ANR,这里可以作为ANR知识点的一个关联点。2. startService可以启动一个service进程,没有其原创 2022-04-23 22:18:12 · 2102 阅读 · 0 评论 -
从sensor的onSensorChanged回调看Handler的使用
在学习input的时候,通过log打印,我们知道onTouchEvent回调方法是在主线程中执行的,在使用sensor传感器的时候,回调方法onSensorChanged也会刷刷刷的执行起来。这个回调方法是在主线程里调用的么?在onCreate里进行sensorManager.registerListener注册的时候,可参考以下链接中的写法,Android Manager之SensorManager(传感器)—方向传感器(Orientation sensor)_Jamin_Ye的博客-CSDN原创 2022-04-19 22:23:19 · 2979 阅读 · 0 评论 -
AMS学习1--广播的回调
一直没有系统的学习过AMS,ActivityManagerService的代码较多,功能也比较繁琐。记得以前对所谓的“四大组件”都没有概念,平时接触过后,才有些理解,比如在蓝牙的使用练习里,就可以了解到广播的使用,进而可以深刻的理解广播,然后展开其实现原理,本质是观察者模式的注册和回调。//activity的学习可以从应用的打开过程作为入手点,从dumpsys meminfo 这样的流程了解AMS中//的IApplicationThread代理对象对app的访问。在BroadcastReceiv原创 2022-04-18 21:14:40 · 968 阅读 · 0 评论 -
【Android】从UI刷新的invalidate到input loop的知识链
在手指绘图的示例app方法中,我们可以了解到invalidate方法的调用,每调用一次,会通过Choreographer注册一次Vsycn信号回调,作为绘图onDraw调用的触发。由于是post请求,所以这里不会被阻塞住。观察onTouchEvent和onDraw里的log,我们可以发现,都是主线程,也就是说都是在UI线程中执行的,这就表示,onTouchEvent和onDraw同时作为主线程中的动作,是会相互影响,抢占执行资源。这里又有个概念出来了,设置同步屏障,可以让绘制有更高的优先级。为什么i原创 2022-04-16 15:39:28 · 996 阅读 · 0 评论 -
【Android】蓝牙设备--游戏手柄作为遥控门铃工具试验
在之前的讨论中,考虑了app间通过发起连接提示,来实现类似的门铃提醒功能,【Android】蓝牙门铃的实现--蓝牙设备的扫描_aaajj的博客-CSDN博客但是app的操作不如按钮操作方便,利用蓝牙手柄的connect广播,我们可以把蓝牙手柄作为一个遥控按钮,开始的时候,手柄和手机使用蓝牙匹配好,应用中增加对ACTION_ACL_CONNECTED的监听,在手柄蓝牙打开的时候,应用就在可以收到广播了。 /** * Broadcast Action: Indicates...原创 2022-04-13 22:04:46 · 3263 阅读 · 0 评论 -
从32位apk被限制上架的情况来看系统处理
现在的手机基本上都是64位架构,32位apk在Google 商店上已经被限制,近期国内的一些手机应用商店也表示将限制32位apk的上架,相关资料:忍不了了,oppo、vivo、小米联手宣布:不再允许|骁龙|oppo_手机网易网64位有啥好?联发科:天玑9000应用性能可提升最多近64%|android应用商店|google play|engine|googleplay应用商店|联发科|天玑|32位应用|arm|64位处理器|android安卓手机为什么要全面普及64位应用?-虎嗅网主要原因还原创 2022-04-10 22:01:29 · 2709 阅读 · 0 评论