自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Android—统一依赖版本管理

依赖版本管理有多种方式用于Groovy DSL,新建一个 config.gradle 文件,然后将项目中所有依赖写在里面,更新只需修改 config.gradle文件内容,作用于所有module可用于Kotlin DSL或Groovy DSL,对于多项目构建,只有一个 buildSrc 目录,该目录必须位于根项目目录中,Gradle 会自动编译并测试目录代码可用于Kotlin DSL或Groovy DSL,与config.gradle类似,缺点是要求gradle版本在7.4.2以上。

2024-04-25 16:25:15 171

原创 Android—IMS的InputDispatcher

前文说到InputReader调用mQueuedListener->flush()会去换下InputDispatcher的Looper然后处理输入事件。我们主要看Motion屏幕输入事件的1.findTouchedWindowTargetsLocked 寻找目标Window2.WMS与IMS的联系3.dispatchEventLocked 分发事件。

2023-04-19 18:23:41 663 1

原创 Android—IMS的InputReader

在startOtherServices中会先去创建IMS,再去创建启动WMS,因为双方需要合作,IMS接受各种input事件,发送到WMS的各个窗口。最好WMS准备好之后启动IMS。我们先看IMS的构造函数:Handler可能是用来处理某种Msg,我们可以先不用管,找到对应的Msg再看。这里创建了NativeInputManager -> InputManger -> InputReaderThread、InputDispatcherThread。

2023-04-12 17:28:37 594

原创 Android—HTTPS部署自签名证书

Android 作为客户端https 通信,通常需要一个SSLContext, SSLContext 需要配置一个 TrustManager,如果是双向通信,还需要一个KeyManager。KeyManager 负责提供证书和私钥,证书发给服务端校验。双向认证 TrustManager + KeyManager。TrustManager 负责校验服务端发来的证书。单向认证 TrustManager。二、Android 客户端的配置。一、生成自签名私有证书。

2023-02-14 18:47:06 1529

原创 Android—PMS: installPackagesLI

跟到最后发现是交给mInstaller去做的,这里的mInstaller是个Binder代理对象,具体实现在\frameworks\native\cmds\installd\InstalldNativeService.cpp。这里也去解析了资源文件等,最后都赋给了pkg这个Package对象,和Android四大组件相关的信息分别由activites、receivers、providers、services的list保存。这样,PKMS就可对外提供统一的组件信息,而不必拘泥于具体的Package。

2022-11-10 17:17:47 1194

原创 Android—PMS: PackageInstaller到PMS

与ActivityManager和AMS的关系类似,PMS也有一个对应的管理类PackageManager,用于向应用程序进程提供一些功能。PackageManager是一个抽象类,它的具体实现类为ApplicationPackageManager,ApplicationPackageManager中的方法会通过IPackageManager与PMS进行进程间通信,因此PackageManager所提供的功能最终是由PMS来实现的,这么设计的主要用意是为了避免系统服务PMS直接被访问。

2022-11-10 17:16:53 1735

原创 Android—Surface,BufferQueue

BufferQueue 是连接 Surface 和 Layer 的纽带,当上层图形数据渲染到 Surface 时,实际是渲染到了BufferQueue中的一个GraphicBuffer,然后通过Producer 把 GraphicBuffer 提交到 BufferQueue ,让 SurfaceFlinger 进行后续的合成显示工作。BufferQueueProducer通过dequeue函数来创建或获取一块可用的GraphicBuffer,并通过queue来归还绘制了数据的Graphicbuffer。..

2022-09-01 14:53:15 1220

原创 Android—Surface,ViewRootImpl.relayoutWindow

绘制UI会从ViewRootImpl会调用方法开始,然后performLayout、performMeasure、performDraw。我们跟进performDraw->draw->drawSoftware调用了mView.draw(canvas);可以看到mView.draw(canvas)就是具体的draw实体了,所有的视图都是作用在这个画布上。那么canvas是哪里来的呢?回到上面可以看到。.........

