自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(52)
  • 收藏
  • 关注

原创 Android input之IMS初始化

前言在input子系统中,有两个主要角色,reader和dispatcher。前者通过EventHub读取input事件,然后将读取到的事件封装成rawevent放到queue中,而后者则是从该queue中拿rawevent并进行消费,对该事件进行分发,决定是否将该事件传递给应用。InputReader和InputDispatcher是两个线程,先看看这两个家伙怎么启动的。然后再分别看是如何分工协作的。IMS初始化Android中用来处理输入相关的服务是InputManagerService,该服务

2021-04-08 17:07:37 157

原创 Android10.0应用安装白名单---添加签名校验

背景为了避免系统被安装上各种各样的app,客户要求系统需要有个安装白名单的功能。文章目录背景思路Android应用签名apk安装白名单进行签名校验获取apk签名的证书指纹android源码中获取证书指纹签名校验结语微信公众号思路白名单功能主要是通过确认要安装的应用是否在白名单上,如果不在,则不允许安装。筛选的标准可以通过包名进行判断。但单纯包名进行判断还是不够安全,这里是想再加个签名校验的机制,毕竟每个签名都是独一无二的。这个过程,主要难点在于如何获取各个apk签名。在说明如何在代码中获取到系统签

2021-03-10 09:52:47 1401 1

原创 基于Android10.0适配应用界面--修改系统源码

前言原始的需求是这样的,客户会在系统中预装多个应用,但某些应用是没有经过适配的,客户要求的像素密度是160,但某些应用在该像素密度下显示会显得很小。客户不想改应用,要求在该160的像素密度下,也要能够正常显示应用。思路思路一 动态切换像素密度(糟糕的思路)初期是通过adb shell指令进行切换测试的。经测试,这些在160像素密度下显示异常的应用,在320的像素密度下,则能显示正常。也就说只要保证在显示异常的应用时,系统像素密度切320,则能解决此问题。指令如下:wm density 320 //

2021-02-20 19:47:34 439

原创 内核notifier机制应用

前言最近在Android10.0系统上调试TP驱动,需要增加双击唤醒功能。so easy,在驱动的suspend和early_suspend接口中获取系统待机标志,然后在触摸事件处理函数上根据该标志位进行判断,如果已经待机,则上报POWER事件,如果正常工作状态,则上报触摸事件。当然,事与愿违的事情很多,不差这一件。在调试的过程中,发现内核中已经没有early_suspend相关的接口,SDK提供方也没做相关实现。那系统进入浅睡眠的时候,TP驱动中如何知道系统已进入待机?在这个过程中尝试了三种方法:

2020-09-21 17:27:44 677

原创 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 4554 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 638

原创 Android view的显示

前言我们通过startActivity方法来启动一个activity,宏观上来看,当我们调用该方法的时候,APP就启动了,整个界面显示,此时可以开始交互,点击或滑动。但系统在其中做了不少动作,创建进程,创建Application,创建Activity,利用AMS对activity进行生命周期管理,当一切准备就绪,调用activity的onCreate方法,将自定义view内容填充到DecorView(具体是填充到ContentParent对象中)中,接着执行resume该activity,调用makeVi

2020-08-06 09:34:46 594

原创 Activity是如何创建出来的?(下)

前言当我们调用startActivity方法来启动某个Activity时,系统需要根据该Activity所在进程是否存在而做不同的处理,如果不存在,则需要AMS通过socket向Zygote大佬发起进程fork的请求,接着再从fork出来的子进程中run对应APP进程的ActivityThread main方法。这个过程可以看本文序列文章《我是怎么把一个个APP进程创建起来的?》。而在这之后,就开始了Activity的创建。这个过程可以看《Activity是如何显示出来的?(上)》。这一章节承接上一个

2020-07-20 19:56:12 371

原创 Activity是如何显示出来的?(上)

前言如题所示,Activity是如何显示出来的呢?简单,调用startActivity就可以启动目标Activity了。很方便,但其实也隐藏了很多细节。startActivity后发生了什么事?怎么一个简单的接口就能启动一个界面,且该界面所在进程还未启动过。本篇文章承接《我是怎么把一个个App进程创建起来的》,描述接下来发生的事。概述想要启动一个Activity,首先得启动它的进程,由AMS将启动进程的需求发给Zygote,由这位大佬fork出一个进程,然后启动。启动的入口是ActivityThrea

2020-07-09 11:15:53 435

原创 浅谈Binder

