- 博客(87)
- 资源 (3)
- 收藏
- 关注
原创 WindowManagerService详述
WindowManagerService,简称wms服务,见名知意首先是管理window窗口的,它在管理当前系统中所有的window窗口,由此可以引申出另一个重要作用,它主管分配设备产生的touch事件、keydown事件,因为wms能知道当前系统中哪个window最适合来处理某个事件(它在管理所有的window,可以遍历来挑选最优window),硬件产生的某个事件最终是要被软件应用所消费的,那些view、button的按键事件就是通过window再传递给View体系来响应按键的。与ams、ims类似都是由
2022-09-19 19:51:31 2794 1
原创 ANR问题的分析与解决思路
ANR-application not response,应用无响应,应用开发者一般是关注自己的APP进程有没有出现,系统开发者会关注当前系统运行起来后整体上所有的APP进程有没有出现ANR,从这句话可以知道,只有应用进程的主线程(UI线程)超时可能导致ANR,我们从系统整体角度来阐述问题,顺便也能包含应用出现的ANR bug。从现象来看,ANR出现时,会弹出一个应用无响应的弹框,当然也可能不弹,一是因为现在的设备厂商觉得这弹框难看,给去掉了,二是有些ANR本身就只有log记录,不会出现弹框。一直听到的就是
2022-06-28 21:30:04 6401
原创 Android显示系统详解
一、显示系统的分类:我们来思考一个问题:从普通用户角度来说,某个APP页面(例如购物APP首页)是怎么被显示到屏幕的?首先看到的是物理屏幕,然后是屏幕中软件工程师编写的APP页面,也就是手机屏幕驱动+应用APP,能看出来必然要有一个中介将应用APP图像数据传递渲染到屏幕的驱动,投递到硬件屏幕去显示,这就是Android框架的作用,称之为Android显示系统模块。也就是说能分为以下几块:1、硬件屏幕+驱动(我就知道个汇顶),驱动节点是 /dev/graphics/fb*,(fb0代表第一个moni
2022-06-23 07:16:34 4454 4
原创 native层的c++如何通过binder获取sm服务(四)
前几篇Binder相关文章讲了驱动的注册和提供的接口,以及ServiceManager的启动运行,很自然接下来我们需要思考客户端进程应该如何获取到sm提供的服务(注册服务和查询服务),本篇从native层c++角度继续分析。我们需要时刻牢记,应用程序跨进程只能依靠某种介质(比如socket是靠网卡、binder是靠驱动、内存共享是靠物理内存),直接软件去架构是无法做到的,在分析ServiceManager时也说了,sm是一个标准的Binder Server,因之,客户端进程想要访问ServiceManag
2022-03-09 20:33:05 1220
原创 “DNS服务器”–ServiceManager[Binder Server](三)
上篇文章讲了Binder的驱动,也没有详细的扣源码,一条主线:先在kernel层注册Binder驱动,提供binder_open、binder_mmap、binder_ioctl等接口来操作,根据Binder序言这篇文章中得出来的结论,binder客户端通过驱动先去访问ServiceManager,查询到服务端的地址,客户端再去访问服务端(通过驱动),我们也已经知道ServiceManager是系统中使用binder提供服务通信的大管家(从驱动篇中的命令:BINDER_ SET _ CONTEXT _ MG
2022-03-03 19:51:57 625
原创 Binder驱动与协议(二)
“九层之台,始于垒土;千里之行,始于足下”,不论binder机制在Android源码中多庞大繁杂,总归它得从地基开始–Binder驱动,我们知道Android系统是基于Linux的内核的,因而Binder驱动也必须是一个标准的Linux驱动。具体来说,Binder Driver 会将自己注册为一个misc device,并向上层提供一个/dev/binder节点,当然我们需要牢记,Binder并不真实对应硬件设备。一、binder驱动Binder驱动运行于内核态,提供open()、mmap()、ioct
2022-03-02 21:27:06 2958
原创 binder序言(一)
一、Linux跨进程有哪些方式在介绍binder之前,先回顾一下Linux跨进程有哪些方式(为什么在Android体系中要问Linux系统,因为Android系统本质上是Linux系统,只是Linux系统上运行了诸多便于上层使用的各种服务进程),我们知道操作系统的各个进程通常运行在不同的内存空间,因此无法直接相互访问,而需要跨进程的通信。:1、共享内存:两个用户态的进程访问同一块内核态的内存,这就叫共享,也是一次复制提高效率的原因。step1、创建内存共享区:比如在Linux系统中,进程1使用sh
2022-03-02 19:32:58 1851
原创 c++使用OpenSSL基于socket实现tcp双向认证ssl(使用TSL协议)代码实现
相信各位对OpenSSL库已经不陌生了,目前笔者使用这个库实现了RSA、AES加解密和tcp的双向认证功能,下面来看tcp的双向认证。1、什么是双向认证简单说双向认证就是:客户端认证服务端是否合法,服务端认证客户端是否合法。可以借助于HTTPS来说明,http网络传输协议是超文本的明文协议,也就是说经过网卡传输的字节序列都是明文,那么HTTPS上的s就是双向认证的操作(ssl),实际上就是在http的逻辑上再套一层ssl握手,进程想要发送的字节序列数据经过http传输时再加上一层ssl来让c和s两端先
2022-02-23 21:34:54 11356
原创 RSA非对称加密使用方式与原理浅析
一、非对称加密的简述:非对称加密,顾名思义加解密用的不是同一个密钥(如此我们也能很通俗的对照理解对称加密,显然它后者是加解密为同一个密钥),那么非对称加密就得用俩个密钥,一个叫公钥,任何人都能够去获取,一个叫私钥,不会四处乱传输,保留在一个认定安全的区域,公钥和私钥任意一方加密,只能由另一方解密,自己也是无法解密的,目前全球的数据安全测试中密钥大于1024的密钥还没有人宣称能够破解,因此是安全级别很高的加密算法,关于非对称加密的历史由来可以百度,有很详细的介绍,是美国很厉害的计算机大师和数学家设计出来的。
2021-11-26 14:33:23 2259
原创 AES对称加密使用方式与浅析
首先,AES的加解密算法来自于OpenSSL库,Android系统已经集成了这个算法,Java中可以直接导入类,在Android系统的native层中c和c++的使用时也可以直接从系统库中链接到OpenSSL库(NDK使用和c++是一样的,都是在Android.mk或者CMakeLists.txt中链接),关于头文件 因为使用的是系统库,因此可以直接include,当然自己编的库那就一定要有头文件了,可以从OpenSSL官网获取,**还有一个问题**:如果加解密时需要用到base64去编解码,那就得自己编库
2021-11-24 13:17:50 2785
原创 UltraEdit脱机注册免费使用版本
ue的安装包和注册机下载地址:UltraEdit 注册机使用激活方法:1、断开网络连接,运行UltraEdit软件(我这里是24.20.0.62版本),点击“输入许可证密钥”按钮;2、许可证ID(随便写)填写“1234”、密码填写:“1234”;后点击“激活”,在弹出窗口中点击“脱机激活”,弹出脱机激活窗口后,在这里复制用户码1、用户码3、运行UltraEdit 注册机,Program项选择“UltraEdit 21.30”,然后将“用户码1、用户码2”分别复制到“User Code 1、User
2021-11-08 09:45:57 4717
原创 Android系统关键服务的启动流程简述
前言 每个Android开发者都知道Android系统从kernel、hal、native c\c++ Library、framwork、application五层经典框架,但是要从头到尾说清楚AMS、WMS这些服务是怎么启动的?怎么能让application层使用还是需要一定基础的,下面我们来共同学习下Android系统这座参天大厦是如何架构其关键服务的。一、Android系统的第一个进程-----init进程 Android设备的启动必会经过三个过程:B
2021-11-01 17:45:55 1986 3
原创 synchronize关键字原理
有关synchronize关键字使用环境,在多线程的前言中基本介绍完毕,初学者可以先了解下为什么要使用:传送门 synchronized同步本质上来说就是使用某个对象锁(任意的非null对象都可以天然的作为对象锁,下面会详细说明原因),某个时刻,锁只会被其中一条线程所持有,那么cpu在切换不同线程去执行代码的时候,对象锁遇到其他的线程来访问执行此同步代码块,就会阻止线程此操作,从而做到多线程的同步安全性。在Hot
2021-08-07 17:39:06 254
原创 Java多线程系列-前言
1、synchronized的作用synchronized关键字是jvm为了解决程序在多线程切换时,数据不安全问题而制定的,因为每个线程运行时都会拷贝主存数据到自己线程的工作缓存,不同线程a、b在某个线程修改了变量后,其他线程并不知道变量已经被修改,因此会造成数据的错乱。synchronized关键字则可保证并发编程的三要素:原子性:可见性:有序性:的使用,有两种实现方式:同步代码块同步方法...
2021-08-04 17:37:22 157
原创 c++使用libz库压缩gzip格式内存字节,节省网络传输
1、头文件#include <stdio.h>#include <stdlib.h>#include <string.h>#include <zlib.h>// gzCompress: do the compressingint gzCompress(uint8_t *src, int srcLen, uint8_t *dest, int destLen){ z_stream c_stream; int err = 0;
2021-07-14 18:01:06 2637
原创 c++编译报错集锦
1、c++编译错误“no matching function for call to…"这个错误原因是集成进来的库中函数与本地程序函数名重复了,有冲突,解决办法是在包含库函数的头文件上加上namespace,并在调用的时候,加上命名空间,问题解决。代码如下:namespace zlib{//命名空间可以随意起,只要不冲突就好#include <zlib.h>}//然后在调用的时候 用命名空间去调用有冲突的函数 char text[] = "zlib compress and unco
2021-07-08 10:25:21 2217
转载 ZIP压缩算法详细分析及解压实例解释
文章转载自:https://www.cnblogs.com/esingchan/p/3958962.html;最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据压缩,两者本质上没啥区别,在数学家看来,都是映射。一方面在进行通信的时候,有必要将待传输的数据进行压缩,以减少带宽需求;另一方面,计算机存储数据的时候,为了减少磁盘容量需求,也会将文件进行压缩,尽管现
2021-07-05 17:31:36 1301 1
原创 关于win10系统不能通过网络映射访问Linux服务器的问题
问题是这样:你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问,界面截图是这样:1、博客上有一种解决方案:1、运行(win+r),输入“gpedit.msc”启动本地组策略编辑器;2、依次找到“计算机配置-》管理模板-》网络-》Lanman工作站”这个节点;3、点击右侧“启用不安全的来宾登录”,把状态“未配置”改成“已启用”;但是没有解决我的问题,还有另外一种解决办法1、打开控制面板2、点击网络和Internet第三步、...
2021-03-12 14:09:29 1237 3
原创 socket简单使用(Android、c、QT不同场景下使用)
一:Socket使用场景:socket做网络通信使用,例如游戏中的聊天,IM聊天(QQ微信等社交),这些是大型的场景;还有一些是次一等的场景,例如一套本地使用的软件,需要连接手机与pc程序,AS与Android手机apk调试信息应该就是使用这个方式;再小一个等级就是一个软件项目中,跨进程的通信,因为有些项目的设计导致数据在不同的进程中频繁传递,这个时间以socket通信也是一个办法,当然还有很多binder通信,管道,共享内存,AIDL。二:使用示例我在这里遇到的是第二种使用场景,多个设备的应
2020-12-15 19:26:17 1320
原创 QT程序中执行adb命令
QT的应用程序,如果想要执行adb命令,前提是要有adb.exe,我一般是将adb.exe放到QT应用程序同级目录下,然后使用下列代码执行命令 QProcess p(0); p.setWorkingDirectory("./");//指定进程的工作目录 QString command = "./adb.exe"; QStringList args; args.append("forward"); args.append("tcp:1111"); arg
2020-11-18 17:33:30 3343
原创 Android实时监测USB状态、QT实时监测USB状态
主要是通过系统发广播来获取USB连接的状态,代码很简单package com.test.socket.usb;import android.app.Activity;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.hardware.usb.UsbDevice;import android.hardware.u
2020-10-28 19:26:41 1505
原创 java线程池概述
java线程池概述创建线程,有两种方式:继承Thread实现Running接口日常使用的使用看这两种创建方式差别不大,实际上稍微有点区别:主要在于多线程访问同一资源的情况下,Running方式创建的线程可以操作同一共享资源,继承Thread方式创建的线程是独立各自有自己的资源,互不干扰(当然我们可以给Thread类中通过各种方式传递参数等)。只有一个两个线程时手动创建也没什么问题,但是在高并发的情况下,大量创建线程是有致命缺陷的:1、线程的创建和销毁是需要一定时间的,大量创建销毁线程的时候
2020-10-23 17:02:10 205
原创 cmake编写jni集成三方so库支持
本文假设读者使用cmake方式编写jni代码,并且已经学会jni基本操作!JNI集成三方so库支持分为两种情况:java层代码直接使用三方so库,此时直接编写native函数调用即可package com.xapi.calib.jni_calib_data;public class XapiCalibDataJni { static { System.loadLibrary("soName");//加载so库,此处soName替换为你要使用的so库名称 }
2020-10-19 14:20:46 374
原创 cmake编写jni传递对象
本文假设读者使用cmake方式编写jni代码,并且已经学会基本数据类型的jni传递!一、传递对象,这里使用自定义User对象举例:1、首先在java层定义native函数,并且loadLibrary库 public static native User sendUser(User obj); static { System.loadLibrary("JNIDemo"); }2、编写测试类代码,这里就是在Activity加了个TextView,显示jni返回的值
2020-10-19 10:31:45 292
原创 cmake编写jni代码传递数组
本文假设读者使用cmake方式编写jni代码,并且已经学会基本数据类型的jni传递!一、传递数组,这里使用byte[]数组举例:1、首先在java层定义native函数,并且loadLibrary库 static { System.loadLibrary("linkJNI"); } public static native byte[] setByteArrayData(byte[] byteArrayData);2、编写测试类代码,这里就是在Activit
2020-08-20 17:53:07 421
原创 设置Android Camera2预览画面的帧率(FPS)
1、声明变量全局存储相机的FPS范围private static Range<Integer>[] fpsRanges;2、在setUpCameraOutputs中获取相机的FPS范围// 该相机的FPS范围 fpsRanges = characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET3、在createCameraPreviewSession中设置预览画面的帧率// 设置预览画面的帧率 视实际
2020-08-07 11:15:24 4659 4
原创 Android cmake环境输出log
在写jni代码时,不可避免的需要调试代码,而c端的代码,又无法断点调试这就要求我们必须在cpp文件中打印语句供我们判断code的正确与否,但是你真这么做了会发现,不论是在as的控制台还是adb抓出来的log文件,我们写好的输出语句无法显示(printf、cout都试试),不必怀疑code有误,它是正确的,但就是打印不出来,搜索发现大多数人告诉你:需要在Android.mk中加入LOCAL_LDLIBS+= -L$(SYSROOT)/usr/lib -llog ,这个本身是对的,但是这是在eclipse开
2020-07-23 10:40:59 1343
转载 Linux下的tar压缩解压缩命令详解
Linux下的tar压缩解压缩命令详解tar-c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。-z:有gzip属性的-j:有bz2属性的-Z:有compress属性的-v:显示所有过程-O:将文件解开到标准输出下面的参数-f是必须的-f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。
2020-07-14 15:53:20 159
原创 AMS(ActivityManagerService)简述
一、什么是AMS? AMS全称:ActivityManagerService,通过activity Stack保存、管理、记录Android四大组件的状态(生命周期),提供查询服务功能的一个系统服务。它是在系统开启的时候由systemServer启动一个线程来开启的,/*frameworks/base/services/java/com/android/server/SystemServer.java*/public void run(){ ... S
2020-07-11 00:34:43 2087
原创 Android_Q版本跳过授权弹框自动获取adb的debug模式
注意:跳过开发者模式获取debug授权功能,只能是在系统级别的apk中获取,install的第三方apk不能使用下列功能!!!在需要跳过开发者模式直接获取adb—debug模式的apk中,设置下列属性值/***注: 0----关闭* 1----开启*/// 开机启动时,默认设置 [未知来源] 勾选 android.provider.Settings.Global.putInt(this.getContentResolver(), android.provider.Sett
2020-05-19 18:27:42 1780
原创 使用registerNative方式编写JNI中c/c++函数
上次面试,腾讯小哥听说我写过jni代码,问了一个问题,JNI代码里,Java上层声明的一个native函数,在cpp文件中实现它的时候,函数名过长,有没有什么办法来改进?一般我们写JNI中cpp的代码,都是Java_包名_类名_native方法名(Java_com_jni_ndkdemo_JniUtils_javaGetString),遇到包名中本身带有下划线的,它会添加上去数字(Java_co...
2020-01-17 19:16:14 873
原创 camera2拍照报错集锦宝典,
出现这个错误的原因是我们在一次捕获capture(也就是拍照的时候),cameraCaptureSession.capture(createCaptureImageRequest(), cameraCaptureSessionCaptureCallback, null);这个captureRequest参数需要addTarget一个surface,而这个surface必须要是cameraDevic...
2019-11-15 19:27:37 5705 2
原创 如何看懂android.mk文件,并学会使用
首先我们来看一段android.mk文件LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_CERTIFICATE := platformLOCAL_STATIC_JAVA_LIBRARIES += guavaLOCAL_STATIC_JAVA_LIBRARIES +...
2019-10-17 20:37:52 2930 1
原创 android反编译
前几天玩一个小手游,就想看看能不能反编译一下apk我改改代码然后也体验一下伪土豪的感觉,就查资料学了学反编译,发现你要是光看框架代码还是挺方便的,闲言少叙,往下看 命令行方式的反编译需要三个工具类,分别是apktool jar包的作用是反编译拿到apk的资源文件,可以提取出来图片文件和布局文件dex2jar zip压缩包的作用是将签名打包生成的.dex文件再给还原成.class...
2019-06-19 17:26:20 1222
原创 view动画的实现流程原理
之前去百度面试,被问到一些问题,补间动画的实现原理,属性动画的实现原理,两者的区别,为什么源码设计者要将补间动画设计成只改变位置而不改其真实属性值,这些问题如果不看源码根本无法回答,今天有时间来记录一下充实充实自己。我们来整理一下有关view动画的一下问题: ①:调用view.startAnimation()后,动画是立即执行吗? ②:假如动画持续时间 300ms,当调用了 View.star...
2019-06-06 17:44:06 1147 1
原创 自定义view---抽屉控件的制作
前两天有人留言问购物车模块有个需求是侧滑删除应该这么做,类似QQ消息侧滑删除,借此总结一下实现逻辑,事实上诸如动画平移的这种view位置移动效果有两种解决方案:view控件自身的移动ViewGroup移动内容,注意是移动ViewGroup的内容,而不是自身的移动对于view控件自身的移动这很好理解,View动画、属性动画就好,而ViewGroup去移动其内容,实质上是就像ScrollVi...
2019-06-05 17:10:16 493
原创 apk安全的一点思考
从普通开发环境来说,思考apk的安全性有以下几点1、防止二次打包: 由于android打包过程中系统只要求自签名,不强制要求第三方权威机构签名认证,所以很容易通过解析apk包,修改或者是删除其中存储签名信息的META-INF文件来进行重新签名打包,解决方案 在系统安装apk时拿到正确的签名文件,与当前签名文件做对比,是与否进行不同操作2、防止反编译:GitHub上有很多开源反编译工具...
2019-05-13 16:11:53 306
原创 关于Serializable和Parcelable的一点浅析
第一个问题,Serializable和Parcelable是什么?  Serializable和Parcelable都是实现序列化/反序列化操作的名称,那么什么是序列化操作?从功用来说,当我们编写代码时会有这样一个需求,一个对象从Activity_A跳转到Activity_B时,需要传递一个obj类型的数据,而计算机基础告诉我们,在计算机中任何数据都是以二进制来传递的...
2019-05-13 09:29:27 179
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人