2022-08-31 11:37:18 1155

原创 Android—ATMS应用启动流程

应用的启动:Launcher应用点击桌面应用,应用启动。

2022-08-05 16:01:48 1089

原创 Android—AMS启动

我们从之前的分析知道ActivityManagerService.Lifecycle.startService传入class对象时会实例化该类对象并且调用它的onStart方法,这里我们先看ActivityManagerService.Lifecycle。可以看到AMS构造函数里面已经没有Activity相关的了,在Android10的版本已经移交给了ATMS了。将SystemServer.java中创建的SystemServiceManager对象设置到了AMS中。接下来看AMS的start()方法。..

2022-08-05 16:00:48 659

原创 Android—ATMS启动

在SystemServer启动的时候会去执行run函数,函数里面有startBootstrapServices();是去启动引导级服务还有在启动这些服务之前会去启动Watchdog,它的作用就是去监听SystemServer是否发生死锁,会就把SystemServer进程杀掉。本文重点是ActivityManagerService上面是SystemServer的startBootstrapServices函数中关于ActivityManagerService的内容,......

2022-08-05 15:35:24 916

原创 Android—SystemServer的启动和工作

把时间设置为1970,时区不存在,设置时区为GMT,设置system_server中binder线程的最大数量,最大值为31,准备主线程lopper,加载android_servers.so库,初始化系统上下文,创建系统服务管理--SystemServiceManager,启动引导服务,启动核心服务,启动其他服务,最后进入looper.loop。可以看到SystemServer创建了ActivityThread,并且根据ActivityThread来获取System自己的Context。......

2022-07-25 23:09:51 1111

原创 Android—Native层init到Java层ZygoteInit

回到上面,第二步forkSystemServer(abiList,zygoteSocketName,zygoteServer),这里面就是去创建SystemServer了,后面的文章会分析。第三步zygoteServer.runSelectLoop(abiList)主要就是去接受AMS的请求,然后会用fork创建一个新进程。我这里省略了很多addOption的调用,启动虚拟机配置了很多参数,最后JNI_CreateJavaVM参加虚拟机。所以有需要预加载的放到这个文件夹即可,不过需要考虑内存问题。...

2022-07-25 23:08:59 559

原创 Android—Java层与Native层对象的关联

所以javaAudioTrackFields.jniData是Java层的AudioTrack对象的mJniData属性,所以其实这里的setXXField等方法就是把Native层AudioTrack对象与Java层的AudioTrack关联到一起。可以看到这个就是一个工具类,RegisterMethodsOrDie用来动态注册JNI方法的,而FindClassOrDie和GetMethodIDOrDie就是用来获取Java层的类对象和函数对象的。我们看这个类的构造函数,这里调用了一个native方法。.

2022-07-22 22:22:28 1098

原创 Android_Binder—获取BpBinder到BBinder执行对应方法的过程

所以Client向ServiceManager获取了BpBinder的对象后,调用transact方法通过Client线程的IPCThreadState通信,Service进程的IPCThreadState接受到请求,进入executeCommand方法,调用BnBinder的onTransact方法(该方法具体实现在对应的BnXXService里面),onTransact方法再根据Client请求调用了对应的函数。这里调用IPCThreadState的transact方法,从前文。............

2022-07-18 22:57:30 576

原创 Android_Binder—BnServiceManager的作用

前文:Android—分析MediaServer解析服务的初始化和注册前文介绍了服务怎么去向BPServiceManager注册自己,BPServiceManager是一个handle值为0的BPBinder封装而成的。BPServiceManager是客户端,所以说还有服务端即BnServiceManager来获取Binder设备的这些请求数据。\frameworks\native\cmds\servicemanager\service_manager.cservice_manager主要做了三件事

2022-07-15 18:32:27 519

原创 Android_Binder—分析MediaServer解析服务的初始化和注册