前言最近沉迷于Android源码中无法自拔,只是苦于内功浅薄,很多东西看得云里雾里。起初对Android图形系统比较感兴趣,一头扎进去,不到片刻,就再也找不到“线头”。原因之一在于Android在启动一个activity到从LCM中显示出来图像,使用了大量的Binder通讯,各种IXXX,BpXXX,BnXXX蜂拥而出,各种类派生,看得头皮发麻。于是将图形系统放在一边,转战Binder通讯。概述Android系统中充满各种各样的进程,每个进程肩负着不同的任务。当某个进程处理不了的事情,则可以丢给其他能

2020-06-29 10:45:51 135

原创 Zygote的启动流程

前言Android系统开发,zygote显然是接触很多的一个术语。那zygote是什么呢?好奇查了下zygote的中文翻译:受精卵。这是我见过最形象和最正确的命名。顾名思义,就是孵化下一代。Android中,Zygote是所有App的父进程,所有的app都由它孵化而出,可见zygote的地位,堪比女娲造人。那zygote在Android系统中是如何启动的呢?概述众所周知,Android系统是跑在Linux内核上的,姑且将zygote看成是跑在Linux上的一个Linux应用。那么zygote想要启动,

2020-06-03 19:37:40 491

原创 Android源码阅读神器-openGrok的搭建

前言阅读Android源码这样庞大的代码,没有一个趁手的工具,会比较难受。之前都是通过vim来阅读源码,但没有做相关的vim插件配置,所以每次都需要进行grep,效率极低。后来尝试在ubuntu中使用sourceinsight,效果也不是特别好,不流畅,而且同步代码时比较慢(可能是我电脑性能问题)。后面尝试了openGrok,一个让我欲罢不能的阅读源码的工具。但在搭建openGrok的时候,还是遇到了不少问题,可能openGrok或者tomcat版本不对,或者我配置的方法问题,导致一直踩坑。这里分享下搭

2020-06-01 11:36:03 881

原创 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 2214

原创 Android系统升级流程---下篇

前言紧接着Android系统升级流程上篇,在上篇中,大概介绍了调用installPackage方法后发生的一系列的事,在这期间,系统准备好升级包,向misc分区中写入升级指令,接着重启进入recovery模式,本篇文章作为Android系统升级流程下篇,大概介绍重启后发生的事。概述一般来讲,Android有三种启动模式:Fastboot模式,Recovery System 以及Main System。那系统开机的时候,是根据什么来判断进入对应模式的呢?或者说,系统怎么判断要进入recovery模式的呢

2020-05-12 16:09:24 536

原创 Android系统升级流程---上篇

前言大部分Android设备出厂时的软件大都是带着bug风险(低风险)出货的,后期再通过OTA的方式去升级修订补丁。在满足主要功能正常使用的情况下产品抢先出货,其他小功能再通过迭代更新。这个功能的重要性不言而喻。今天就来看看Android系统的升级流程。概述一般Android升级流程是,由软件发放端推送软件到服务器,然后由服务器向Android设备推送升级包。在Android设备中,一般会有一个系统服务用于检测是否有版本更新,如果有更新包,则下载下来,下载完成并校验成功后,通过调用系统的接口进入升级流

2020-05-11 09:11:52 875

原创 Java中的CRC校验

前言最近客户有CRC校验的需求,即希望Android端对字符串进行校验,并将生成的2个字节的CRC校验码追加到字符串中,然后一起写入文件。当系统联网后,会通过写入的字符串去向服务器请求设备序列号,服务器会根据该字符串的原始字符串(不含校验码)进行校验,如果校验出来的值跟最后两个字节的校验码匹配上,则下发一个序列号,否则为空。概述CRC的校验方式多种多样,每个客户都有自己的校验方式。此次...

2020-04-20 18:06:38 9897 1

原创 踩坑之默认输入法配置

前言在实际项目开发过程中,需要集成客户的输入法,但Android原生并不支持输入法的配置。在这里记录下实际操作。支持默认输入法配置Android原生并不支持默认输入法的设置,默认就是谷歌原生的输入法。如果要默认配置使用搜狗输入法或者QQ拼音输入法的话,可以使用如下方法:1.安装对应输入法的安装包,install或者系统内置都可以;2.在设置的数据库中直接加载默认的输入法fr...

2020-03-13 12:12:06 535

原创 Android的自救---RescueParty

前言不知道你有没有遇过,就是有时系统开机异常,会直接进入到一个机器人的error界面。我这边就遇到,在OTA升级后,开机后会自动重启,且进入到机器人error界面。经查找,是由于有一个进程在系统开机的时候,不断重启,触发了RescueParty机制,今天在这带大家稍微了解下这个机制。RescueParty目前市场上的消费者包括小白用户,当他们的手机出现无限循环启动的异常时,用户没有办法修复异...

2020-02-24 19:07:14 1991

原创 Android9.0的默认配置

