一. 概述

        Android中有一个重要的系统进程(system_server),运行着系统中非常重要服务(AMS, PMS, WMS等), 针对Activity而言,系统进程需要不断地调度Activity执行,管理Activity的状态; 每一个APK都需要运行在一个应用进程中,有自己独立的内存空间, 针对Activity而言,应用进程需要执行Activity生命周期函数(onCreate, onStart, …onDestroy)的具体逻辑。

        应用进程需要频繁与系统进程通信,譬如Activity生命周期的各个方法都是需要经过系统进程调度的,只是在应用进程进行回调,这就需要从系统到应用的跨进程调用; 应用进程有需要将当前Activity的状态告诉系统进程,以便系统将Activity驱动到下一个状态,这就需要从应用到系统的跨进程调用。

        应用进程与系统进程相互通信的手段,就是利用前面文章介绍的Binder机制, 本文要分析的不是Binder机制的内在原理,而是应用进程与系统进程建立在Binder之上通信的业务逻辑,Android为此设计了两个Binder接口:

IApplicationThread:  作为系统进程请求应用进程的接口
IActivityManager:     作为应用进程请求系统进程的接口。

本文内容基于Android10的源码分析总结.

示例图:

             左侧为系统进程                                                                                                    右侧为应用进程

二 . AMS是什么?

比如在你的应用中(进程A)中启动一个Activity界面,肯定会调用startActivity这个方法, 然后跨进程和AMS通信, 接着AMS会管理这个Activity的生命周期方法,  先来说一说AMS是什么的?

1. 从java角度来看,AMS就是一个java对象

它实现了Ibinder接口,所以它是一个用于进程间通信的接口,这个对象初始化是在systemServer.java 的run()方法里面.

public Lifecycle(Context context) { super(context); mService = new ActivityManagerService(context); 
} 
public class ActivityManagerService extends IActivityManager.Stubimplements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {

2. AMS是一个服务
 ActivityManagerService从名字就可以看出,它是一个服务,用来管理Activity,而且是一个系统服务,就是包管理服务,电池管理服务,震动管理服务等。

3. AMS是一个Binder

AMS实现了Ibinder接口,所以它是一个Binder,这意味着他不但可以用于进程间通信,还是一个线程,因为一个Binder就是一个线程。
 

如果我们运行一个Hello world的安卓应用程序, 这个进程至少要启动4个线程

1. main线程,只是程序的主线程,也是日常用到的最多的线程,也叫UI线程,因为android的组
件是非线程安全的,所以只允许UI/MAIN线程来操作。

2. GC线程,java有垃圾回收机制,每个java程序都有一个专门负责垃圾回收的线程.

3. Binder1  就是我们的ApplicationThread,这个类实现了Ibinder接口,用于进程之间通信,具体
来说,就是我们程序和AMS通信的工具.

4.  Binder2 就是我们的ViewRoot.W对象,他也是实现了IBinder接口,就是用于我们的应用程序和
wms通信的工具。

 static class W extends IWindow.Stub {private final WeakReference<ViewRootImpl> mViewAncestor;private final IWindowSession mWindowSession;W(ViewRootImpl viewAncestor) {mViewAncestor = new WeakReference<ViewRootImpl>(viewAncestor);mWindowSession = viewAncestor.mWindowSession;}
.....
.....
}

WMS就是WindowManagerServicer ,和AMS差不多的概念,不过他是管理窗口的系统服务。

三.  两个接口

既然 IApplicationThread 和 IActivityManager 是两个接口, 我们来看看哪些类实现它们

3.1 IApplicationThread接口

只要继承了android.os.IInterface 则说明它是一个Binder对象, 是用于进程间通信的接口.

public interface IApplicationThread extends android.os.IInterface{
}

1. 先看IApplicationThread , 在 AS中 ctrl + T 快捷键(Eclipse风格)

