自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

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

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

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

2024-06-25 21:55:00 969

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

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

2024-06-23 22:53:30 544

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

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

2024-06-23 13:47:35 1043

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

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

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

2024-06-12 22:51:49 1394

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

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

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

2024-06-04 00:02:28 649

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

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

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

2024-06-01 16:21:24 851

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

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

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

2024-05-23 00:10:45 804 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 700 1

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

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

2024-02-18 20:30:09 1479

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

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

2024-01-14 20:59:06 1378

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

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

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

2023-12-02 23:49:00 163

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

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

2023-11-30 21:37:37 449

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

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

2023-11-28 00:11:57 833

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

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

2023-11-27 23:37:56 478

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

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

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

2023-11-14 00:09:16 444

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

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

2023-11-09 22:44:17 806

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

主要修改一个地方就行。

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

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

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

2023-10-16 23:33:17 959

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

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

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

原创 Android跨进程aidl文件关键字研究学习

运行观察现象,说明in关键字生效,我们调用完下面这个方法,name并没有发生改变还是我们原来设置的qfhqfh,而不是 info.name = “textIn”;out关键字是不能感知客户端传递过来的对象数据的,只能在服务端修改数据。oneway修饰的方法是立即返回,不会管服务端到底有没有执行,异步执行,触发调用就完事了,不能有返回值。这个是服务端打印的客户端传递过来的数据是null说明out关键字不会接收客户端传递的数据过来。下面这行日志是我们客户端打印的数据,已经被服务端修改了的数据。

2023-10-14 20:29:16 992

原创 Android跨进程通信的AIDL生成的文件代码解析,asInterface,Stub,Proxy

主要是客户端调用,把远程的IBinder实现类对象转换成客户端本地的一个接口引用,这样在客户端就能调用服务端定义好的方法。stub是抽象类,意味着我们定义在aidl里面的接口都需要实现,生成的文件源码中并没有去实现我们定义的接口方法。在onTransact中,匹配上了TRANSACTION_request这个code就可以执行对应的远程方法。做一些判断,有的话就直接返回这个Ibinder对象,没有的话就new一个新的。调用远程的方法实际上是调用下面的这个Proxy中的方法。匹配我们对应的要调用的方法。

2023-10-10 23:23:35 1095

原创 Android Binder跨进程通信,servicemanager.getService方法获取binder对象

主要是Android系统借助servicemanager的AMSt通过一些方法传递binder对象。

2023-10-10 22:15:28 997

原创 Android Binder常用案例使用分析,跨进程通信aidl,binder的java层流程,服务注册过程(java层)

客户端:使用intent,启动服务端的service,使用binderservice,在onServiceConnected回调方法中获取服务端的实际binder对象。使用aidl中的接口调用服务端的方法即可。服务端:定义接口aidl,使用Service组件,对aidl文件中的Stub抽象方法的实现,通过重写onBinder方法返回给客户端。服务端实现onBinder方法,客户端绑定这个service的时候这个方法会被回调。service组件的binderService获取binder通信。

2023-10-09 23:24:08 1579

原创 Gradle开发(三),字节码插桩,编译期间自动注册收集页面路由信息的映射表类并汇总。

在.class转化为.dex文件之前,在我们的插件中搞一个Transform,拿到.class的集合,对它们修改,解析,它们是二进制文件,借助ASM工具。把收集到的映射表类放到map中,我们的目标是把这个类的代码通过字节码插桩的方法插入到编译过程中,在transform。运行观看日志,确实收集到了我们app模块和子工程模块中的类的页面映射表的class信息。在此之前我们先加一句代码,防止子工程也去执行下面的代码,只需要app模块执行即可。对于一个URL,根据映射关系表,来打开特定页面的组件。

2023-09-28 00:46:12 2871

原创 Gradle开发,APT采集页面路由信息(二),页面信息映射关系文档生成