前言Android系统的一些默认配置,需要根据客户的需求进行具体的配置。在这里记录Android9.0的一些默认配置方法。方法论在源码中寻找某个配置的默认值时,先确认这个配置是否存在默认值,且该配置是否有状态保存,一般来说,这些状态数据会保存在setting的数据库中。判断方法只要满足如下两个条件,则说明该配置存在默认值:1.重启之后,配置状态值仍然保存;2.恢复出厂设置后,配置状...

2020-02-21 10:35:10 1244 2

原创 Android9.0 如何实现动态权限白名单

前言此次使用Android9.0做一个动态权限白名单的功能,即客户要求他们的app默认就该应用所有的权限,在运行过程中,不需要去动态申请权限,即不弹窗。在Android M之前, Runtime permissions是直接被当作是install permissons,即在安装的时候就直接grant了。而在 Android M以后, Android加入了runtime permissions...

2020-02-19 10:04:58 4013 1

原创 Android9.0勿扰模式【Do Not Disturb】

前言最近使用客户的launcher设置音量时,会弹出一个界面,用于授权,用于给【勿扰模式】进行授权。授权界面的源码通过adb shell 指令获取当前的包名和界面,发现显示如下:com.android.Settings.Settings$ZenAccessSettingsActivity明显界面已经跳转到了原生setting app,一番搜索,该界面的实现源码如下:packages/...

2020-02-16 16:33:52 11839

原创 Android系统源码代码混淆

前言刚好有个项目需要提供apk给客户,所以需要对该apk进行代码混淆。在此将遇到的坑记录下来,避免后续再踩。代码混淆代码混淆主要是增加“不法分子“对apk进行反编译后,阅读代码的难度。代码混淆并不是所有的代码都可以混淆,有些代码则是不能混淆的,如一些反射应用。开启混淆这里记录遇到的第一个坑,在apk的Android.mk文件中,增加如下语句:LOCAL_PROGUARD_ENABLED...

2019-10-25 20:26:29 1531

原创 关于添加开机动画

在device/cvt/xxxx/system.prop文件中增加一行配置,如下:ro.operator.optr=CUST这样这个属性就会被在ShutdownThread.java文件的beginShutdownSequence方法中被调用,在该方法中,会去读取ro.operator.optr的值,如果该值为CUST,则系统会执行bootanimCust方法,这个方法会执行startBo...

2018-11-16 14:49:41 257

原创 添加网络adb的方法

方法一需要每次先将手机通过USB连接到PC,使用adb tcpip命令开启网络调试功能,一旦手机重启,又要重复这些步骤,比较麻烦。一劳永逸的方法是,在手机的/system/build.prop中增加一行配置:service.adb.tcp.port=5555(同样可以指定为其他值),实现开机就支持网络调试,不需要先USB连上手机。可以先将/system/build.prop从手机中pull...

2018-11-16 14:49:02 2444 3

原创 设备节点添加

有时应用层需要对GPIO口进行控制,这时就需要我们给应用层提供一个接口,供他们调用控制。这种一般创建一个设备节点供他们读写控制就可以了。看了下,大部分采用在sys目录下创建一个设备节点。这个看看以往大家提交的代码记录,copy一份出来就可以了。以下则为添加一个GPIO口控制所需要修改的文件。kernel-3.10/arch/arm/mach-mt8127/Y6801N/Makefile + ...

2018-11-16 14:48:22 870

原创 关于TCP/IP

之前开发的项目中,有涉及到UDP和TCP相关的网络编程,但并没有深入去了解。只是简单调用系统函数创建相应的socket,然后使得两个不同设备进行通讯。而在当时的认知中,只是简单的认为TCP是有连接的,而UDP是无连接的。于是这种认知在之后带新员工(应届大学生刚毕业)时,被他的一个问题给打破。那新员工问:“TCP协议和JSON协议有什么区别”?当时我还处在那种无知

2017-02-26 22:29:47 287

转载 C语言之控制语句

转载 http://www.cnblogs.com/JCSU/articles/1306395.html一、决策语句1. if语句 (1) 一般形式if (condition) statement;or if (condition){ compound statement}(2) 流程图和交通图(3) 例

2017-02-15 08:57:13 453

转载 C语言之作用域

转载 http://blog.csdn.net/leaf1984zh/article/details/5964256C语言之作用域在C语言中,涉及到作用域和生存周期的问题,大多是指的变量和函数。C语言中用得最多的应当算是局部变量了,而局部变量的作用域一般认为在函数体内有效。局部变量的内存分配管理和销毁是由编译器来实现的,程序编写者不用考虑其实现细节。当函数执

2017-02-08 10:42:36 567

转载 C语言之基本语句