\frameworks\av\media\mediaserver\main_mediaserver.cpp:该文件含有main函数,是可执行的文件。 初始化一个ProcessState对象 获取IServiceManager对象 调用MediaPlayerService和ResourceManagerService的instantiate方法 startThreadPool和joinThreadPool方法1.ProcessState对象以上我们注意两个重点: o

2022-07-12 11:03:35 696

原创 Android—多版本主要适配内容

Android 6.0(M):动态申请权限。Android 7.0(N):1.文件共享不能再使用file://这样的uri去分享访问了,会报FileUriExposedException错误(比如照片剪辑的Intent跳转),用FileProvider替代。2.Android7.0会在手机屏幕关闭的状态下,限时应用对CPU以及网络的使用。Android 8.0(O):1.引入了通知渠道。2.限制后台服务,需要声明为前台服务,即可在通知栏看到。Android 9.0(P):

2022-04-02 16:09:42 3234

原创 Android—WebView与JS交互

Html文件:WebView与JS交互方式:1. 前提:WebSettings webSettings = webView.getSettings();// 设置与Js交互的权限webSettings.setJavaScriptEnabled(true);webView.setWebChromeClient(new WebChromeClient(){ @Override public boolean onJsAlert(WebView view, String u

2021-11-24 21:49:34 2965

原创 Android—Retrofit解析

设计模式:外观模式,构建者模式,工厂模式,代理模式,适配器模式,策略模式,观察者模式Retrofit网络通信八步骤创建Retrofit实例 定义网络请求接口,并为接口中的方法添加注解 通过动态代理生成网络请求对象 通过网络请求适配器将网络请求对象进行平台适配 通过网络请求执行器,发送网络请求(call) 通过数据解析器解析数据 通过回调执行器,切换线程 用户在主线程处理返回结果@GET("/user/{user}/repos")Call<ResponseBody>

2021-11-24 21:41:57 1576

原创 Android—Gson原理解析

JsonElement抽象类 代表json串的某一个元素 某一个元素: JsonObject JsonArray JsonPrimitive(基本类型) JsonNull JsonElement的四个子类JsonObject、JsonArray、JsonPrimitive、JsonNullJsonPrimitive该类对Java的基本类型及其对应的对象类进行了封装。(短整长,单精双精,字符<表示为单字符字符串>,布尔)Gson对象的产生通过new G.

2021-11-24 21:35:02 2764

原创 Android—热修复实践

1.编译class文件点MakeProject将整个包路径还有修复好的class文件复制下来。2.class转dex我们把自己需要修复的java文件通过AS编译成class文件之后再用sdk目录下的dx.bat工具将class文件转成dex文件。打开cmd,如果你设置了环境变量,可以直接在c盘调用语句,不然你就需要把路径切换到跟dx.bat一样。比如我上面就是cdC:\Users\*****\AppData\Local\Android\Sdk\build-to...

2021-11-24 21:23:08 1296

原创 Android—AspectJ实践

AspectJ支持编译期和加载时代码注入Advice(通知):典型的 Advice 类型有 before、after 和 around,分别表示在目标方法执行之前、执行后和完全替代目标方法执行的代码。Joint point(连接点):程序中可能作为代码注入目标的特定的点和入口。Pointcut(切入点):告诉代码注入工具,在何处注入一段特定代码的表达式。Aspect(切面):Pointcut 和 Advice 的组合看做切面。例如,在本例中通过定义一个 pointcut 和给定恰当的...

2021-10-08 19:58:34 341

原创 Android—简单路由框架实践

简单路由框架实现:1.目录结构annotation和factory-compiler是两个javalibrary,分别负责接口还有APT。2.依赖关系app作为主工程依赖所有implementation project(':annotation')implementation project(':router')implementation project(':secondmodule')annotationProcessor pro...

2021-10-08 19:47:34 264

原创 Android—APT实践

