Android启动初始化init.rc详解
1. Android启动与init.rc简介
1.1 Android启动过程
一张图简单阐述一下
(网络图片,侵删)
1.2 init.rc 简介
Linux的重要特征之一就是一切都是以文件的形式存在的,例如,一个设备通常与一个或多个设备文件对应。这些与内核空间交互的文件都在用户空间,所以在Linux内核装载完,需要首先建立这些文件所在的目录。而完成这些工作的程序就是本文要介绍的init。Init是一个命令行程序。其主要工作之一就是建立这些与内核空间交互的文件所在的目录。当Linux内核加载完后,要做的第一件事就是调用init程序,也就是说,init是用户空间执行的第一个程序。 当然init程序的功能不仅仅是加载上面设备文件。
init.rc有两个,确切的说是两套,分别位于:
- ./system/core/rootdir/init.rc
- ./bootable/recovery/etc/init.rc
从目录上大致可以猜测,这两个init.rc使用场景不一样,一个是刷机用到的,也就是进入recorvery模式,一个是正常启动用到的;我们这里重点分析的是上面那个,也是init.c关联的那个。
1.3 .rc文件的存放目录以及目的
/init.rc是主要的.rc文件,由init可执行文件在开始执行时加载。它负责系统的初始设置。
在加载主目录/init.rc后,init立即加载包含在/{system,vendor,odm}/etc/init/目录中的所有文件。(这一点从android 7开始,分成多个不同的rc文件)
- /system/etc/init/ 用于核心系统项,例如 SurfaceFlinger, MediaService和logd。
- /vendor/etc/init/ 是针对SoC供应商的项目,如SoC核心功能所需的actions或守护进程。
- /odm/etc/init/ 用于设备制造商的项目,如actions或运动传感器或其他外围功能所需的守护进程。
每个系统如何加载这些不同目录的.rc文件,需要具体看从init.rc开始的import语句。 其中,import /init.${ro.hardware}.rc 较为常见。通过cat proc/cpuinfo可以查看ro.hardware的值=Hardware的值;一般在cpuinfo文件的末尾。
2. init.rc基本语法
下面的语法说明均以init.rc为例。
2.1. init.rc中三大模块:
- 1)import 导入其他的init.xx.rc文件。
- 2)action: 以trigger动作为触发点的一系列命令command ,包括service
- 3)service: 带有各种Options的一系列services的定义
service 和action的基本模型如下:
#service
service <name> <pathname> [ <argument> ]* (services可以带有多个参数和选项) <option> <option>#action 模型
on <trigger> <command> <command> <command>
2.2. service
Services(服务)是一个程序,以 service开头,由init进程启动,一般运行于另外一个init的子进程,所以启动service前需要判断对应的可执行文件是否存在。init生成的子进程,定义在rc文件,其中每一个service,在启动时会通过fork方式生成子进程。Services(服务)的形式如下:
服务(services)是指那些须要在系统初始化时就启动或退出时自己主动重新启动的程序.
它的语法结构例如以下:
1. service <name> <pathname> [ <argument> ]*
2. <option>
3. <option>
4. ...
pathname: 必须要有可执行的权限 service的name: 在所有rc文件中不能重复
2.3.option 选项:(用于services下面)
- class <class_name>
说明服务属于class_name这个类。缺省值service属于 “default” 类。同一个class下面的服务可以一起启动或停止。 - disabled
表示当这个服务所在的class启动的时候,服务不会自动启动,
要用start server_name 或 property_set("ctl.start", server_name);才能启动。 - oneshot
当服务退出后,不会再重新启动,如果没有加这个option,则服务默认退出后又会重新重启 - user <username>
执行服务之前,先声明服务的用户名,缺省值应该为root用户. - group <groupname> [ <groupname> ]*
执行服务之前,先声明服务所属组名,可以一次声明属于多个组。
声明多个组时,除第一个组名外,其他的为服务的补充组名(调用接口 setgroups()). - onrestart + command
服务重启的时,会执行onrestart后面的command.
eg:onrestart restart media 重启名为media的服务 - setenv <name> <value>
在当前服务进程中设置环境变量name的值为value。
注意:setenv定义的环境变量仅在本进程内生效,退出该进程,或者关闭相应的程序运行窗口,该环境变量即无效)
程序中可通过getenv("name")接口获取这个环境变量的值
setenv和export 的区别:
setenv csh ,本进程生效,退出后,变量无效
export bash ,全局生效,一直存在
格式:
export key=value
setenv key value
- critical
声明为关键服务。如果服务在四分钟内退出了四次,则设备会进入recovery模式 - socket <name> <type> <perm> [ <user> [ <group> ] ]
创建名为/dev/socket/<name>的unix domain socket ,并把它的句柄fd传给本服务进程
<type> 必须为 "dgram", "stream" or "seqpacket".User and group default to 0 ,也就是root. - seclablel 执行服务之前改变安全上下文
2.4. Action:定义了被触发执行的一系列命令
Action代表一组命令(Commands),Actions都有一个trigger(触发器),该触发器决定了何时执行这个Action,即在什么情况下才能执行该Action中的定义命令。当一些条件满足触发器的条件时,该Action中定义的命令会被添加到要执行命令队列的尾部(如果这组命令已经在队列中,则不会再次添加)。
队列中的每一个action都被依次提取出,而这个action中的每个command(命令)在一个Action从队列移除时,该Action定义的命令会依次被执行。
Action的格式如下:
on <trgger> [&& <trigger>]*<command1><command2><command3>
on后面跟着一个触发器,当trigger被触发时,command1,command2,command3,会依次执行,直到下一个Action或下一个Service。
简单来说,Actions就是Android在启动时定义的一个启动脚本,当条件满足时,会执行该脚本,脚本里都是一些命令commands,不同的脚本用on来区分。
2.5.Triggers: 用来触发action下面command的执行
trigger是Action的一部分,跟在on后面的动作名,用来触发action下面command的执行。 Triggers(触发器),本质上是一个字符串,能够匹配某种包含该字符串的事件,用于使Actions发生。 trigger又被细分为事件触发器(event trigger)和属性触发器(property trigger). - 事件触发器可由"trigger"命令或初始化过程中通过QueueEventTrigger()触发,通常是一些事先定义的简单字符串,例如:boot,late-init - 属性触发器是当指定属性的变量值变成指定值时触发,其格式为property:=*
一个Action可以有多个属性触发器,但是最多有一个事件触发器。
android常用的triggers的:
- early-init 在初始化早期阶段触发
- late-init 在初始化晚期阶段触发
- init 在初始化阶段触发
- late-init 在初始化晚期阶段触发
- boot/charger 当系统启动/充电时触发
- property:<key>=<value> 当属性值满足条件时触发 如:on property:ro.debuggable=1
- fs 挂载mtd分区时触发
- boot 基本网络的初始化,内存管理等时触发
- post-fs 改变系统目录的访问权限时触发
- device-added-<path> 设备节点添加时触发
- device-removed-<path> 设备节点删除时触发
- service-exited-<name> 在特定服务(service)退出时触发
可以自定义一些triggers,并选择合适的触发方式 (例如:关机充电功能,可以只启动charger服务进程)
- <name>=<value> 形式,如:
on property:ro.debuggable=1 或 on property:sys.boot_completed=1
- device-added-<path> 或 device-removed-<path>
一个设备节点/dev/XXX添加或者删除时可以触发一个action,这个可以很好的去利用 - service-exited-<name>
当某个服务退出时,可以触发一个action
2.6.command:(action下面的一系列命令)
常用命令:
1).import <filename> 导入init.XX.rc、xxx.conf等文件 Parse an init config file, extending the current configuration.2).chmod <octal-mode> <path> Change file access permissions.3).chown <owner> <group> <path> Change file owner and group. 4).chdir <directory> Change working directory. 5).chroot <directory> 改变进程根目录 6).insmod <path> 加载XX.ko驱动模块7).start <service> Start a service running if it is not already running.8).stop <service> Stop a service from running if it is currently running.9).class_start <serviceclass> Start all services of the specified class if they are not already running.10).class_stop <serviceclass> Stop all services of the specified class if they are currently running. class_reset <serviceclass> //重启class下面所有的服务 11).setprop <name> <value> Set system property <name> to <value>. 通过getprop命令可以查看当前系统的属性值 12).export <name> <value> 设置全局环境变量,这个变量值可以被所有进程访问(全局的,一直存在) 在代码中通过value = getenv("name")接口可以获取这个环境变量的值 13).mkdir <path> [mode] [owner] [group] 创建目录,后面项缺省值为 mode,owner,group: 0755 root root14).trigger <event> Trigger an action. Used to queue an action from another action. 例:trigger post-fs-data15).exec <path> [ <argument> ]* 执行<path>指定的Program,并可以带有执行参数。 exec在调用进程内部执行一个可执行文件,并会阻塞当前进程,直到运行完成。 最好避免和那些builtin commands一样使用exec命令,否则容易造成阻塞 or stuck ( maybe there should be a timeout?)16).ifup <interface> 启动某个网络接口,使其为up状态,通过netcfg可以查看,ifup eth0 等价于 netcfg eth0 up 功能一样 17).hostname <name> 设置设备的主机名,一般默认设置为localhost,可以在终端通过hostname new_name进行修改18).domainname <name> 设置网络域名localdomain19).mount <type> <device> <dir> [ <mountoption> ]* 把device挂接到dir目录下面,文件系统类型为type。 <mountoption>s include "ro", "rw", "remount", "noatime", “nosuid”......,具体可查看[linux](http://lib.csdn.net/base/linux "Linux知识库")的mount命令说明 20).setkey TBD == to be determined 暂时没有使用21).setrlimit <resource> <cur> <max> 设置本服务进程的资源上限值。(使用例子??)22).symlink <target> <path> path 链接到 ---》target ;创建符号链接23).sysclktz <mins_west_of_gmt> 设置系统时区(0 if system clock ticks in GMT)24).wait <path> [ <timeout> ] 轮询查找给定的文件path是否存在,如果找到或者超时则返回默认超时为5秒。(使用实例???)25).write <path> <string> [ <string> ]* 打开一个文件,利用write命令写入一个或多个字符串
3. 日志与结果查看
- init.rc中的服务启动后,都会生成进程,可以通过ps命令查询到。
ps -ef|grep myservicename
如果没有查询到,则是启动过程中出现异常。 - 可以通过dmesg命令,查询*.rc文件启动过程中的错误信息。
dmesg|grep C5 -myservicename
根据查看到的错误信息,进行必要的修改。
- 通过 getprop可查看所有的service运行状态。状态总共分为:running, stopped, restarting
getprop | grep init.svc
4. 常见问题
- 执行权限 如果service中的程序文件没有执行权限,service启动不会成功。需要使用chmod命令修改其权限
chmod u+x filename
或
chmod 755 filename
- 文件的安全上下文(file_contexts)Security Context配置错误 错误信息类似
[ 13.399564] init: Command ‘exec - root system – /system/postboot.sh’ action=sys.boot_completed=1 (/init.rc:722) took 1ms and failed: Could not start exec service: File /system/postboot.sh(labeled “u:object_r:system_file:s0”) has incorrect label or no domain transition from u:r:init:s0 to another SELinux domain defined. Have you configured your service correctly?
这是非常非常容易出错的一个问题。SELinux的安全上下文有是一个复杂的设计,请参考相关资料,这里不做展开。 改变文件的安全上下文,使用chcon命令:
chcon u:object_r:init_exec:s0 /system/bin/myservicename
查看文件的安全上下文
ls -lZ /system/bin/myservicename
5. 参考资料
- android6.0 init进程main之klog https://blog.csdn.net/songlan0012/article/details/119767562 klog的输出就是在给文件(/dev/kmsg)写入内容而已
- linux 内核日志级别与查看方式(https://blog.csdn.net/samallhorse/article/details/105542670)
- Android系统启动流程(一)解析init进程启动过程 https://blog.csdn.net/itachi85/article/details/54783506 总结起来init进程主要做了三件事:
1.创建一些文件夹并挂载设备
2.初始化和启动属性服务
3.解析init.rc配置文件并启动zygote进程 - Android系统学习(四)------关于init进程及开机自启动 https://blog.csdn.net/Guet_Kite/article/details/87655437 这里试着尝试通过配置init.rc文件实现开机自启动脚本:
脚本实现每次开机后台抓取dmesg写入文本- init.c 、init.rc init.xx.rc 等最终会编译到ramdisk.img(根文件系统)中,和kernel一起打包成boot.img。android启动后每次都会从boot.img中解压出init.c等文件到内存,所以要修改必须修改替换boot.img
- 描述了配置编译打包boot.img的过程
- Android系统init进程启动及init.rc全解析(https://blog.csdn.net/zhonglunshun/article/details/78615980)
- 其中对init.rc文件咋启动过程中的说明非常清晰
- 对概念的说明非常清晰
- android系统启动流程之init.rc详细分析笔记(https://blog.csdn.net/andrewblog/article/details/17122303)
- 对command的说明很详细
相关文章:
Android启动初始化init.rc详解
1. Android启动与init.rc简介 1.1 Android启动过程 一张图简单阐述一下 (网络图片,侵删) 1.2 init.rc 简介 Linux的重要特征之一就是一切都是以文件的形式存在的,例如,一个设备通常与一个或多个设备文件对应。这些…...
Linux驱动开发-①regmap②IIO子系统
Linux驱动开发-IIO驱动 一,regmap二,IIO子系统2.1初始化相关工作2.2 通道2.3 读实现 over 一,regmap 对于spi和i2c,读写寄存器的框架不同,但设备本质一样,因此就有了regmap模型来对其进行简化,提供统一的接…...
HTML5好看的水果蔬菜在线商城网站源码系列模板5
文章目录 1.设计来源1.1 主界面1.2 关于我们1.3 商品服务1.4 果蔬展示1.5 联系我们1.6 商品具体信息1.7 登录注册 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcLeigh 文章地址&#…...
L2-033 简单计算器满分笔记
本题要求你为初学数据结构的小伙伴设计一款简单的利用堆栈执行的计算器。如上图所示,计算器由两个堆栈组成,一个堆栈 S1 存放数字,另一个堆栈 S2 存放运算符。计算器的最下方有一个等号键,每次按下这个键,计算器就…...
其他网页正常进入,但是CSDN进入之后排版混乱
显示不正常,排版混乱 解决方法: ①打开网络设置 ②更改适配器 ③所连接的网络 --右键 属性 然后就可以正常访问了。...
BFC详解
1.定义: FC的全称为Formatting Conttext,元素在标准流里面 块级元素的布局属于Block Formatting Context(BFC)——即block level box都是BFC中布局 行内级元素的布局属于Inline Formatting Context (IFC) 2.那么在哪些情况下会创建BFC? 根元素…...
(H3C)vlan配置实验
1.实验拓扑 2.实验配置 [S1]dis cu #version 7.1.070, Alpha 7170 #sysname S1 # vlan 10 # vlan 20 # interface GigabitEthernet1/0/1port link-mode bridgeport link-type trunkport trunk permit vlan 1 10 20combo enable fiber # interface GigabitEthernet1/0/2port li…...
idea mvn执行打包命令后控制台乱码
首先在idea中查看maven的编码方式 执行mvn -v命令 查看编码语言是GBK C:\Users\13488>mvn -v Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f) Maven home: D:\maven\apache-maven-3.6.3\bin\.. Java version: 1.8.0_202, vendor: Oracle Corporation, runt…...
JSON.parse(JSON.stringify()) 与 lodash 的 cloneDeep:深度拷贝的比较与基础知识
JSON.parse(JSON.stringify()) 与 lodash 的 cloneDeep:深度拷贝的比较与基础知识 在 JavaScript 开发中,**深拷贝(Deep Copy)**是一个常见需求,尤其是在处理复杂对象和嵌套数据结构时。JSON.parse(JSON.stringify(o…...
搭建用友U9Cloud ERP及UAP IDE环境
应用环境 Microsoft Windows 10.0.19045.5487 x64 专业工作站版 22H2Internet Information Services - 10.0.19041.4522Microsoft SQL Server 2019 - 15.0.2130.3 (X64)Microsoft SQL Server Reporing Services 2019 - 15.0.9218.715SQL Server Management Studio -18.6 laster…...
Linux 系统新磁盘分区XFS挂载
以下是Linux系统中对新硬盘进行XFS文件系统格式化和挂载的完整操作指南: 一、确认硬盘识别 查看已识别硬盘 执行 lsblk 或 fdisk -l 命令,确认新硬盘设备标识(如 /dev/sdb)。 二、硬盘分区(可选) …...
Oracle测试题目及笔记(单选)
所有题目来自于互联网搜索 当 Oracle 服务器启动时,下列哪种文件不是必须的(D)。 A.数据文件 B.控制文件 C.日志文件 D.归档日志文件 数据文件、日志文件-在数据库的打开阶段使用 控制文件-在数…...
C语言链接数据库
目录 使用 yum 配置 mysqld 环境 查看 mysqld 服务的版本 创建 mysql 句柄 链接数据库 使用数据库 增加数据 修改数据 查询数据 获取查询结果的行数 获取查询结果的列数 获取查询结果的列名 获取查询结果所有数据 断开链接 C语言访问mysql数据库整体源码 通过…...
深入浅出 Redis:核心数据结构解析与应用场景Redis 数据结构
引言:Redis 为何如此之快?数据结构是关键 Redis (Remote Dictionary Server) 作为一款高性能的内存键值数据库,凭借其闪电般的速度和丰富的功能,在缓存、消息队列、排行榜等众多场景中得到了广泛应用。除了基于内存存储这一核心优…...
告别昂贵语音合成服务!用GPT-SoVITS生成你的个性化AI语音
文章目录 前言1.GPT-SoVITS V2下载2.本地运行GPT-SoVITS V23.简单使用演示4.安装内网穿透工具4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 今天给大家介绍一款AI语音克隆工具——GPT-SoVITS。这款由花儿不哭大佬开发的工具是一款强大的训练声音模型与音频生成工具…...
前沿要塞:Vue组件安全工程的防御体系重构与技术突围
总章数字世界的钢铁长城 在某个凌晨3点的红蓝对抗演练中,某电商平台因组件级XSS漏洞导致千万级用户数据泄露。这不是虚构的灾难场景,而是2023年某A轮企业的真实遭遇。当传统安全方案在新型攻击面前节节败退时,我们需要为Vue组件铸造全新的数字…...
吴恩达深度学习复盘(19)XGBoost简介|神经网络与决策树
XGBoost 多年来,机器学习研究人员提出了许多构建决策树的方法,目前最常用的方法是对样本或决策树的实现收费。其中,XGBoost 是一种非常快速且易于使用的开源实现,已成功用于赢得许多机器学习竞赛和商业应用。 算法原理 基本思想…...
Docker部署禅道21.6开源版本
将数据库相关环境变量分开,增加注释或空格使得命令更易读。 如果你的 MySQL 主机、端口等配置没有变化,应该确保这些信息是安全的,并考虑使用 Docker secrets 或环境变量配置来避免直接暴露敏感信息。 docker run -d -it --privilegedtrue …...
《MySQL:MySQL表结构的基本操作》
创建表 CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; field 表示列名 datatype 表示列的类型 character set 字符集,如果没有指定字符集,则以所在数据…...
C++解析操作mat文件方法-基于vs2019
前言 工作中需要将C#脚本转为C++,所转脚本主要功能是进行mat数据文件的解析和矩阵运算。 1.C#版本 原C#脚本主要是基于 MathNet.Numerics.data.Matlab、MathNet.Numerics.LineAlgebra.Double、 MathNet.Numerics.LineAlgebra 中的MatlabReader、DenseMatrix、Matrix进行mat文…...
OpenCV 模板匹配方法详解
文章目录 1. 什么是模板匹配?2. 模板匹配的原理2.1数学表达 3. OpenCV 实现模板匹配3.1基本步骤 4. 模板匹配的局限性5. 总结 1. 什么是模板匹配? 模板匹配(Template Matching)是计算机视觉中的一种基础技术,用于在目…...
自已实现一个远程打印方案 解决小程序或APP在外面控制本地电脑打印实现
常规通过小程序或APP在外出时控制本地电脑实现打印功能,可以结合远程桌面技术、云打印服务或开发定制化的远程打印解决方案。 但这里我们采用自已的实现方案来解决 服务器端实现 搭建一个后端socket服务,监听来自手机的打印请求。监听到打印任务后向本…...
Oracle_00000
contents 基本使用 基本使用 Oracle安装后会自动创建sys和system这两个用户。 sys用户:具有最高权限。具有sysdba角色,有create database的权限。该用户默认密码是:manager system用户:管理员用户,具有sysoper角色。没…...
深入剖析 ORM:原理、优缺点、场景及多语言框架示例
ORM 即对象关系映射(Object Relational Mapping),它是一种编程技术,其作用是在面向对象编程语言里,把对象模型和关系型数据库的数据结构之间创建起映射,这样开发者就能够使用面向对象的方式来操作数据库&am…...
ARINC818协议-持续
一、帧头帧尾 SOF 和 EOF 分别代表视频帧传输的开始与结束,它们在封装过程有多种状态,SOF 分为 SOFi 和 SOFn,EOF 分为 EOFt 和 EOFn。传输系统中的视频信息包括像素数据信 息和辅助数据信息,分别存储在有效数据中的对象 0 和对象…...
【uniapp】uni.setClipboardData 方法失效 bug 解决方案
写了一个 copy 方法,但是怎么也没有弹窗复制成功 <text click"toCopy(myInfo.id)">复制 </text> 逐步打印发现 1 正常打印,2 没有打印,说明问题出现在 setClipboardData 方法执行中 toCopy(n) {// console.log(1,ty…...
智能sc一面
智能sc一面-2025/4/17 更多完善:真实面经 Java 的异常分类 异常分为两类,一类Error,一类Execption。这两个类都是Throwable的子类,只有继承Throwable 的类才可以被throw或者catch Error: 表示严重的系统问题,通常与代码无关&am…...
SAP HANA使用命令行快速导出导入
楔子 今天折腾了接近一下午,就为了使用SAP HANA自带的命令行工具来导出数据备份。 SAP HANA(后续简称Hana)是内存数据库,性能这一方面上还真没怕过谁。 由于SAP HANA提供了Hana Studio这个桌面工具来方便运维和DBA使用…...
Oracle DBMS_SCHEDULER 与 DBMS_JOB 的对比
Oracle DBMS_SCHEDULER 与 DBMS_JOB 的对比 一 基本概述对比 特性DBMS_JOB (旧版)DBMS_SCHEDULER (新版)引入版本Oracle 7 (1992年)Oracle 10g R1 (2003年)当前状态已过时但仍支持推荐使用的标准设计目的基础作业调度企业级作业调度系统 二 功能特性对比 2.1 作业定义能力 …...
【音视频】音视频FLV合成实战
FFmpeg合成流程 示例本程序会⽣成⼀个合成的⾳频和视频流,并将它们编码和封装输出到输出⽂件,输出格式是根据⽂件扩展名⾃动猜测的。 示例的流程图如下所示。 ffmpeg 的 Mux 主要分为 三步操作: avformat_write_header : 写⽂件…...
10.(vue3.x+vite)div实现tooltip功能(css实现)
1:效果截图 2:代码实现 <template><div><div class="tooltip" style="margin-top: 20%; margin-left: 20%; background-color: blueviolet; color: white;...
代码随想录算法训练营第三十七天| 52. 携带研究材料 518.零钱兑换II 377. 组合总和 Ⅳ 70. 爬楼梯(进阶版)
[TOC](代码随想录算法训练营第三十七天| 52. 携带研究材料 518.零钱兑换II 377. 组合总和 Ⅳ 70. 爬楼梯(进阶版) ) 入营第三十七天 难度:难 计划任务 完成任务 52. 携带研究材料 动态规划五部曲: 1.确定dp数组以及下标含义 dp[i][j]表示从下标[0-i]的…...
数智化招标采购系统分类及功能亮点
数智化招标采购系统是郑州信源公司运用“互联网”、大数据、人工智能、区块链、物联网等新兴技术,结合供应链管理理念,以招标采购为核心,提供交易、管理、数据、服务、监管为一体的高标准采购管理平台,赋能政企用户实现采购业务全…...
CSS appearance 属性:掌握UI元素的原生外观
在现代网页设计中,为了达到一致的用户体验,我们有时需要让HTML元素模仿操作系统的默认控件样式。CSS中的appearance属性提供了一种简便的方式来控制这些元素是否以及如何显示其默认外观。本文将详细介绍appearance属性,并通过实际代码示例来展…...
【JavaScript】二十四、JS的执行机制事件循环 + location + navigator + history
文章目录 1、JS执行机制(事件循环eventloop)2、BOM的window3、location对象3.1 href属性3.2 search属性3.3 hash属性3.4 reload方法 4、navigator对象5、history对象 1、JS执行机制(事件循环eventloop) 以下,两段代码…...
CSS核心笔记002
margin塌陷问题 第一个子元素的上margin会作用在父元素上, 最后一个子元素的下margin会作用在父元素上解决 1. 给父元素设置 不为0的pandding 2. 给父元素设置宽度不为0 的border 3. 给父元素设置样式 overflow:hiddenmargin合并问题 兄弟元素的下外margin和会下面兄弟的上…...
前端路由缓存实现
场景:以一体化为例:目前页面涉及页签和大量菜单路由,用户想要实现页面缓存,即列表页、详情页甚至是编辑弹框页都要实现数据缓存。 方案:使用router-view的keep-alive实现 。 一、实现思路 1.需求梳理 需要缓存模块&…...
加密软件的发展:从古典密码到量子安全
在数字化时代,信息安全已成为个人隐私、商业机密乃至国家安全的重要基石。加密软件作为保护信息安全的核心工具,经历了从简单替换到复杂算法的漫长演变过程。本文将系统梳理加密软件的发展历程,分析当前主流技术,并展望未来趋势。…...
用Zotero + Word 宏,一键插入带超链接的参考文献!
第一步:准备好Zotero Word 确认你已经完成以下准备: ✅ 已安装好 Zotero ✅ 已安装好 Zotero Word 插件(一般自动装好了) ✅ Word 可以正常插入参考文献 ✅ 已插入好一组参考文献(可以先插几个测试) …...
Java SpringBoot的自定义配置
一,一个类多个属性的情况 application.properties配置文件写法 my.config.ip127.0.0.1 my.config.port8080自定义配置类:MyTestConfig import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.context.properties…...
Spring Boot 动态热更新 HTTPS 证书的实现与原理
在实际生产环境中,HTTPS 证书定期更新是非常常见的需求。传统方式通常要求重启服务来加载新证书,但在一些高可用系统中,重启服务会造成连接中断和短暂不可用。本篇文章将介绍如何在 Spring Boot 项目中,实现 不重启服务的情况下热…...
天工股份业绩大起大落:2024营收双位数下滑,稳定性或存疑
《港湾商业观察》施子夫 近期,江苏天工科技股份有限公司(以下简称,“天工股份”)拟公开发行股票并在北京证券交易所上市获得中国证监会同意注册,完成上市审核阶段中最后也是最关键的一步。 值得一提的是,…...
深入浅出 NVIDIA CUDA 架构与并行计算技术
🐇明明跟你说过:个人主页 🏅个人专栏:《深度探秘:AI界的007》 🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、CUDA为何重要:并行计算的时代 2、NVIDIA在…...
网安融合:打造网络+安全一体化的超预期体验
近日,2025锐捷网络EBG(中国)核心伙伴大会在苏州圆满落幕。来自全国2000合作伙伴齐聚苏州,共同见证这场盛会的举办。会上,锐捷网络发布了七大战略产品解决方案。其中网络安全产品事业部产品市场总监沈世海发布了“打造网络安全一体化的超预期体验”的主题报告。报告围绕让“让渠…...
通义灵码 Rules 库合集来了,覆盖Java、TypeScript、Python、Go、JavaScript 等
通义灵码新上的外挂 Project Rules 获得了开发者的一致好评:最小成本适配我的开发风格、相当把团队经验沉淀下来,是个很好功能…… 那么有哪些现成的 Rules 可以抄作业呢,今天我们官方输出了 Java、TypeScript、Python、Go、JavaScript 等语…...
3D人脸扫描技术如何让真人“进入“虚拟,虚拟数字人反向“激活“现实?
随着虚拟人技术的飞速发展,超写实数字人已经成为数字娱乐、广告营销和虚拟互动领域的核心趋势。无论是企业家、知名主持人还是明星,数字分身正在以高度还原的形象替代真人参与各类活动,甚至成为品牌代言、直播互动的新宠。 3D人脸扫描&#…...
12孔AG调陶笛音域全解析:从E4到C6的演奏艺术
一、音域范围的精准界定 12孔AG调陶笛的音域范围为E4(低音Mi)至C6(高音Do),横跨13个自然音级(即E4-F4-G4-A4-B4-C5-D5-E5-F5-G5-A5-B5-C6)。若以半音计算,实际覆盖15个半音…...
IDEA编译错误Refer to the generated Javadoc files in xxx apidocs dir
文章目录 一、IDEA编译报错 Refer to the generated Javadoc1.1、报错内容1.2、解决办法 一、IDEA编译报错 Refer to the generated Javadoc 1.1、报错内容 Command line was: /opt/jdk1.8.0_181/jre/../bin/javadoc options packagesRefer to the generated Javadoc files i…...
高效培训,借助课程编辑器塑造卓越团队
(一)打造沉浸式培训体验 在企业人才培养体系里,培训是提升员工能力素质的重要手段,课程编辑器中的 VR 技术为企业培训带来新体验。以机械制造企业为例,以往员工培训靠书面资料、平面图片或简单视频讲解复杂机械设备结…...
Pikachu靶场-CSRF
CSRF (跨站请求伪造) 详细介绍与技术分析 一、什么是 CSRF? CSRF(Cross-Site Request Forgery,跨站请求伪造),是一种利用已认证用户的身份,诱使该用户执行恶意操作的攻击手段。攻击者通过伪造一个用户请求,…...