自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 数据结构和算法,双向链表的实现增删改查(kotlin版)

数据结构和算法,双向链表的实现增删改查(kotlin版)1.定义接口,我们需要实现的方法interface LinkedListAction<E> { fun push(e: E) fun size(): Int fun getValue(index: Int): E? fun insert(index: Int,e: E) fun remove(index: Int)}2.定义节点,表示每个链表节点。data class Node<E&

2024-07-02 23:29:28 340 1

原创 Android跨进程通信,binder传输数据过大导致客户端APP,Crash,异常捕获,监听异常的数值临界值,提前Hook拦截,共享内存实现传输

反射换掉IActivityTaskManager对象的IBinder对象,IBinder有监控的transact方法。思路,先启动一个注册的代理的Activity,然后绕过manifest的检测后,把代理的Activity替换成未注册的。IActivityTaskManager$Stub是binder服务端的类,运行在system进程的。hook拦截startActivity的方法,到达一个危险的大小容易崩溃的时候,我们就上报。invoke方法中,关注transact方法获得跨进程传输的参数的大小。

2024-06-30 21:06:38 1132

原创 数据结构和算法,单链表的实现(kotlin版)

数据结构和算法,单链表的实现(kotlin版)1.定义接口,我们需要实现的方法interface LinkedListAction<E> { fun push(e: E) fun size(): Int fun getValue(index: Int): E? fun insert(index: Int,e: E) fun remove(index: Int)}2.定义节点,表示每个链表节点。data class Node<E>(v

2024-06-29 13:29:46 454

原创 Android跨进程调用,Binder线程池溢出导致ANR

sysTid=1863是进程号,ANR发生在at android.os.BinderProxy.transactNative(Native method),在transcatNative函数中,transcatNative 函数式客户端发起端的函数,猜测这是Binder卡住,客户端等待响应中,这种问题基本上就是我们在跨进程通信调用服务端的时候太频繁了,大部分原因是由于业务逻辑,才会写这种代码,解决办法就是降低调用的频率,或者延迟调用,设置一些时间间隔,app端不要频繁调用服务端。

2024-06-25 21:55:00 559

原创 Android,RPC原理,C语言实现Binder跨进程通信Demo

把编译出来的两个二进制文件push到设备中测试。看到hello已经被调用了说明跨进程通信成功了。把两个文件拷贝到我们的Demo下面。主要的数据结构是在这里。

2024-06-23 22:53:30 442

原创 Android模拟器linux内核的下载,编译,运行,驱动开发测试

新建一个目录存放内核源码查看源码编写脚本文件使用内核镜像启动模拟器。

2024-06-23 13:47:35 667

原创 Android framework的Zygote源码分析

进程,是Android系统上所有应用进程的父进程,我们系统上app的进程都是由这个zygote分裂出来的。zygote则是由Linux系统用户空间的第一个进程——init进程,通过fork的方式创建的。路径 system/core/rootdir/init.zygote32.rc,32位进程,64位进程,这是个二进制文件,Android中生成二进制文件一般是Android.mk或者Android.bp。编译执行,主进程号是5021,fork之后有个pid5022,意思就是有2个进程执行这段代码。

2024-06-13 23:16:03 770

原创 Android native层的线程分析(C++),以及堆栈打印调试

先执行readyToRun(),创建完成后,通过调用threadLoop()函数,线程请求退出方法,实现requestExit()函数。run()方法,可以看到它也是用的pthread那套线程api,Android的native层的线程就是基于linux的pthread方案进行封装的。综上所述,这个MK文件配置了两个C++/C语言编写的可执行模块的构建过程,一个是与Android系统紧密结合的。所在线程的堆栈调用打印出来。在安卓源码的根目录下创建一个文件夹,并写上mk文件,提供编译的脚本。

2024-06-12 22:51:49 1045

原创 Android开机动画压缩包zip,自制开机动画(基于Android10.0.0-r41)

c 无论如何都会执行完当前的这个part部分,保证动画的连续性,1 循环一次,只播放一次, 0 停留的帧数,把 bootanimation.zip 动画文件移动到 我们自定义的product 文件中。#ffee00代表颜色值,c c代表位置,横纵坐标,都是center居中。图片路径part0,表示图片文件夹,里面都是一张张的图片文件。他会去执行每一个part文件夹,一帧一帧的绘制图片纹理。首先要创建一个文件叫做desc.txt,这是规定的,如果我们预制了zip的文件,那么代码就会走movie。

2024-06-06 00:48:24 746

原创 Android framework修改,按power按键直接关机,不弹出对话框让客户还要选择

/这里false代表不显示关机提示框,true未显示关机提示框,通常这意味着执行一个直接的关机指令,而不是显示一个确认对话框给用户。如下图,正常情况下,长按关机键,都会弹出一个对话框,让用户选择Power off关机等操作,我们修改去掉这个弹框,直接长按关机。参数意味着这个反馈不需要明确的视图上下文(某些情况下反馈效果需要和特定视图关联,但这里不需要),,系统可以知道该操作已经得到了关注,会阻止此事件的默认处理流程或防止多次处理同一事件。这行代码触发了设备的触觉反馈(例如震动),模拟长按的效果。

2024-06-04 00:02:28 416

原创 Android开机动画,framework修改Bootanimation绘制文字。

yc是原本Android动画的一个坐标系,但是我们不能覆盖他,所以要比他高,放到原生Android动画的上边+ mAndroid[0].h。我们新增代码在这里TEXT_CENTER_VALUE居中显示, yc + mAndroid[0].h计算绘制的y坐标系。opengl只是支持图片纹理,所以文件是一张图片。来到android()的initFont()然后会把这个图片加载进来,设置宽高等等。声明一个成员变量Font。这是一个文件名字符串。

2024-06-02 00:27:26 670

原创 Android开机动画的结束过程BootAnimation(基于Android10.0.0-r41)

启动一个线程池,用来初始化一些binder跨进程通信的一些属性,绘制图形都需要依赖waitForSurfaceFlinger();,要等SurfaceFlinger进程启动了开机动画才有用,binder调用的一个代理对象,主要是跨进程通信和 SurfaceFinger,sp是一个智能指针,如果有sp这个东西就会有对应的下面的这个类,,就会执行这个类。init进程把我们的BootAnimation的二进制文件拉起来了,设置一个开机动画退出的属性,值为1就是退出。我们的开机动画主要走这个方法。

2024-06-01 16:21:24 734

原创 Android 开机动画的启动过程BootAnimation(基于Android10.0.0-r41)

下面就是BootAnimation的重要部分。开机动画主要跟三个东西有关系查看下Android.bp编译文件,cc_binary就是我们编译出来的可执行文件最终的输出路径是在系统启动的第一个进程是init,init进程会根据init.rc配置启动surfaceflinger进程。就是下面这个.rc进程但是此时的Bootanim.rc不会启动。是disabled。一般一个进程启动了,都会有一个对应的main方法。

2024-05-31 00:02:47 839

原创 Android framework修改,禁止指定包名的apk安装到设备上(基于Android10.0.0-r41)

pms就是负责apk的安装和卸载,从pms入手自定义两个接口在aidl文件中,pmList主要设置要禁止安装的包名的列表,getPackageInfoList是获取包名列表。

2024-05-23 00:10:45 589 2

原创 堆栈打印跟踪Activity的启动过程(基于Android10.0.0-r41),framework修改,去除第三方app的倒计时页面

framework中修改,一般都是lanucher界面启动我们的第三方app。查看位于最上层的activity,想办法去掉这个倒计时页面直接进入主页面。那系统又是怎么调用handleLaunchActivity的?跟踪堆栈调试发现,onCreate的回调大致从这里开始。,查看Activity的onCreate如何回调的。这样就可以拦截我们想要拦截的Activity了。logcat -s qfh过滤tag。logcat -c清除日志缓存。这样模拟点击事件跳过也可以的。进到倒计时的下一个页面。

2024-05-04 00:49:17 639 1

原创 Android自定义view,自定义控件(kotlin版)–圆形进度条

上效果图,csdn不知道怎么上传动图,,,看视频吧。

2024-04-01 23:43:41 273

原创 Android系统app开发,aosp中内置客户第三方apk

系统app阔以使用很多系统源码中隐藏的api首先先编译出jar包整编源码后,在这个目录下,这个就是包含系统源码隐藏api的jar包系统app的标志拷贝jar文件到app模块下在编译之前把这个jar添加到classpath路径里面去,这样才能使用里面的apiapp模块下,complieOnly,只在编译的时候需要,不需要把它打包到apk包里面去制作系统签名文件Androidstudio配置签名。

2024-02-18 20:30:09 779

原创 Makefile 中提取相同的部分,makefile条件判断,循坏,函数定义,make编译整个项目流程

把外面这些a.cpp,b.cpp,c.cpp以及makefile文件放入一个文件夹中管理。我们把makefile中相同的部分提取出来,在最外层创建一个makefile文件。= 赋值,但是用终值,就是不管变量调用写在赋值前还是赋值后,调用时都是取终值。:= 也是赋值,但是只受当前行及之前的代码影响,而不会受后面的赋值影响。现在我们test01文件夹里面的内容基本和外面的文件夹的内容一致。创建三个测试文件a.cpp,b.cpp,c.cpp。里面新建x.c,y.c,z.c三个文件。cpp文件替换成.o文件。

2024-01-25 23:16:02 436

原创 使用makefile编译静态链接库(.a文件)

编译静态库,.a后缀结束的文件就是静态库,我们写一个makefile来执行我们的代码。调用了我们静态库里面的fun1方法。搞个文件测试静态链接库。

2024-01-23 22:27:58 975

原创 makefile 编译动态链接库使用(.so库文件)

动态链接库:不会把代码编译到二进制文件中,而是在运行时才去加载, 好处是程序可以和库文件分离,可以分别发版,然后库文件可以被多处共享。链接动态库文件,执行测试一下,没问题,输出打印信息。把这个动态库的编译流程写入makefile文件中。然后要把so文件拷贝到/lib目录下,否则会报错。写好之后我们放到linux系统中验证。新建一个test.cpp测试文件。链接:二进制文件和库文件分离。新建一个文件TestSo。编译成动态库.so文件。

2024-01-22 22:59:48 1555

原创 makefile的运行原理简单分析

所以会去执行其他的目标,比如add.o:add.cpp,因为我们的add.cpp是他的依赖,再去找这个依赖看看存不存在,发现当前文件中存在这个依赖,所以执行后面的编译代码。如果文件代码有修改 重新执行make的时候就会重新编译生成一份新的文件。按照这个例子分析,我们,make命令执行后会先执行目标后面的依赖,如果没有依赖就执行后面的命令,比如clean操作。第一次全完编译工后面只编译最新的代码(部份编译)其他文件没有修改过的不会执行编译指令。只会执行我们修改的文件的代码指令,保证目标是用最新的依赖生成的。

2024-01-21 20:52:26 370

原创 makefile,依赖,目标

patsubst $(patsubst %.cpp,%.o,./*.cpp)将对应的 cpp 文件名替换成 .o 文件名。wildcard $(wildcard ./*.cpp)获取当前目录下所有的.cpp 文件。简单来说就是不会受到一些同名的文件的影响,也会进来makefile中执行对应的指令。声明目标为伪目标之后,makefile将不会判断目标是否存在或该目标是否需要更新,简略很多,%.o:%.cpp,.o依赖于对应的 .cpp。伪目标 .PHONY:clean。执行编译一下看看,也是可以成功的。

2024-01-21 01:10:54 388

原创 makefile里面的变量使用,系统自带变量,自定义变量

执行,可以看到可以正常编译我们的源代码文件成为可执行文件。% 如果目标是归档成员,则该变量表示目标的归档成员名称。所有时间戳比目标文件晚的依赖文件,以空格分隔。RM文件删除程序别名 默认 rm -f。CPP C预编译器名称 默认 cc -E。执行一下,也是可以的,这也是一种写法。CC C编译器名称 默认 cc。AS汇编程序的名称, 默认为 as。+ 所有的依赖文件,以空格分隔。有不重复的依赖文件,以空格分隔。不包括扩展名的目标文件名称。$

2024-01-20 21:00:54 543

原创 makefile,make,gcc/g++ 编译流程分析

编译这个main.ii文件,编译产物是main.s的汇编文件,gcc-S main.ii 得到名为 main.s 的汇编文件。链接 gcc -lstdc++ main.o,g++ -lstdc++main.o 得到名为 a.out 的可执行文件。然后我们在make编译一下,我们发现我们只编译了修改了的add.cpp的文件,其他两个没修改的文件没被编译。汇编 gcc -c main.s 得到名为 main.o 的二进制文件。还是可以输出我们的calc里面的代码跟上面的一样。可以有效的缩短我们的编译时间。

2024-01-17 23:54:11 576

原创 makefile,make,CMake项目编译之helloworld

CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。工程中的源文件,makefie 定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。cmake是一个命令工具,CMakelists.txt是一个文件,cmake 执行的时候,去读取 CMakelists.txt 文件中的规则。make 是一个命令工具,Makefile 是一个文件,make 执行的时候,去读取Makefile 文件中的规则。

2024-01-16 23:45:34 520 2

原创 git常用命令集合及其演示

表示有一个文件test1.txt被修改过内容,test3.txt没有被加载到暂存区里。表示有个文件发生变化,git add添加到暂存区,<<<<<HEAD下面表示当前分支修改的内容。dev上面则是合并过来的分支的修改内容。假设修改了test3.txt里面的内容。commit之后暂存区会清空的,删除的文件也可以通过git回滚。假设现在工作区和暂存区都修改了。commit之后的节点。在dev分支提交版本。

2024-01-14 20:59:06 1281

原创 Android开发,JNI,NDK,C++层操作java的对象实践

可以看出get,set方法都被调用,并且get到我们设置的值。jni修改数组底层,JNI_OK标记。jni中调用对象的get,set方法。jni调用java层的构造方法。遍历int数组在jni中。字符串类型数组在jni中。运行在jni创建的对象,

2023-12-10 00:26:44 120

原创 Android开发,JNI,NDK,C++和java代码互相调用方法

比如String,要通过jni的jstring转换成c语言的char *,其他数据类型也是一样。java的数据类型不能直接给c使用,要通过jni转换。如果方法是静态的就是jclass,否则就是对象实例,最终jni会打包到apk中成为一个so库。这个是java和jni通信的桥梁。都是访问的这个结构体指针,C语言的。声明一个java函数一个jni函数。jni中再反调用我们的java函数。在java中调用我们的jni函数。运行一下看看修改的num2的值。jni调用java字符串函数。指的是我们这个文件的后缀。

2023-12-06 23:45:02 233

原创 Android跨进程通信,binder,native层,服务端在servicemanager注册服务

服务端代码binder_open利用系统调用函数打开驱动,然后调用svcmgr_publish组装binder_io数据结构体,binder_call去调用驱动,在这个过程中,binder_io结构体会转换为binder_write_read给binder驱动,然后servicemanager进程也会通过binder_write_read读取服务端传递过来的数据,binder_loop,servicemanager启动后,收到服务注册的通知,binder_call远程调用。//给上面的结构体赋值数据。

2023-12-03 22:34:12 363

原创 Android跨进程通信Binder,native代码,C语言分析,ServiceManager如何启动?做了什么?

系统启动的时候会先启动一个ServiceManager的一个进程,用于binder服务的管理,写程序先在服务端定义我们的服务,也就是一系列的函数方法,注册服务,客户端就可以获取到服务,拿到服务之后就可以发起远程调用。c函数库,封装了一些底层函数给我们使用,对外给我们提供的一些接口,不用关心这些接口是如何实现的,比如open,ioctl,mmap,close。binder_io,包含了一系列的数据,客户端把数据赋值给这个结构体,接收端接收,用于存数据的一个集合,占有一段内存。binder_write分析。

2023-12-02 23:49:00 110

原创 Android系统源码中添加可编译运行执行程序,java

在这个文件夹目录下新建一个Android.bp文件,对这个模块指定编译的方式。在自定义的mk文件中,加上这个模块的名字,才能在编译系统的时候打包到系统里面。运行模拟器,进入shell环境,来执行我们的java程序。新建一个文件夹,以及Java类的包路径。就拿我们刚刚的jar包来测试,java程序都要配置类路径。在out目录中自己找一下。Android.bp中。发现有我们的jar包。

2023-11-30 21:37:37 342

原创 Android系统源码中,将编译好的二进制可执行文件放入系统中

在Android.bp文件中,然后整编系统即可。在对应product的mk文件中。

2023-11-28 00:11:57 574

原创 Android系统源码中添加可编译运行执行程序,C,C++

打包出来的系统镜像文件才会包含我们刚刚自定义的test文件模块才会被添加到我们的编译后的系统镜像文件中,成为product的一部分,Android.bp,bp文件就是指定这个模块的编译脚本方式,指定test.cpp编译方式。格式就是json字符串。然后启动模拟器看看是否被预置到product分区目录下,编译它,单编,mm命令,进入到需要编译的目录下。新建一个文件夹,以及一个test.cpp文件。我们执行一下这个程序,输出即可。整编命令make -j12。

2023-11-27 23:37:56 391

原创 Android跨进程通信,IPC,RPC,Binder系统,C语言应用层调用

RPC,远程调用,a进程想打开led,点亮led,调用led_open函数,通过IPC发送数据给b进程,b取出数据,然后调用b进程的led_open函数,看似a进程来直接操作led_open函数一样,实际上是a发送数据给b,b操作硬件。b进程服务端程序要先向servicemanager注册服务,a进程查询led_服务,得到一个handle,指向进程b。在头文件中定义,句柄是0,进程间通信,0就是servicemanager进程,IPC,进程间通信,a进程发送数据给b进程,就是跨进程通信。

2023-11-18 15:41:41 1636

原创 Android framework添加自定义的Product项目,lunch目标项目

源码目录下输入lunch命令之后,简单理解下面这些列表就是product。用于把系统编译成不同的镜像文件,比如我们一般选择这个lunch的product这个文件夹就是我们编译源码的时候lunch的很多菜单选项在devices目录下,搞几个文件夹# Wifi.test1.mk#endiftest1-eng\test1-user测试一下这样子就是成功了,lunch试一下没毛病。

2023-11-14 00:09:16 369

原创 Android平台上执行C/C++可执行程序,linux系统编程开发,NDK开发前奏。

下载地址下载过程中点击下面箭头的地方,点击鼠标右键,复制好下载链接地址,然后进入ubuntu中。复制链接到ubuntu中使用wget命令下载使用unzip命令解压写段c语言的简单代码编译一下然后执行一下执行成功输出我们的打印test,但是此时如果把这个可执行文件push到Android设备中是没法运行的,因为Android底层虽然也是Linux系统,但是是一个阉割版的,所以必须要通过NDK交叉编译,才能使得程序能够在Android设备中运行起来。

2023-11-09 22:44:17 620

原创 基于AOSP源码Android-10.0.0_r41分支编译,framework开发,修改系统默认字体大小

主要修改一个地方就行。

2023-11-05 19:18:06 418 1

原创 Linux系统编程,socket通信编程实践练习(C语言)

运行服务端再运行客户端,输入ip地址,进行交互。我们再开一个命令行端口测试,成功。

2023-11-01 23:11:52 968 4

原创 Android系统跨进程通信--Messenger实际客户端,服务端通信测试

跨进程通信的方式之一,简化AIDL的繁琐,提升开发效率。

2023-10-16 23:33:17 899

原创 Android系统Binder跨进程通信,Client,Server互通信调用测试

运行一把看看,我们看到我们的客户端收到了来自服务端的回调日志,说明服务端也成功的调用了客户端的方法,。假设我们需要客户端调用了我们的textInOut方法然后回调给客户端信息。binderservice之后,客户端是可以感知服务端是否还运行的状态。在服务端设置一个监听接口,就可以使用客户端传递过来的接口实现对象了。在客户端搞一个实现类,也就是说在客户端这个接口给服务端调用。多搞一个接口测试用于测试服务端调用客户端的接口。输出日志,说明客户端挂掉之后,服务端可以感知。测试一下,故意搞个空指针测试客户端挂掉。

2023-10-15 21:27:39 841 2

空空如也

空空如也

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

TA关注的人

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