APT可以根据注解,在编译时生成代码。1. 创建两个java library2. 依赖factory-compiler的依赖dependencies { implementation 'com.google.auto.service:auto-service:1.0-rc4' implementation project(':annotation') implementation 'com.squareup:javapoet:1.10.0' ...

2021-08-02 19:25:34 161

原创 Android—RecyclerView相关内容

Recycleview四级缓存mAttachedScrap(屏幕内),用于屏幕内itemview快速重用,不需要重新createView和bindView mCacheViews(屏幕外),保存最近移出屏幕的ViewHolder,包含数据和position信息,复用时必须是相同位置的ViewHolder才能复用,应用场景在那些需要来回滑动的列表中,当往回滑动时,能直接复用ViewHolder数据,不需要重新bindView。 mViewCacheExtension(自定义缓存),不直接使用,需要用户

2021-03-15 17:01:40 158

原创 Android—打包aar以及module依赖操作

将项目打包为aar:1、manifest文件:去掉红框内容2、Module的build.gradle文件中加上 apply plugin: 'com.android.library'3、打包:4、包位置:在其他module中导入aar包1、implementation和api的区别:api相当于之前的compile,用这种方式依赖的库,会参与编译打包过程。但是,如果第三方库以此方式依赖其他库,有可能会发生版本冲突。需要使用api("com.xxxxx.xxx..

2021-02-23 16:56:27 2345 1

原创 Android—内部存储与外部存储、保存图片到相册

内部存储:当一个应用卸载之后,内部存储中的这些文件也被删除。在创建内部存储文件的时候将文件属性设置成可读,其他app能够访问自己应用的数据,前提是他知道你这个应用的包名,如果一个文件的属性是私有(private),那么即使知道包名其他应用也无法访问。 内部存储空间十分有限,另外,它也是系统本身和系统应用程序主要的数据存储所在地,一旦内部存储空间耗尽,手机也就无法使用了。所以对于内部存储空间,我们要尽量避免使用。Shared Preferences和SQLite数据库都是存储在内部存储空间上的。内部存储一

2021-01-29 14:47:55 3824

原创 Android—消息推送机制

知识点:长连接与短连接 端内与端外推送 通知与透传消息 服务保活(心跳机制)长连接和短连接消息推送需要客户端与服务端进行连接,因此分为两种方式 长连接,在TCP层握手成功后,不立即断开连接,并在此连接的基础上进行多次消息(包括心跳)交互,直至连接的任意一方主动断开连接,此过程称为一次完整的长连接。HTTP 1.1相对于1.0最重要的新特性就是引入了长连接。比如现在的即时通讯,基于XMPP、MQTT协议的消息推送。 短连接,客户端收到服务端的响应后,立刻发送FIN消息,主动释放连接

2021-01-16 11:44:01 2098

原创 Android—Navigation的使用

Navigation是Fragment的一个容器,用于管理Fragment。我们可以通过它实现Fragment的跳转以及传值等操作。1、先写Fragment的xml文件<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" and

2021-01-14 18:47:40 712

原创 Android—开发过程中的相关注意事项

查看测试机显示的内容所对应的Activity先在环境变量Path中添加sdk所在的路径。adbshelldumpsysactivity包名|findstrACTIVITYApp打包apk安装后重复启动根界面的问题设我们应用启动页面会有一个SplashActivity启动界面,经过3s跳转到主界面MainActivity。当我们点击apk文件安装app,安装完成界面点击打开按钮,点击Home键,进入系统桌面,此时app退到后台,再点击桌面上启动图标时。在bug情况下启动a......

2020-12-04 20:18:13 432

原创 Android—Broadcast原理

registerReceiverregisterReceiver方法有很多重载方法,但是最终的入口都是在ContextImpl中, private Intent registerReceiverInternal(BroadcastReceiver receiver, int userId, IntentFilter filter, String broadcastPermission, Handler scheduler, Context co

2020-11-10 13:44:13 405

原创 Android—数据持久化、SP源码

3种数据持久化:File:openFileInput(String fileName)、openFileOutput(String fileName, int mode)不对存储的内容进行任何的格式化处理,比较合适存储一些简单的文本数据或二进制数据SharedPreferences使用键值对的方式来存储数据,保存数据更加方便。数据以明文的方式保存在文件中,需要加密,一般保存应用设置。SQLite 继承SqLiteOpenHelper类创建数据库,可以保存大量复杂的关系型数据账号密码自.

2020-10-30 12:22:21 447 1

原创 Android—Bitmap图片大小计算、压缩与三级缓存

Bitmap对象占用内存大小:bitmap.getByteCount()图片所占内存大小计算方式:图片长度 x 图片宽度 x 一个像素点占用的字节数。Android Bitmap使用的三种颜色格式:ALPHA_8–每个像素占1个字节,存储透明度信息,没有颜色信息。 RGB_565–每个像素占2个字节存储颜色信息,R 5位,G 6位,B 5位,能表示2^16种颜色。 ARGB_8888–每个像素占4个字节存储颜色信息,A R G B各一个字节,能表示2^24种颜色,还有一个字节存储透明度信息.

2020-10-26 22:08:15 2094

原创 Java—JVM的内存

内存JAVA是在JVM所虚拟出的内存环境中运行的,JVM内存区域主要包括:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。线程独占:程序计数器:计数器记录的是虚拟机字节码指令的地址(当前指令的地址)。字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器。虚拟机栈(stack):常说的栈也就是虚拟机栈,栈是由一个个栈帧组成,而每个栈帧中都拥有:局部变量表、操作数栈、动态链接、方法出口信

2020-10-18 19:54:48 188

原创 Python—实训day12—汽车用户消费投诉案例-分析及可视化

1数据预处理1.1读取数据,查看数据形状,数据类型 #------------1.1读取数据,查看数据形状,数据类型-------------------- import pandas as pd data = pd.read_excel(r'F:\Desktop\汽车用户消费投诉数据.xlsx') data.head() data_shape = data.shape #(75423, 8) data.dtypes #查看数据类型 1.2检

2020-10-01 15:50:08 681

原创 Python—实训day11—Pyecharts绘图

1绘图逻辑(1)选择图表类型;(2)添加数据;(3)设置全局变量;(4)显示及保存图表。1.1图表类型from pyecharts.charts import *1.2添加数据散点图、折线图等二维数据图形可通过 .add_xaxis(xaxis_data=x)和.add_yaxis(series_name='', y_axis=y)方法设置。饼图等一维图形可通过.add(series_name=‘’, data_pair=[(i, j)for i, j in zip(

2020-10-01 15:48:41 2487

原创 Python—实训day10—Matplotlib数据可视化和scikit-learn构建模型

1.Matplotlib数据可视化基础 import matplotlib.pyplot as plt import numpy as np plt.rcParams['font.sans-serif'] = 'SimHei' #------------1散点图scatter x = np.arange(0, 1, 0.05) y = x**2 y1 = x**4 #散点图 plt.scatter(x, y) plt.show

2020-09-27 16:54:22 361

原创 Python—实训day9—使用pandas进行数据预处理

1合并数据1.1堆叠合并数据1.1.1横向堆叠(行对齐,左右拼接)横向堆叠,即将两个表在X轴向拼接在一起,可以使用concat函数完成,concat函数的基本语法如下。pandas.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True)常用参数如下所示。

2020-09-25 20:48:16 1301

原创 Python—实训day8—掌握DataFrame的常用操作

2掌握DataFrame的常用操作2.1基础属性detail.columns #列名detail.index #索引/行名detail.shape #形状detail.dtypes #类型2.2查改增删DataFrame数据2.2.1查看访问DataFrame中的数据(1)对单列数据的访问DataFrame的单列数据为一个Series。根据DataFrame的定义可以知晓DataFrame是一个带有标签的二维数组,每个标签相当每一列的列名。有以下两种方式来实现对单列数

2020-09-25 20:47:22 1858

空空如也

空空如也

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

TA关注的人

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