 实现这个接口的类为: ApplicationThread   它是 ActivityThread.java的内部类

private class ApplicationThread extends IApplicationThread.Stub {
......
......
}

上图中,例外的 (Defaut in IApplicationThread)   (Proxy in stub in IApplicationThread) (Stub in IApplicationThread) 是 系统编译 IApplicationThread.aidl 文件后自动生成的代码文件,  里面的核心内容就是 1. 静态抽象类 Stub;  2. Stub的静态内部类Proxy ;

在看看 IApplicationThread.aidl 的写法, 接口文件前修饰关键字为oneway

/*** System private API for communicating with the application.  This is given to* the activity manager by an application  when it starts up, for the activity* manager to tell the application about things it needs to do.系统进程与应用进程通信的系统专用API** {@hide}*/
oneway interface IApplicationThread {
.....
}

oneway 表示在远程调用时(是异步调用,即客户端不会被阻塞), 它只是发送事务数据并立即返回. 

oneway修饰了的方法不可以有返回值,也不可以有带out或inout的参数。可以去看看 IApplicationThread.aidl文件中,定义的方法, 都是void类型, 没有返回值.

这也对应 AMS 给应用进程发送消息后, 肯定继续做自己的事情,  不会被阻塞,  因为AMS是四大组件的管理者,同一时刻好多事情等着做了, 要是和普通的[(in  out inout), 他们是同步调用, 调用方执行 mRemote.transact 时, 会挂起, 然后等待服务端reply值] 一样的话,  那么系统AMS这么重要的服务岂不是卡的要死. 系统运行也不流畅.

google设计它的使命是什么呢?

IApplicationThread接口的具体业务实现类是ApplicationThread, 它是ActivityThread的一个内部类,ApplicationThread负责响应系统进程发起的请求,这些请求大部分都是需要调度在应用进程的主线程执行,而ActivityThread是应用进程的主线程,通过Handle往主线程发送消息,ApplicationThread就轻松将具体执行任务的工作转交给了主线程。

3.2 IActivityManager接口

同样使用ctrl + T 查看实现类

