
Android系统
文章平均质量分 88
迷你球
从事android系统开发工作,从底层到应用层都有涉及。
展开
-
Android input之IMS初始化
前言在input子系统中,有两个主要角色,reader和dispatcher。前者通过EventHub读取input事件,然后将读取到的事件封装成rawevent放到queue中,而后者则是从该queue中拿rawevent并进行消费,对该事件进行分发,决定是否将该事件传递给应用。InputReader和InputDispatcher是两个线程,先看看这两个家伙怎么启动的。然后再分别看是如何分工协作的。IMS初始化Android中用来处理输入相关的服务是InputManagerService,该服务原创 2021-04-08 17:07:37 · 217 阅读 · 0 评论 -
Android10.0应用安装白名单---添加签名校验
背景为了避免系统被安装上各种各样的app,客户要求系统需要有个安装白名单的功能。文章目录背景思路Android应用签名apk安装白名单进行签名校验获取apk签名的证书指纹android源码中获取证书指纹签名校验结语微信公众号思路白名单功能主要是通过确认要安装的应用是否在白名单上,如果不在,则不允许安装。筛选的标准可以通过包名进行判断。但单纯包名进行判断还是不够安全,这里是想再加个签名校验的机制,毕竟每个签名都是独一无二的。这个过程,主要难点在于如何获取各个apk签名。在说明如何在代码中获取到系统签原创 2021-03-10 09:52:47 · 1613 阅读 · 1 评论 -
基于Android10.0适配应用界面--修改系统源码
前言原始的需求是这样的,客户会在系统中预装多个应用,但某些应用是没有经过适配的,客户要求的像素密度是160,但某些应用在该像素密度下显示会显得很小。客户不想改应用,要求在该160的像素密度下,也要能够正常显示应用。思路思路一 动态切换像素密度(糟糕的思路)初期是通过adb shell指令进行切换测试的。经测试,这些在160像素密度下显示异常的应用,在320的像素密度下,则能显示正常。也就说只要保证在显示异常的应用时,系统像素密度切320,则能解决此问题。指令如下:wm density 320 //原创 2021-02-20 19:47:34 · 572 阅读 · 0 评论 -
内核notifier机制应用
前言最近在Android10.0系统上调试TP驱动,需要增加双击唤醒功能。so easy,在驱动的suspend和early_suspend接口中获取系统待机标志,然后在触摸事件处理函数上根据该标志位进行判断,如果已经待机,则上报POWER事件,如果正常工作状态,则上报触摸事件。当然,事与愿违的事情很多,不差这一件。在调试的过程中,发现内核中已经没有early_suspend相关的接口,SDK提供方也没做相关实现。那系统进入浅睡眠的时候,TP驱动中如何知道系统已进入待机?在这个过程中尝试了三种方法:原创 2020-09-21 17:27:44 · 791 阅读 · 0 评论 -
Android studio项目添加c++文件
前言Android studio工程中经常会用到native 方法,方法之一是在libs文件夹中引入so文件,这样需要用到native方法的类直接调用如下方法加载库即可:System.loadLibrary("test-lib");如果不想引用so文件,想要直接在AS中实现native方法也是可以的。此时需要在项目中添加cpp文件,且需要做相关的配置,下面详细说明。概述环境准备要想在AS中编译cpp文件,则需要下载NDK和安装cmake工具,否则无法使用。NDK和cmake的安装很简单,AS原创 2020-09-07 11:00:54 · 4950 阅读 · 1 评论 -
Android9.0针对Toast的特殊处理
前言我们都清楚,Toast显示时长有两个选择,长显示是3.5秒,端显示是2秒。那如果想要做到长时间显示,该怎么做呢?有个历史遗留的app通过开一个线程,不断调用show方法进行实现,这些年也没出过问题,直到系统版本更新到了Android9.0。实现方式大概如下:mToast = new Toast(context);mToast.setDuration(Toast.LENGTH_LONG);mToast.setView(layout);...mToast.show(); //在线程里不断调用s原创 2020-08-25 14:31:15 · 723 阅读 · 0 评论 -
Android view的显示
前言我们通过startActivity方法来启动一个activity,宏观上来看,当我们调用该方法的时候,APP就启动了,整个界面显示,此时可以开始交互,点击或滑动。但系统在其中做了不少动作,创建进程,创建Application,创建Activity,利用AMS对activity进行生命周期管理,当一切准备就绪,调用activity的onCreate方法,将自定义view内容填充到DecorView(具体是填充到ContentParent对象中)中,接着执行resume该activity,调用makeVi原创 2020-08-06 09:34:46 · 754 阅读 · 0 评论 -
Activity是如何创建出来的?(下)
前言当我们调用startActivity方法来启动某个Activity时,系统需要根据该Activity所在进程是否存在而做不同的处理,如果不存在,则需要AMS通过socket向Zygote大佬发起进程fork的请求,接着再从fork出来的子进程中run对应APP进程的ActivityThread main方法。这个过程可以看本文序列文章《我是怎么把一个个APP进程创建起来的?》。而在这之后,就开始了Activity的创建。这个过程可以看《Activity是如何显示出来的?(上)》。这一章节承接上一个原创 2020-07-20 19:56:12 · 427 阅读 · 0 评论 -
Activity是如何显示出来的?(上)
前言如题所示,Activity是如何显示出来的呢?简单,调用startActivity就可以启动目标Activity了。很方便,但其实也隐藏了很多细节。startActivity后发生了什么事?怎么一个简单的接口就能启动一个界面,且该界面所在进程还未启动过。本篇文章承接《我是怎么把一个个App进程创建起来的》,描述接下来发生的事。概述想要启动一个Activity,首先得启动它的进程,由AMS将启动进程的需求发给Zygote,由这位大佬fork出一个进程,然后启动。启动的入口是ActivityThrea原创 2020-07-09 11:15:53 · 504 阅读 · 0 评论 -
浅谈Binder
前言最近沉迷于Android源码中无法自拔,只是苦于内功浅薄,很多东西看得云里雾里。起初对Android图形系统比较感兴趣,一头扎进去,不到片刻,就再也找不到“线头”。原因之一在于Android在启动一个activity到从LCM中显示出来图像,使用了大量的Binder通讯,各种IXXX,BpXXX,BnXXX蜂拥而出,各种类派生,看得头皮发麻。于是将图形系统放在一边,转战Binder通讯。概述Android系统中充满各种各样的进程,每个进程肩负着不同的任务。当某个进程处理不了的事情,则可以丢给其他能原创 2020-06-29 10:45:51 · 179 阅读 · 0 评论 -
Zygote的启动流程
前言Android系统开发,zygote显然是接触很多的一个术语。那zygote是什么呢?好奇查了下zygote的中文翻译:受精卵。这是我见过最形象和最正确的命名。顾名思义,就是孵化下一代。Android中,Zygote是所有App的父进程,所有的app都由它孵化而出,可见zygote的地位,堪比女娲造人。那zygote在Android系统中是如何启动的呢?概述众所周知,Android系统是跑在Linux内核上的,姑且将zygote看成是跑在Linux上的一个Linux应用。那么zygote想要启动,原创 2020-06-03 19:37:40 · 573 阅读 · 0 评论 -
Android源码阅读神器-openGrok的搭建
前言阅读Android源码这样庞大的代码,没有一个趁手的工具,会比较难受。之前都是通过vim来阅读源码,但没有做相关的vim插件配置,所以每次都需要进行grep,效率极低。后来尝试在ubuntu中使用sourceinsight,效果也不是特别好,不流畅,而且同步代码时比较慢(可能是我电脑性能问题)。后面尝试了openGrok,一个让我欲罢不能的阅读源码的工具。但在搭建openGrok的时候,还是遇到了不少问题,可能openGrok或者tomcat版本不对,或者我配置的方法问题,导致一直踩坑。这里分享下搭原创 2020-06-01 11:36:03 · 1123 阅读 · 0 评论 -
MTK平台Android9.0 NVRAM的读写---上层实现SN和MAC读写
前言MTK平台有自己的序列号和MAC地址烧录工具,但只能用于个人的调试,如果产品要量产,还使用MTK平台自己的烧录工具,则就不合适了,因为满足不了工厂生产的一些客制化功能,比如SN号和MAC地址拼凑在一起同时烧录,MTK烧录工具就做不到。那么就需要设备厂商自己开发烧录工具了。本文就是解决MTK 平台Android9.0上如何通过应用层来进行读写SN号和MAC地址。概述在MTK平台中,SN号和MAC地址都是保存在NVRAM中的,所以读写SN号和MAC地址,实际上就是对NVRAM进行读写操作。而在Andr原创 2020-05-15 16:52:29 · 2669 阅读 · 0 评论 -
Android系统升级流程---下篇
前言紧接着Android系统升级流程上篇,在上篇中,大概介绍了调用installPackage方法后发生的一系列的事,在这期间,系统准备好升级包,向misc分区中写入升级指令,接着重启进入recovery模式,本篇文章作为Android系统升级流程下篇,大概介绍重启后发生的事。概述一般来讲,Android有三种启动模式:Fastboot模式,Recovery System 以及Main System。那系统开机的时候,是根据什么来判断进入对应模式的呢?或者说,系统怎么判断要进入recovery模式的呢原创 2020-05-12 16:09:24 · 680 阅读 · 0 评论 -
Android系统升级流程---上篇
前言大部分Android设备出厂时的软件大都是带着bug风险(低风险)出货的,后期再通过OTA的方式去升级修订补丁。在满足主要功能正常使用的情况下产品抢先出货,其他小功能再通过迭代更新。这个功能的重要性不言而喻。今天就来看看Android系统的升级流程。概述一般Android升级流程是,由软件发放端推送软件到服务器,然后由服务器向Android设备推送升级包。在Android设备中,一般会有一个系统服务用于检测是否有版本更新,如果有更新包,则下载下来,下载完成并校验成功后,通过调用系统的接口进入升级流原创 2020-05-11 09:11:52 · 1025 阅读 · 0 评论 -
Java中的CRC校验
前言最近客户有CRC校验的需求,即希望Android端对字符串进行校验,并将生成的2个字节的CRC校验码追加到字符串中,然后一起写入文件。当系统联网后,会通过写入的字符串去向服务器请求设备序列号,服务器会根据该字符串的原始字符串(不含校验码)进行校验,如果校验出来的值跟最后两个字节的校验码匹配上,则下发一个序列号,否则为空。概述CRC的校验方式多种多样,每个客户都有自己的校验方式。此次...原创 2020-04-20 18:06:38 · 10260 阅读 · 1 评论 -
踩坑之默认输入法配置
前言在实际项目开发过程中,需要集成客户的输入法,但Android原生并不支持输入法的配置。在这里记录下实际操作。支持默认输入法配置Android原生并不支持默认输入法的设置,默认就是谷歌原生的输入法。如果要默认配置使用搜狗输入法或者QQ拼音输入法的话,可以使用如下方法:1.安装对应输入法的安装包,install或者系统内置都可以;2.在设置的数据库中直接加载默认的输入法fr...原创 2020-03-13 12:12:06 · 612 阅读 · 0 评论 -
Android的自救---RescueParty
前言不知道你有没有遇过,就是有时系统开机异常,会直接进入到一个机器人的error界面。我这边就遇到,在OTA升级后,开机后会自动重启,且进入到机器人error界面。经查找,是由于有一个进程在系统开机的时候,不断重启,触发了RescueParty机制,今天在这带大家稍微了解下这个机制。RescueParty目前市场上的消费者包括小白用户,当他们的手机出现无限循环启动的异常时,用户没有办法修复异...原创 2020-02-24 19:07:14 · 2425 阅读 · 0 评论 -
Android9.0的默认配置
前言Android系统的一些默认配置,需要根据客户的需求进行具体的配置。在这里记录Android9.0的一些默认配置方法。方法论在源码中寻找某个配置的默认值时,先确认这个配置是否存在默认值,且该配置是否有状态保存,一般来说,这些状态数据会保存在setting的数据库中。判断方法只要满足如下两个条件,则说明该配置存在默认值:1.重启之后,配置状态值仍然保存;2.恢复出厂设置后,配置状...原创 2020-02-21 10:35:10 · 1329 阅读 · 2 评论 -
Android9.0 如何实现动态权限白名单
前言此次使用Android9.0做一个动态权限白名单的功能,即客户要求他们的app默认就该应用所有的权限,在运行过程中,不需要去动态申请权限,即不弹窗。在Android M之前, Runtime permissions是直接被当作是install permissons,即在安装的时候就直接grant了。而在 Android M以后, Android加入了runtime permissions...原创 2020-02-19 10:04:58 · 4170 阅读 · 1 评论 -
Android9.0勿扰模式【Do Not Disturb】
前言最近使用客户的launcher设置音量时,会弹出一个界面,用于授权,用于给【勿扰模式】进行授权。授权界面的源码通过adb shell 指令获取当前的包名和界面,发现显示如下:com.android.Settings.Settings$ZenAccessSettingsActivity明显界面已经跳转到了原生setting app,一番搜索,该界面的实现源码如下:packages/...原创 2020-02-16 16:33:52 · 13269 阅读 · 0 评论 -
Android系统源码代码混淆
前言刚好有个项目需要提供apk给客户,所以需要对该apk进行代码混淆。在此将遇到的坑记录下来,避免后续再踩。代码混淆代码混淆主要是增加“不法分子“对apk进行反编译后,阅读代码的难度。代码混淆并不是所有的代码都可以混淆,有些代码则是不能混淆的,如一些反射应用。开启混淆这里记录遇到的第一个坑,在apk的Android.mk文件中,增加如下语句:LOCAL_PROGUARD_ENABLED...原创 2019-10-25 20:26:29 · 1754 阅读 · 0 评论