本文copy百度百科。C语言之语句类型语句是一个程序逻辑的体现,它描述了程序。从程序流程的角度来看,程序可以分为三种基本结构, 即顺序结构、分支(选择)结构、循环结构。这三种基本结构可以组成所有的各种复杂程序。C语言提供了多种语句来实现这些程序结构。C程序的执行部分是由语句组成的。 程序的功能也是由执行语句实现的。C语句可分为以下五类:

2017-02-07 09:35:05 3771

原创 C语言之基本数据类型

C语言数据类型之基本类型C语言编程其中一个比较重要的地方是对数据的组织。我们通常会看到各种结构体类型的数据,就是对数据的一种组织方式。这样将数据组织起来,有利于我们对数据的操作和管理。合理的数据结构,可以使我们的程序算法简洁、有条理。今天,不讲数据结构,而是讲一下组成这些结构体的基本数据。C语言中涉及到的基本数据类型并不多,共有以下几种:char(字

2017-02-05 15:34:20 493

转载 最快的哈希算法

作者:July、wuliming、pkuoliver  说明:本文分为三部分内容, 第一部分为一道百度面试题Top K算法的详解;第二部分为关于Hash表算法的详细阐述;第三部分为打造一个最快的Hash表算法。  第一部分:Top K 算法详解  问题描述(百度面试题):  搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。假设目前有

2017-01-19 17:37:13 12217

原创 Static的用法

Static关键字static的作用是什么?在C语言中,关键字static有三个明显的作用:1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。3) 在模块内,一个被声明为静态的函数只可被这一模块内的

2017-01-11 08:39:15 223

原创 字节对齐

一、什么是字节对齐现代计算机中,内存空间按照字节划分,理论上可以从任何起始地址访问任意类型的变量。但实际中在访问特定类型变量时经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序一个接一个地存放,这就是对齐。二、为什么需要字节对齐这就涉及到CPU获取数据的效率的问题了。对于普遍的32位芯片来说,CPU从内存中获取数据时,每次访

2017-01-10 18:08:42 382

原创 关于动态内存的申请和释放

#include关于malloc(p)和free(p):malloc主要用来分配内存空间,通常是结合指针进行使用,通常是在声明了一个指针之后,为该指针所指向的数据分配一个内存空间,不然该指针就成为野指针了。如下:int *p ;p = NULL;p = (int*)malloc(sizeof(10*int));此两条语句声明了一个指针

2017-01-10 18:06:37 2830

原创 volatitle的用法

Volatilevolatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会进行编译优化,加volatile关键字的变量有关的运算,将不进行编译优化。)。例如:volatile int i=10;int j = i

2017-01-10 18:05:33 1624

转载 (转载)理解内存管理的本质

此文章转载coding_hello的文章(http://blog.csdn.net/coding_hello/article/details/3947793)。  看到很多使用C/C++的朋友都在内存管理上跌倒,不断的苦苦挣扎。究其原因,并非全是因为粗心导致的错误,而是在内存管理的理解上有偏差导致的混乱。个人认为关于内存的使用,最重要的一点就是认识到内存分配和释放操作的本质其实是对一片

2017-01-10 14:35:46 710

原创 const的使用

话说有这么一道辨别题(如下),指出这三者的区别。①char const *p;②const char *p;③char  *const p;const,表示只读,不可被改写。这三者都带有const,想区别它们,很简单,只需要看看变量名(也就是上面的P)离*比较近还是const比较近,如果离*比较近的话,那么说明该变量是一个指向常量的指针,该指针的内容是可改

2017-01-09 19:58:56 247

转载 linux如何将新硬盘挂载到home目录下

举例说明:新增磁盘的设备文件名为 /dev/vdb 大小为100GB。#fdisk -l 查看新增的的磁盘1、对新增磁盘进行分区#fdisk /dev/vdb按提示操作 p打印 n新增 d 删除 w操作生效 q退出操作后 w#partprobe 强制让内核重新找一次分区表(更新分区表)这里我们新增一个分区 /dev/vdb1 大小为40GB 2、分区格式化#mkfs

2017-01-09 19:46:21 38217 2

转载 串口中怎样接收一个完整数据包的解析

这里以串口作为传输媒介,介绍下怎样来发送接收一个完整的数据包。过程涉及到封包与解包。设计一个良好的包传输机制很有利于数据传输的稳定性以及正确性。串口只是一种传输媒介,这种包机制同时也可以用于SPI,I2C的总线下的数据传输。在单片机通信系统(多机通信以及PC与单片机通信)中,是很常见的问题。一、根据帧头帧尾或者帧长检测一个数据帧1、帧头+数据+校验+帧尾这是一个典型的方案,但是对帧头与

2016-11-15 10:22:14 4886 1

原创 关于串口接收的处理策略

串口;接收;粘包;断帧

2016-11-02 16:32:06 8661 3

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除