让我们的插件自动实现传递路径参数,这样我们的开发者就不需要手动再去传递了。把数据保存到jsonobject中,for循环走完后,我们就拿到了注解所以的映射信息的一个数组。这是我们上一次构建项目生成的保存页面信息的一个目录,我们的目标是每次都自动清除一遍。改造注解处理器,让处理器可以从上面传递过来的路径中生成一个本地的json文件。在注解处理器中,说明注解处理器kapt拿到了app下传递过来的对应的信息。自定义插件放在kapt下面,否则我们的自定义插件可能无法设置kapt的参数。最终我们生成了一个md文档。

2023-09-20 23:19:48 2204

原创 Gradle开发,APT采集页面路由信息(一)

定义注解在新建的module下配置java信息打开根目录setting.gradle文件,添加依赖。

2023-09-17 01:57:11 919 5

原创 Gradle插件开发学习,发布repo本地仓库

copy一份buildSrc重新命名为插件的名称router-gradle-plugin,不能直接在buildSrc中发布插件。定义Extension,注册Extension,使用Extension,获取Extension。设置我们的参数,在上面的回调中就会获取到我们用户设置的参数值。标记页面,收集页面,生成文档,注册映射,打开页面。在工程项目下的build.gradle文件中。脚本插件,新建一个gradle脚本文件。在项目的根目录下注册这个拷贝后的子工程。在子过程中添加这个插件的关联。

2023-08-31 22:23:42 1689

原创 Gradle构建脚本基础学习,Groovy语言基础。

命令行操作:./gradlew wrapper --gradle-version 想要的版本号。闭包(函数表达式):开放匿名的代码块,可以接受参数,具有返回值也可以被分配给变量。定义:Gradle它使用一种基于Groovy的特定领域语言来声明项目设置。或者直接修改工程目录下的gradle-wrapper.properties。初始化阶段- root project。settings.gradle中测试。编译资源,编译代码,apk签名。配置阶段- project。执行阶段- task。

2023-08-26 20:06:59 1201

原创 Android源码解析--享元设计模式,handler消息传递机制(基于Android API 33 SDK分析)

使用共享对象可有效地支持大量的细粒度的对象核心:对象复用。

2023-08-20 14:21:08 1835

原创 Android布局填充器--深入LayoutInflater一探究竟

大致流程:解xml中的根标签,最外层的xml布局元素,如果根标签是 merge,那么调用rInflate进行解析,rnflate会将 merge 标签下的所有子View直接添加到根标签中,如果标签是普通元素,调用createViewFromTag 对该元素进行解析,调用rInflate解析 temp 根元素下的所有子 View,并且将这些子 View 都添加到temp下。核心就是onCreateView通过传进来的名字,name,prefix前缀构造出对应的View对象,比如TextView。

2023-08-18 00:32:47 1464

原创 Android源码设计模式--单例模式分析,系统服务开机注册单例模式源码解析

使用LayoutInflater.from(Context)来获取LayoutInflater 服务,看看LayoutInflater.from(Context)的实现。概述:在Android系统中我们经常会通过Context 获取系统级别的服务,通过 Context 的 getSystemService(String name)获取。from(Context)函数内部调用的是 Context 类的 getSystemService(String key)方法,到 Context 类看,该类是抽象类。

2023-08-16 00:16:55 754

原创 单例设计模式在Android开发实际应用场景解析–activity的管理

客户端调用单例类。构造函数私有化。通过静态方法获取单例对象。客户端调用多线程环境下确保对象只有一个。反序列化不能重新构造新对象。

2023-08-14 23:00:25 1058

原创 kotlin基础--快速上手kotlin语言开发

java是要写在类中,在java中调用kotlin文件中的代码,UtilsK后缀要加Kt,kotlin文件中都会被编译为public static变量,所以在java的main函数中可以直接文件名.函数名调用。下面演示调用kotlin的class,如果是kotlin类的class,需要KClass这样声明,KotlinMain::class调用的时候直接调用,后缀不用加上.java因为是kotlin类的class。变量名写在前面,类型写在后面,编译器如果能推断出你的类型,那么类型是不用声明的。

2023-06-14 22:56:16 3097

空空如也

空空如也

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

TA关注的人

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