  实现这个接口的类为: ActivityManagerService.java ,  AMSEx.java 为 AMS的继承类

public class ActivityManagerService extends IActivityManager.Stubimplements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {.....}public static abstract class Stub extends android.os.Binder implements android.app.IActivityManager{.....
}

根据上面"AMS是什么"介绍, 其实你也可以把AMS理解成运行在 system_server进程中的一个线程.

当然 WMS  PMS 也可以理解成运行在system_server进程中的线程.

Binder 在进程间通信传递的数据限制大小为 1M - 8K

根据以前的文章(Android 进程间通信机制(二) mmap 原理)查看dev/binder分配内存的命令:

cat  proc/进程号/maps  | grep  dev/binder 

我们可以查看 system_server进程 dev/binder 驱动文件分配的内存空间也是为 1M - 8K

Android 系统底层基于 Linux Kernel, 当 Kernel 启动过程会创建 init 进程, 该进 程是所有用户空间的鼻祖, init 进程会启动 servicemanager(binder 服务管家), Zygote 进程(Java 进程的鼻祖). Zygote 进程会创建 system_server 进程以及各 种 app 进程,下图是这几个系统重量级进程之间的层级关系。

用自己的手机查看进程号: 

[号外]:  servicemanager 进程分配dev/binder的内存空间为 128K , 结论支撑代码为

frameworks/native/cmds/servicemanager/service_manager.c

int main(int argc, char** argv)
{struct binder_state *bs;union selinux_callback cb;char *driver;if (argc > 1) {driver = argv[1];} else {driver = "/dev/binder";}bs = binder_open(driver, 128*1024);

google设计128k的理由,  推测是和servicemanager进程通信的业务包括

请求服务(如 ServiceManager.getService(Context.USAGE_STATS_SERVICE))    和 

添加服务等轻量级的工作

ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);ServiceManager.addService("meminfo", new MemBinder(this), /* allowIsolated= */ false,DUMP_FLAG_PRIORITY_HIGH);ServiceManager.addService("gfxinfo", new GraphicsBinder(this));ServiceManager.addService("dbinfo", new DbBinder(this));if (MONITOR_CPU_USAGE) {ServiceManager.addService("cpuinfo", new CpuBinder(this),/* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);}ServiceManager.addService("permission", new PermissionController(this));ServiceManager.addService("processinfo", new ProcessInfoService(this));

所以在binder分配的空间上只需要128K就可以满足. 

四.  握手通信全流程

4.1 从应用进程到系统进程

在ActivityThread创建的时候,会将自己的ApplicationThread绑定到AMS中, 源码流程如下:

1. 首先在 ActivityThread.java 的main方法中

 public static void main(String[] args) {ActivityThread thread = new ActivityThread();.....//步骤一thread.attach(false, startSeq);}@UnsupportedAppUsageprivate void attach(boolean system, long startSeq) {final IActivityManager mgr = ActivityManager.getService();//步骤二 通过 IActivityManager接口跨进程通信, 把 mAppThread(ApplicationThread对象)传递到AMS中mgr.attachApplication(mAppThread, startSeq);}

应用进程作为客户端,通过IAcitivtyManager接口发起了跨进程调用, 跨进程传递的参数mAppThread就是IApplicationThread的实例, 执行流程从应用进程进入到系统进程

2 接下来就到AMS中去了,调用 AMS.attachApplication() 方法

@Overridepublic void attachApplication(IApplicationThread thread, long startSeq) {if (thread == null) {throw new SecurityException("Invalid application interface");}synchronized (this) {int callingPid = Binder.getCallingPid();final int callingUid = Binder.getCallingUid();final long origId = Binder.clearCallingIdentity();attachApplicationLocked(thread, callingPid, callingUid, startSeq);Binder.restoreCallingIdentity(origId);}}

AMS作为IActivityManager接口的服务端实现,会响应客户端的请求,最终AMS.attachApplication()函数会被执行, 该函数接收跨进程传递过来的IApplicationThread实例,将其绑定到系统进程。 具体的绑定操作细节此处不表,我们只需要知道AMS中维护了所有进程运行时的信息(ProcessRecord),一旦发生了应用进程的绑定请求, ProcessRecord.thread就被赋值成应用进程的IApplicationThread实例,这样一来,在AMS中就能通过该实例发起向应用进程的调用。

4.2 从系统进程到应用进程

在AMS.attachApplication()的过程中,会有一些信息要传递给应用进程,以便应用进程的初始化.

public void attachApplication(IApplicationThread thread, long startSeq) {....//1attachApplicationLocked(thread, callingPid, callingUid, startSeq);....
}

此时,AMS会反转角色,即系统进程作为客户端,通过IApplicationThread接口向应用进程发起调用。

@GuardedBy("this")private boolean attachApplicationLocked(@NonNull IApplicationThread thread,int pid, int callingUid, long startSeq) {// 2thread.bindApplication(processName, appInfo, providers, null, profilerInfo,null, null, null, testMode,mBinderTransactionTrackingEnabled, enableTrackAllocation,isRestrictedBackupMode || !normalMode, app.isPersistent(),new Configuration(app.getWindowProcessController().getConfiguration()),app.compat, getCommonServicesLocked(app.isolated),mCoreSettingsObserver.getCoreSettingsLocked(),buildSerial, autofillOptions, contentCaptureOptions);
}

2中的 thread就是 实现了IApplicationThread的接口对象,通过它跨进程通信,就跳转到ActivityThread.bindApplication 方法中去了

 public final void bindApplication(String processName, ApplicationInfo appInfo,List<ProviderInfo> providers, ComponentName instrumentationName,ProfilerInfo profilerInfo, Bundle instrumentationArgs, 
.......
.......data.contentCaptureOptions = contentCaptureOptions;//3sendMessage(H.BIND_APPLICATION, data);}

接下来会到消息处理的地方

  public void handleMessage(Message msg) {if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));switch (msg.what) {case BIND_APPLICATION:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "bindApplication");AppBindData data = (AppBindData)msg.obj;//4handleBindApplication(data);Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);//processLinkTurboMonitor();break;

调用handleBindApplication方法:

 private void handleBindApplication(AppBindData data) {.....try {//5mInstrumentation.callApplicationOnCreate(app);}

最终会走到 Application的 onCreate()方法中去

   //Instrumentation.java中public void callApplicationOnCreate(Application app) {app.onCreate();}//Application.javapublic void onCreate() {}

        ApplicationThread作为IApplicationThread接口的服务端实现,运行在应用进程中, 然后ApplicationThread.bindApplication()会被执行,完成一些简单的数据封装(AppBindData)后,通过Handler抛出BIND_APPLICATION消息。这一抛,就抛到了主线程上,

ActivityThread.handleBindApplication()会被执行,接着就到了各位观众较为熟悉的Application.onCreate()函数。历经应用进程和系统进程之间的一个完整来回,总算是创建了一个应用程序。

Android 进程间通信机制(三) 系统进程与应用进程通信

相关文章

  1. Cadence Allegro 导出Spare Function Report报告详解

    ⏪《上一篇》   🏡《上级目录》   ⏩《下一篇》 目录 1,概述2,Spare Function Report作用3,Spare Function Report示例4,Spare Function Report导出方法4.1,方法14.2,方法2B站关注“硬小二”浏览更多演示视频 1...

    2023/3/28 17:35:11
  2. 运营商二要素、三要素 API:为用户的个人信息安全保驾护航

    写在前面 在现代社会中&#xff0c;运营商作为用户个人信息的管理者和托管者&#xff0c;需要保护用户的个人信息安全。 为了保护用户的隐私和安全&#xff0c;运营商需要使用一些技术手段&#xff0c;如运营商二要素、三要素 API 来验证用户身份。 本文将介绍运营商二要素、…...

    2023/3/28 17:34:54
  3. chatgpt淘金热,你赚到钱了吗,高潜力案例分享一

    在我国&#xff0c;英语教育已经成为了一个热门话题。虽然大多数学生会接受英语的基础教育&#xff0c;但是很少有人可以流利地说英语。这是因为缺乏语言环境和机会&#xff0c;而且中国的英语教育常常只注重阅读和写作&#xff0c;忽视了口语和听力的训练。因此&#xff0c;开…...

    2023/3/28 17:29:21
  4. springboot+vue田径运动会成绩管理系统java

    springboot是基于spring的快速开发框架, 相比于原生的spring而言, 它通过大量的java config来避免了大量的xml文件, 只需要简单的生成器便能生成一个可以运行的javaweb项目, 是目前最火热的java开发框架 田径运动会成绩管理系统&#xff0c;主要的模块包括首页、个人中心、赛…...

    2023/3/28 17:27:33
  5. ModStartBlog v7.0.0 网站简单统计,支持博客分享

    ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场&#xff0c;后台一键快速安装 …...

    2023/3/28 17:25:20
  6. Pytorch : 模型部署

    Pytorch部署 将模型导出为torchscript&#xff0c;参考链接 libtorch C 组成部分 根据 PyTorch 官方文档 的介绍&#xff0c;PyTorch的C API可以粗略分为以下五个部分&#xff1a; ATen&#xff1a;基础的张量和数学计算库&#xff0c;其他的部分都以此为基础。Autograd&a…...

    2023/3/28 17:24:18
  7. 脉诊之脉象——平脉,常见病脉,七绝脉

    平脉与病脉诊脉纲领平人脉象常见病脉浮脉沉脉迟脉数脉虚脉实脉涩脉洪脉细脉滑脉弦脉紧脉长脉短脉弱脉芤脉结脉代脉七绝脉釜沸脉鱼翔脉虾游脉屋漏脉雀啄脉解索脉弹石脉预后诊脉纲领 脉跳动的力度&#xff1a;有力者&#xff0c;气足也。无力者&#xff0c;气不足也。 脉…...

    2023/3/28 17:21:20
  8. Chatgpt-3 使用的提取积累数据集技术和数据集自动化处理

    为了积累数据集&#xff0c;ChatGPT-3使用了一系列技术来从不同来源的文本中提取数据。其中最常用的技术包括&#xff1a; Web scraping&#xff1a;ChatGPT-3使用Web scraping技术从互联网上的网页中提取文本。它可以自动化抓取网页&#xff0c;并从中提取出需要的信息。 数据…...

    2023/3/28 17:18:46
  9. JavaScript实现伽马函数(gamma())

    文章目录前言伽马函数&#xff08;Gamma&#xff09;实现前言 伽玛函数&#xff08;Gamma函数&#xff09;&#xff0c;也叫欧拉第二积分&#xff0c;是阶乘函数在实数与复数上扩展的一类函数。该函数在分析学、概率论、偏微分方程和组合数学中有重要的应用。与之有密切联系的…...

    2023/3/28 17:16:34
  10. 2023年先进无人飞行系统国际会议(ICAUAS 2023) | IOP JPCS独立出版

    会议简介 Brief Introduction 2023年先进无人飞行系统国际会议(ICAUAS 2023) 会议时间&#xff1a;2023年7月13日-16日 召开地点&#xff1a;中国哈尔滨&加拿大多伦多双会场 大会官网&#xff1a; ICAUAS 2023-2023 International Conference on Advanced Unmanned Aerial …...

    2023/3/28 17:16:05
  11. 20230327----重返学习-轮播图-function的ES6变量提升问题

    day-036-thirty-six-20230327-轮播图-function的ES6变量提升问题 轮播图 设置好布局 <div class"container" id"bannerBox"><div class"wrapper"><div class"slide"><img src"./images/banner01.png"…...

    2023/3/28 17:12:38
  12. 怎么把两个音频合成一个

    在创作音乐、制作视频等领域&#xff0c;经常需要将音频文件进行合并处理&#xff0c;但对于没有专业工具和知识的朋友来说&#xff0c;音频合并可能是一项复杂的任务。本篇文章就要为大家介绍合并音频的方法&#xff0c;让大家能够快速地将音频文件合并成需要的部分&#xff0…...

    2023/3/28 17:11:41
  13. 不过是一枚长安的荔枝

    一、弱水三千只取一瓢 一骑红尘妃子笑&#xff0c;无人知是荔枝来。 当读你到杜牧这句诗时&#xff0c;会想到什么&#xff1f; 16岁的我&#xff0c;未经风霜&#xff0c;满眼皆是浪漫。 唐玄宗独宠杨玉环&#xff0c;岭南八百里加急日夜奔袭&#xff0c;只为她能吃上一口新鲜…...

    2023/3/28 17:10:34
  14. Web网站服务2.1

    2.1.httpd服务的访问控制 为了跟多的控制对网站资源的访问&#xff0c;可以为特定的网站目录添加访问授权 2.1.1客户机地址受限通过Require配置项&#xff0c;可以根据主机的主机名或者IP地址来决定是否允许客户机访问。在httpd服务器的主配置文件的<Location><Direc…...

    2023/3/28 17:07:46
  15. 【vue】计算属性及其缓存特性

    基础示例 模板中的表达式虽然方便&#xff0c;但也只能用来做简单的操作。如果在模板中写太多逻辑&#xff0c;会让模板变得臃肿&#xff0c;难以维护。比如说&#xff0c;我们有这样一个包含嵌套数组的对象&#xff1a; export default {data() {return {author: {name: Joh…...

    2023/3/28 17:06:01
  16. 接口自动化测试,完整入门篇

    目录 1. 什么是接口测试2. 基本流程3. 需求分析4. 用例设计5. 脚本开发6. 结果分析7. 完整脚本8. 参考资料1. 什么是接口测试 顾名思义&#xff0c;接口测试是对系统或组件之间的接口进行测试&#xff0c;主要是校验数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及…...

    2023/3/28 17:02:20
  17. Web前端学习:章四 -- JavaScript初级(五)-- 函数

    151&#xff1a;函数的参数的基本使用 1、function&#xff08;参数&#xff09; 函数的参数&#xff0c;可以有多个&#xff0c;也可以没有&#xff0c;也可以是任何数据类型&#xff1b; &#xff08;1&#xff09;参数作用&#xff1a;让函数活起来 没有参数&#xff0c…...

    2023/3/28 17:01:02
  18. uniapp 微信小程序配置全局主题色、实现动态修改主题色

    前言&#xff1a; 本文的实现目标是全局配置小程序的整体主题色&#xff0c;包括本地图标的色调。第一步实现在本地可以统一修改整体的主题色以及本地图标的颜色&#xff1b;第二步实现通过后台接口动态调整小程序前端的整体主题色以及本地图标颜色。本地图标的主题色调整需要使…...

    2023/3/28 16:58:08
  19. 【Spring Boot基础】@ConfigurationProperties的使用

    一、代码展示 1、新建Person类&#xff0c;代码如下&#xff1a; package com.lc.springboot_testbilbil;import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import org.springframework.web.…...

    2023/3/28 16:57:00
  20. 第22章 随机波动率模型:均值回归假设及存在相关性时的微笑曲线

    这学期会时不时更新一下伊曼纽尔德曼&#xff08;Emanuel Derman&#xff09; 教授与迈克尔B.米勒&#xff08;Michael B. Miller&#xff09;的《The Volatility Smile》这本书&#xff0c;本意是协助导师课程需要&#xff0c;发在这里有意的朋友们可以学习一下&#xff0c;思…...

    2023/3/28 16:56:49
  21. mapbox-gl 2.13.0 Windows 10环境下编译

    1.下载mapbox-gl.js源码包&#xff0c;解压 2.按照源码中CONTRIBUTING.md描述&#xff0c;配置基础环境 [node.js](https://nodejs.org/) version 14, [yarn](https://yarnpkg.com/en/docs/install#windows-tab), [npm and node-gyp](https://github.com/Microsoft/nodejs-…...

    2023/3/28 16:54:01
  22. ShareSDK常见问题

    QQ-分享报错901111&#xff0c;9001010等 由于QQ现在需要审核后才可以分享&#xff08;之前分享不需要审核&#xff09;&#xff0c;所以此错误解决方法只需通过腾讯开放平台的审核即可&#xff0c;另外要检查注册好的应用的基本信息&#xff0c;包名、md5签名和Bundle id是不…...

    2023/3/28 16:52:36
  23. PCB模块化设计09——RJ45-以太网口PCB布局布线设计规范

    目录PCB模块化设计09——RJ45-以太网口PCB布局布线设计规范1、以太网口概述2、RJ45的典型应用3、以太网的典型电路设计①集成网络变压器的RJ45设计方式②变压器分离的的RJ45设计方式4、布局要求5、布线要求PCB模块化设计09——RJ45-以太网口PCB布局布线设计规范 1、以太网口概…...

    2023/3/28 16:49:58
  24. axios使用

    参考地址&#xff1a;https://github.com/axios/axios html CDN <script src"https://cdn.jsdelivr.net/npm/axios1.1.2/dist/axios.min.js"></script>或者 <script src"https://unpkg.com/axios1.1.2/dist/axios.min.js"></scrip…...

    2023/3/28 16:49:20
  25. 基于springboot和Web实现社区医院管理服务系统【源码+论文】

    基于springboot和Web实现社区医院管理服务系统演示开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Ma…...

    2023/3/28 16:49:07
  26. 【西安】SWAT模型高阶十七项案例分析

    【案例实践】&#xff1a;本次学习共十七个实践案例 1)遥感产品和SWAT模型快速建模 2)基于水文响应单元&#xff08;HRU&#xff09;的水资源时空分布特征 3)基于自定义流域与河道的SWAT模型建模与分析 4)子流域划分原理及其对模型不确定性的影响 5)坡度划分原理及其对模型不确…...

    2023/3/28 16:48:23
  27. 一文带你彻底搞懂ThreadLocal

    前言 ThreadLocal的相关问题也是比较常见的面试题了&#xff0c;网上也有相当多的文章&#xff0c;但是看了很多篇&#xff0c;也没说实际场景&#xff0c;内容也都差不多。ThreadLocalMap、弱引用、内存泄漏等概念都能背下来了&#xff0c;但还是不能理解&#xff0c;真就是当…...

    2023/3/28 16:40:59
  28. 2023年Java岗面试八股文及答案整理(金三银四最新版)

    春招&#xff0c;秋招&#xff0c;社招&#xff0c;我们Java程序员的面试之路&#xff0c;是挺难的&#xff0c;过了HR&#xff0c;还得被技术面&#xff0c;小刀在去各个厂面试的时候&#xff0c;经常是通宵睡不着觉&#xff0c;头发都脱了一大把&#xff0c;还好最终侥幸能够…...

    2023/3/28 16:40:37
  29. 浅谈常量字符串

    今天早上看网课刚好学到字符函数的部分&#xff0c;刚好对常量字符串有些疑惑的地方&#xff0c;现在组织了下语言&#xff0c;把今天关于常量字符串的思考写成这篇博客 当我们编写程序时&#xff0c;常量字符串是一种非常常见的数据类型。常量字符串指的是在程序中声明的一个不…...

    2023/3/28 16:40:24
  30. Python 中 如何向函数传递列表?

    嗨害大家好&#xff0c;我是芝士❤ 今天也是来给大家整点干货的一天~ 把列表传递给函数后&#xff0c; 函数就能直接访问列表中的内容咯。 假设有一组专家&#xff0c;我们想邀请他们参加研讨会。 def send_invitation(experts):发送邀请函for expert in experts:print(expe…...

    2023/3/28 16:39:59

最新文章

  1. Cadence Allegro 导出Spare Function Report报告详解

    ⏪《上一篇》   🏡《上级目录》   ⏩《下一篇》 目录 1,概述2,Spare Function Report作用3,Spare Function Report示例4,Spare Function Report导出方法4.1,方法14.2,方法2B站关注“硬小二”浏览更多演示视频 1...

    2023/3/28 17:35:11
  2. 运营商二要素、三要素 API:为用户的个人信息安全保驾护航

    写在前面 在现代社会中&#xff0c;运营商作为用户个人信息的管理者和托管者&#xff0c;需要保护用户的个人信息安全。 为了保护用户的隐私和安全&#xff0c;运营商需要使用一些技术手段&#xff0c;如运营商二要素、三要素 API 来验证用户身份。 本文将介绍运营商二要素、…...

    2023/3/28 17:34:54
  3. chatgpt淘金热,你赚到钱了吗,高潜力案例分享一

    在我国&#xff0c;英语教育已经成为了一个热门话题。虽然大多数学生会接受英语的基础教育&#xff0c;但是很少有人可以流利地说英语。这是因为缺乏语言环境和机会&#xff0c;而且中国的英语教育常常只注重阅读和写作&#xff0c;忽视了口语和听力的训练。因此&#xff0c;开…...

    2023/3/28 17:29:21
  4. springboot+vue田径运动会成绩管理系统java

    springboot是基于spring的快速开发框架, 相比于原生的spring而言, 它通过大量的java config来避免了大量的xml文件, 只需要简单的生成器便能生成一个可以运行的javaweb项目, 是目前最火热的java开发框架 田径运动会成绩管理系统&#xff0c;主要的模块包括首页、个人中心、赛…...

    2023/3/28 17:27:33
  5. ModStartBlog v7.0.0 网站简单统计,支持博客分享

    ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场&#xff0c;后台一键快速安装 …...

    2023/3/28 17:25:20
  6. Pytorch : 模型部署

    Pytorch部署 将模型导出为torchscript&#xff0c;参考链接 libtorch C 组成部分 根据 PyTorch 官方文档 的介绍&#xff0c;PyTorch的C API可以粗略分为以下五个部分&#xff1a; ATen&#xff1a;基础的张量和数学计算库&#xff0c;其他的部分都以此为基础。Autograd&a…...

    2023/3/28 17:24:18
  7. 脉诊之脉象——平脉,常见病脉,七绝脉

    平脉与病脉诊脉纲领平人脉象常见病脉浮脉沉脉迟脉数脉虚脉实脉涩脉洪脉细脉滑脉弦脉紧脉长脉短脉弱脉芤脉结脉代脉七绝脉釜沸脉鱼翔脉虾游脉屋漏脉雀啄脉解索脉弹石脉预后诊脉纲领 脉跳动的力度&#xff1a;有力者&#xff0c;气足也。无力者&#xff0c;气不足也。 脉…...

    2023/3/28 17:21:20
  8. Chatgpt-3 使用的提取积累数据集技术和数据集自动化处理

    为了积累数据集&#xff0c;ChatGPT-3使用了一系列技术来从不同来源的文本中提取数据。其中最常用的技术包括&#xff1a; Web scraping&#xff1a;ChatGPT-3使用Web scraping技术从互联网上的网页中提取文本。它可以自动化抓取网页&#xff0c;并从中提取出需要的信息。 数据…...

    2023/3/28 17:18:46
  9. JavaScript实现伽马函数(gamma())

    文章目录前言伽马函数&#xff08;Gamma&#xff09;实现前言 伽玛函数&#xff08;Gamma函数&#xff09;&#xff0c;也叫欧拉第二积分&#xff0c;是阶乘函数在实数与复数上扩展的一类函数。该函数在分析学、概率论、偏微分方程和组合数学中有重要的应用。与之有密切联系的…...

    2023/3/28 17:16:34
  10. 2023年先进无人飞行系统国际会议(ICAUAS 2023) | IOP JPCS独立出版

    会议简介 Brief Introduction 2023年先进无人飞行系统国际会议(ICAUAS 2023) 会议时间&#xff1a;2023年7月13日-16日 召开地点&#xff1a;中国哈尔滨&加拿大多伦多双会场 大会官网&#xff1a; ICAUAS 2023-2023 International Conference on Advanced Unmanned Aerial …...

    2023/3/28 17:16:05
  11. 20230327----重返学习-轮播图-function的ES6变量提升问题

    day-036-thirty-six-20230327-轮播图-function的ES6变量提升问题 轮播图 设置好布局 <div class"container" id"bannerBox"><div class"wrapper"><div class"slide"><img src"./images/banner01.png"…...

    2023/3/28 17:12:38
  12. 怎么把两个音频合成一个

    在创作音乐、制作视频等领域&#xff0c;经常需要将音频文件进行合并处理&#xff0c;但对于没有专业工具和知识的朋友来说&#xff0c;音频合并可能是一项复杂的任务。本篇文章就要为大家介绍合并音频的方法&#xff0c;让大家能够快速地将音频文件合并成需要的部分&#xff0…...

    2023/3/28 17:11:41
  13. 不过是一枚长安的荔枝

    一、弱水三千只取一瓢 一骑红尘妃子笑&#xff0c;无人知是荔枝来。 当读你到杜牧这句诗时&#xff0c;会想到什么&#xff1f; 16岁的我&#xff0c;未经风霜&#xff0c;满眼皆是浪漫。 唐玄宗独宠杨玉环&#xff0c;岭南八百里加急日夜奔袭&#xff0c;只为她能吃上一口新鲜…...

    2023/3/28 17:10:34
  14. Web网站服务2.1

    2.1.httpd服务的访问控制 为了跟多的控制对网站资源的访问&#xff0c;可以为特定的网站目录添加访问授权 2.1.1客户机地址受限通过Require配置项&#xff0c;可以根据主机的主机名或者IP地址来决定是否允许客户机访问。在httpd服务器的主配置文件的<Location><Direc…...

    2023/3/28 17:07:46
  15. 【vue】计算属性及其缓存特性

    基础示例 模板中的表达式虽然方便&#xff0c;但也只能用来做简单的操作。如果在模板中写太多逻辑&#xff0c;会让模板变得臃肿&#xff0c;难以维护。比如说&#xff0c;我们有这样一个包含嵌套数组的对象&#xff1a; export default {data() {return {author: {name: Joh…...

    2023/3/28 17:06:01
  16. 接口自动化测试,完整入门篇

    目录 1. 什么是接口测试2. 基本流程3. 需求分析4. 用例设计5. 脚本开发6. 结果分析7. 完整脚本8. 参考资料1. 什么是接口测试 顾名思义&#xff0c;接口测试是对系统或组件之间的接口进行测试&#xff0c;主要是校验数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及…...

    2023/3/28 17:02:20
  17. Web前端学习:章四 -- JavaScript初级(五)-- 函数

    151&#xff1a;函数的参数的基本使用 1、function&#xff08;参数&#xff09; 函数的参数&#xff0c;可以有多个&#xff0c;也可以没有&#xff0c;也可以是任何数据类型&#xff1b; &#xff08;1&#xff09;参数作用&#xff1a;让函数活起来 没有参数&#xff0c…...

    2023/3/28 17:01:02
  18. uniapp 微信小程序配置全局主题色、实现动态修改主题色

    前言&#xff1a; 本文的实现目标是全局配置小程序的整体主题色&#xff0c;包括本地图标的色调。第一步实现在本地可以统一修改整体的主题色以及本地图标的颜色&#xff1b;第二步实现通过后台接口动态调整小程序前端的整体主题色以及本地图标颜色。本地图标的主题色调整需要使…...

    2023/3/28 16:58:08
  19. 【Spring Boot基础】@ConfigurationProperties的使用

    一、代码展示 1、新建Person类&#xff0c;代码如下&#xff1a; package com.lc.springboot_testbilbil;import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import org.springframework.web.…...

    2023/3/28 16:57:00
  20. 第22章 随机波动率模型:均值回归假设及存在相关性时的微笑曲线

    这学期会时不时更新一下伊曼纽尔德曼&#xff08;Emanuel Derman&#xff09; 教授与迈克尔B.米勒&#xff08;Michael B. Miller&#xff09;的《The Volatility Smile》这本书&#xff0c;本意是协助导师课程需要&#xff0c;发在这里有意的朋友们可以学习一下&#xff0c;思…...

    2023/3/28 16:56:49
  21. mapbox-gl 2.13.0 Windows 10环境下编译

    1.下载mapbox-gl.js源码包&#xff0c;解压 2.按照源码中CONTRIBUTING.md描述&#xff0c;配置基础环境 [node.js](https://nodejs.org/) version 14, [yarn](https://yarnpkg.com/en/docs/install#windows-tab), [npm and node-gyp](https://github.com/Microsoft/nodejs-…...

    2023/3/28 16:54:01
  22. ShareSDK常见问题

    QQ-分享报错901111&#xff0c;9001010等 由于QQ现在需要审核后才可以分享&#xff08;之前分享不需要审核&#xff09;&#xff0c;所以此错误解决方法只需通过腾讯开放平台的审核即可&#xff0c;另外要检查注册好的应用的基本信息&#xff0c;包名、md5签名和Bundle id是不…...

    2023/3/28 16:52:36
  23. PCB模块化设计09——RJ45-以太网口PCB布局布线设计规范

    目录PCB模块化设计09——RJ45-以太网口PCB布局布线设计规范1、以太网口概述2、RJ45的典型应用3、以太网的典型电路设计①集成网络变压器的RJ45设计方式②变压器分离的的RJ45设计方式4、布局要求5、布线要求PCB模块化设计09——RJ45-以太网口PCB布局布线设计规范 1、以太网口概…...

    2023/3/28 16:49:58
  24. axios使用

    参考地址&#xff1a;https://github.com/axios/axios html CDN <script src"https://cdn.jsdelivr.net/npm/axios1.1.2/dist/axios.min.js"></script>或者 <script src"https://unpkg.com/axios1.1.2/dist/axios.min.js"></scrip…...

    2023/3/28 16:49:20
  25. 基于springboot和Web实现社区医院管理服务系统【源码+论文】

    基于springboot和Web实现社区医院管理服务系统演示开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Ma…...

    2023/3/28 16:49:07
  26. 【西安】SWAT模型高阶十七项案例分析

    【案例实践】&#xff1a;本次学习共十七个实践案例 1)遥感产品和SWAT模型快速建模 2)基于水文响应单元&#xff08;HRU&#xff09;的水资源时空分布特征 3)基于自定义流域与河道的SWAT模型建模与分析 4)子流域划分原理及其对模型不确定性的影响 5)坡度划分原理及其对模型不确…...

    2023/3/28 16:48:23
  27. 一文带你彻底搞懂ThreadLocal

    前言 ThreadLocal的相关问题也是比较常见的面试题了&#xff0c;网上也有相当多的文章&#xff0c;但是看了很多篇&#xff0c;也没说实际场景&#xff0c;内容也都差不多。ThreadLocalMap、弱引用、内存泄漏等概念都能背下来了&#xff0c;但还是不能理解&#xff0c;真就是当…...

    2023/3/28 16:40:59
  28. 2023年Java岗面试八股文及答案整理(金三银四最新版)

    春招&#xff0c;秋招&#xff0c;社招&#xff0c;我们Java程序员的面试之路&#xff0c;是挺难的&#xff0c;过了HR&#xff0c;还得被技术面&#xff0c;小刀在去各个厂面试的时候&#xff0c;经常是通宵睡不着觉&#xff0c;头发都脱了一大把&#xff0c;还好最终侥幸能够…...

    2023/3/28 16:40:37
  29. 浅谈常量字符串

    今天早上看网课刚好学到字符函数的部分&#xff0c;刚好对常量字符串有些疑惑的地方&#xff0c;现在组织了下语言&#xff0c;把今天关于常量字符串的思考写成这篇博客 当我们编写程序时&#xff0c;常量字符串是一种非常常见的数据类型。常量字符串指的是在程序中声明的一个不…...

    2023/3/28 16:40:24
  30. Python 中 如何向函数传递列表?

    嗨害大家好&#xff0c;我是芝士❤ 今天也是来给大家整点干货的一天~ 把列表传递给函数后&#xff0c; 函数就能直接访问列表中的内容咯。 假设有一组专家&#xff0c;我们想邀请他们参加研讨会。 def send_invitation(experts):发送邀请函for expert in experts:print(expe…...

    2023/3/28 16:39:59