Android系统源码 目录结构

news2024/11/18 22:58:07

前言:Android官方在线看源码地址

https://cs.android.com/

image.png

1.Android系统架构

Android系统架构分为五层,从上到下依次是应用层、应用框架层、系统运行库层、硬件抽象层和Linux内核层。

image.png

AOSP 架构

AOSP 的软件堆栈包含以下层:
image.png
图 1. AOSP 软件堆栈架构。

下面列出了图 1 中使用的术语的定义:

  • Android 应用

    完全使用 Android API 开发的应用。Google Play 商店广泛用于查找和下载 Android 应用,不过也有许多其他替代方案。在某些情况下,设备制造商可能希望预安装 Android 应用以支持设备的核心功能。如果您对开发 Android 应用感兴趣,请访问 developers.android.com

  • 特权应用

    使用 Android 和系统 API 组合创建的应用。这些应用必须作为特权应用预安装在设备上。

  • 设备制造商应用

    结合使用 Android API、系统 API 并直接访问 Android 框架实现而创建的应用。由于设备制造商可能会直接访问 Android 框架中的不稳定的 API,因此这些应用必须预安装在设备上,并且只能在设备的系统软件更新时进行更新。

  • 系统 API

    系统 API 表示仅供合作伙伴和 OEM 纳入捆绑应用的 Android API。这些 API 在源代码中被标记为 @SystemApi。

  • Android API

    Android API 是面向第三方 Android 应用开发者的公开 API。如需了解 Android API,请参阅 Android API 参考文档。

  • Android 框架

    构建应用所依据的一组 Java 类、接口和其他预编译代码。框架的某些部分可通过使用 Android API 公开访问。框架的其他部分只能由 OEM 通过系统 API 来访问。Android 框架代码在应用进程内运行。

  • 系统服务

    系统服务是重点突出的模块化组件,例如 system_server、SurfaceFlinger 和 MediaService。Android 框架 API 提供的功能可以与系统服务进行通信,以访问底层硬件。

  • Android 运行时 (ART)

    AOSP 提供的 Java 运行时环境。 ART 会将应用的字节码转换为由设备运行时环境执行的处理器专有指令。

  • 硬件抽象层 (HAL)

    HAL 是一个抽象层,其中包含硬件供应商要实现的标准接口。借助 HAL,Android 可以忽略较低级别的驱动程序实现。借助 HAL,您可以顺利实现相关功能,而不会影响或更改更高级别的系统。如需了解详情,请参阅 HAL 概览。

  • 原生守护程序和库

    该层中的原生守护程序包括 inithealthdlogdstoraged。这些守护程序直接与内核或其他接口进行交互,并且不依赖于基于用户空间的 HAL 实现。

    该层中的原生库包括 libclibloglibutilslibbinderlibselinux。这些原生库直接与内核或其他接口进行交互,并且不依赖于基于用户空间的 HAL 实现。

  • 内核

    内核是任何操作系统的中心部分,并与设备上的底层硬件进行通信。尽可能将 AOSP 内核拆分为与硬件无关的模块和特定于供应商的模块。如需了解 AOSP 内核组件的说明(包括其定义),请参阅内核概览。

image.png

应用层

系统内置的应用程序以及非系统级的应用程序都是属于应用层。负责与用户进行直接交互,通常都是用Java进行开发的。

应用框架层(Java Framework)

应用框架层为开发人员提供了可以开发应用程序所需要的API,我们平常开发应用程序都是调用的这一层所提供的API,当然也包括系统的应用。这一层的是由Java代码编写的,可以称为Java Framework。下面来看这一层所提供的主要的组件。

名称功能描述
Activity Manager(活动管理器)管理各个应用程序生命周期以及通常的导航回退功能
Location Manager(位置管理器)提供地理位置以及定位功能服务
Package Manager(包管理器)管理所有安装在Android系统中的应用程序
Notification Manager(通知管理器)使得应用程序可以在状态栏中显示自定义的提示信息
Resource Manager(资源管理器)提供应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件、颜色文件等
Telephony Manager(电话管理器)管理所有的移动设备功能
Window Manager(窗口管理器)管理所有开启的窗口程序
Content Providers(内容提供器)使得不同应用程序之间可以共享数据
View System(视图系统)构建应用程序的基本组件

表1

系统运行库层(Native)

系统运行库层分为两部分,分别是C/C++程序库和Android运行时库。下面分别来介绍它们。

1.C/C++程序库

C/C++程序库能被Android系统中的不同组件所使用,并通过应用程序框架为开发者提供服务,主要的C/C++程序库如下表2所示。

名称功能描述
OpenGL ES3D绘图函数库
Libc从BSD继承来的标准C系统函数库,专门为基于嵌入式Linux的设备定制
Media Framework多媒体库,支持多种常用的音频、视频格式录制和回放。
SQLite轻型的关系型数据库引擎
SGL底层的2D图形渲染引擎
SSL安全套接层,是为网络通信提供安全及数据完整性的一种安全协议
FreeType可移植的字体引擎,它提供统一的接口来访问多种字体格式文件

表2

2.Android运行时库

运行时库又分为核心库和ART(5.0系统之后,Dalvik虚拟机被ART取代)。核心库提供了Java语言核心库的大多数功能,这样开发者可以使用Java语言来编写Android应用。相较于JVM,Dalvik虚拟机是专门为移动设备定制的,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik 应用作为一个独立的Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。而替代Dalvik虚拟机的ART 的机制与Dalvik 不同。在Dalvik下,应用每次运行的时候,字节码都需要通过即时编译器转换为机器码,这会拖慢应用的运行效率,而在ART 环境中,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用。

硬件抽象层(HAL)

硬件抽象层是位于操作系统内核与硬件电路之间的接口层,其目的在于将硬件抽象化,为了保护硬件厂商的知识产权,它隐藏了特定平台的硬件接口细节,为操作系统提供虚拟硬件平台,使其具有硬件无关性,可在多种平台上进行移植。 从软硬件测试的角度来看,软硬件的测试工作都可分别基于硬件抽象层来完成,使得软硬件测试工作的并行进行成为可能。通俗来讲,就是将控制硬件的动作放在硬件抽象层中。

Linux内核层

Android 的核心系统服务基于Linux 内核,在此基础上添加了部分Android专用的驱动。系统的安全性、内存管理、进程管理、网络协议栈和驱动模型等都依赖于该内核。
Android系统的五层架构就讲到这,了解以上的知识对以后分析系统源码有很大的帮助。

2.Android系统源码目录

我们要先了解Android系统源码目录,为后期源码学习打下基础。关于源码的阅读,你可以访问http://androidxref.com/来阅读系统源码。当然,最好是将源码下载下来。下载源码可以使用清华大学开源软件镜像站提供的Android 镜像:https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ 。如果觉得麻烦也可以查找国内的网盘进行下载,推荐使用该百度网盘地址下载:http://pan.baidu.com/s/1ngsZs,它提供了多个Android版本的的源码下载。

整体结构

各个版本的源码目录基本是类似,如果是编译后的源码目录会多增加一个out文件夹,用来存储编译产生的文件。Android7.0的根目录结构说明如下表所示。

Android源码根目录描述
abi应用程序二进制接口
art全新的ART运行环境,Android5.0之后java虚拟机就使用ART
bionic系统C库,Android改造的C/C++库, 比传统的glibc更精简,不受GPL限制,支持 pthread_cancel(), 不支持C++ exception和C++ STL模板编程
bootable启动引导相关代码 包含了recovery程序(恢复出厂/升级)的代码
build存放系统编译规则及generic等基础开发包配置 Android编译系统,定义了各种编译规则,并包含通用产品配置
ctsAndroid兼容性测试套件标准,CTS 是一个自动化测试套件,包含PC端和设备端(被测设备), 对手机的硬件,软件,接口,性能进行测试 ,测试项目包含平台 API 测试,平台 Intent,蓝牙设备的连接状况, 相机拍照功能等,通过make cts编译, out/host/linux-x86/cts/下生成android-cts文件夹。由于Android是开源的,对于Google Android的开发联盟中的Motorola、Samsung、Qualcomm 、Sony Ericsson、中国移动、ZTE、华为等,底层的代码也是开放的。手机制造商及运营商可以在Android上打造,定制自己特有的手机操作系统,这势必在源码级别上对Android系统进行代码的添加和更改。如果不规范这些更改则会给上层的应用开放的移植带来问题(那个时候你会看到MOTO上跑的愤怒的小鸟会在三星的Android手机上运行不了,每个应用需要都要发布不同厂商的Android手机的版本),只有通过CTS测试的Android手机系统,Google才会颁发许可,以保证不同生产商之间的Android系统的兼容
dalvikAndroid Dalvik虚拟机相关内容,主要是提供了一下工具,如dexdump, vm主代码已经移除
developers开发者目录, 一些应用程序的参考实例demo代码
development应用程序开发相关 提供应用开发的工具, 应用例子,monkey命令,shell脚本和python脚本:development/scripts/stack:用于展开进程异常时的堆栈信息, 配合tombstone文件development/scripts/gdbclient.py: 用于gdb调试development/scripts/native_heapdump_viewer.py脚本将dumpheap进程结果转换成更易读的html格式development/tools/make_keys: 系统签名生成器development/tools/idegen: 用于生成android.ipr、android.iml IEDA工程配置文件,可以用android studio来导入android源码
device设备相关配置 设备产品定制目录, 该目录是厂商和产品公司定制文件比较多的地方
vendor厂商定制目录,该目录可以新建出来
docs参考文档目录
external开源模组相关文件 外部第三方开源的库和工具,比如ppp, wpa_supplicant, libz, libcurl等
frameworks应用程序框架,Android系统核心部分,由Java和C++编写, 包括各种系统资源, 后台服务, SystemUI, 大部分都是java代码, 同时也包含了各种子系统的native代码, 如av, net等
hardware主要是硬件抽象层的代码, 如gps, wifi, viberate
kernel内核源码,厂商可以将内核源码集成到该目录
libcore核心库相关文件 Android 系统中支持众多 Java 标准的库,例如 java.lang 包,libart库,JSON库
libnativehelper动态库,实现JNI库的基础 ,JNI编程时调用的各种接口实现代码, 如findClass(), 最终编译成libnativehelper.so
ndkNDK相关代码,帮助开发人员在应用程序中嵌入C/C++代码
out编译完成后代码输出在此目录
packages应用程序包,系统内置的app源码, 如设置, 墙纸,输入法,屏保等,apps:核心应用程序,inputmethods:输入法目录,providers:内容提供者目录,screensavers:屏幕保护,services:通信服务,wallpapers:墙纸
pdkPlatform Development Kit 的缩写,平台开发套件, PDK的目标是帮助芯片组供应商和原始设备制造商迁移到新的版本。在PDK推出之前,未能参与Google早期开发设备计划的OEM厂商和半导体供应商必须等到Android开源版本公布后,才能开始进行开发。而从Jelly Bean,也就是Android 4.1版本开始Google在发布新的Android版本之前会Release给与其签约过的OEM厂商和半导体供应商PDK(PDK的获取需要授权,因为PDK中的新版Android尚未正式发布),这样OEM厂商不会再落后于Google挑选的独家早期开发伙伴。PDK版本只包含开发android HAL(硬件抽象层)所必需的组件。请注意,完整的android版本是PDK版本的超集,并且没有单独的PDK发布给公众
platform_testingAndroid平台测试程序
prebuilts预编译文件夹, x86和arm架构下预编译的一些资源,如ndk工具包, gcc编译器等
sdksdk和模拟器,编译sdk规则目录, Android的SDK包含该平台为应用程序开发人员提供的开发工具,主要是所有公开API的集合,应用程序开发人员可以借助SDK中的API快速的进行应用的开发.
systemAndroid底层文件系统库、应用和组件,如busybox, init进程
testAndroid Vendor测试框架,如vts(vendor test suit) ,Mainline Test Suite (MTS), mltsvts的概念: CTS确保保了 APP 与 Android Framework 之间有一致的调用接口(API),这使得 APP 开发者编写的同一款程序可以运行在不同系统版本(向前兼容)、不同硬件平台、不同厂商制造的不同设备上。 VTS 类似 CTS,通过对 Vendor Interface 进行测试,确保同一个版本的 Android Framework 可以运行在不同 HAL 上,或不同 Android Framework 可以运行在 同一个 HAL 上。 通过这样的 Framework / HAL 分离设计和接口一致性保证,也使得 8.0 版本之后的 Android 系统在进行升级时,可以直接对 Framework 进行升级而不用考虑 HAL 层的改动,从而缩短了用户手上设备得到系统升级 OTA 推送的时间Mainline Test Suite (MTS), MTS由一组测试框架和测试用例组成,旨在帮助增强主线分支代码的健壮性、可靠性和合规性。mlts是Android 机器学习测试套件
toolchain工具链文件,一些python测试脚本
tools工具文件,一些特殊命令, 如acloud命令用于连接谷歌云端工作站的,apkzlib用于apk打包的
Makefile全局Makefile文件,用来定义编译规则

表3
从表3可以看出,系统源码分类清晰,并且内容庞大且复杂。接下来分析packages中的内容,也就是应用层部分。

应用层部分

应用层位于整个Android系统的最上层,开发者开发的应用程序以及系统内置的应用程序都是在应用层。源码根目录中的packages目录对应着系统应用层。它的目录结构如表4所示。

packages目录描述
apps核心应用程序
experimental第三方应用程序
inputmethods输入法目录
providers内容提供者目录
screensavers屏幕保护
services通信服务
wallpapers墙纸

表4

从目录结构可以发现,packages目录存放着系统核心应用程序、第三方的应用程序和输入法等等,这些应用都是运行在系统应用层的,因此packages目录对应着系统的应用层。

应用框架层部分

应用框架层是系统的核心部分,一方面向上提供接口给应用层调用,另一方面向下与C/C++程序库以及硬件抽象层等进行衔接。 应用框架层的主要实现代码在/frameworks/base和/frameworks/av目录下,其中/frameworks/base目录结构如表5所示。

/frameworks/base目录描述/frameworks/base目录描述
api定义APIcmds重要命令:am、app_proce等
core核心库data字体和声音等数据文件
docs文档graphics图形图像相关
include头文件keystore和数据签名证书相关
libslocation地理位置相关库
media多媒体相关库native本地库
nfc-extrasNFC相关obex蓝牙传输
opengl2D/3D 图形APIpackages设置、TTS、VPN程序
saxXML解析器services系统服务
telephony电话通讯管理test-runner测试工具相关
tests测试相关tools工具
wifiwifi无线网络

表5

C/C++程序库部分

系统运行库层(Native)中的 C/C++程序库的类型繁多,功能强大,C/C++程序库并不完全在一个目录中,这里给出几个常用且比较重要的C/C++程序库所在的目录位置。

目录位置描述
bionic/Google开发的系统C库,以BSD许可形式开源。
/frameworks/av/media系统媒体库
/frameworks/native/opengl第三方图形渲染库
/frameworks/native/services/surfaceflinger图形显示库,主要负责图形的渲染、叠加和绘制等功能
external/sqlite轻量型关系数据库SQLite的C++实现

表6讲完 C/C++程序库部分,剩下的部分我们在表3已经给出:Android运行时库的代码放在art/目录中。硬件抽象层的代码在hardware/目录中,这一部分是手机厂商改动最大的一部分,根据手机终端所采用的硬件平台会有不同的实现。

system目录

Android作为linux系统, 在构建最小系统时,需要祖先init进程, 依赖库,二进制工具linux命令,以及各种守护进程等, system目录就提供了这些东西,该目录大部分都是C/C++代码

目录位置描述
apexapexd守护进程源码,负责处理apex安装包的。
ashmemd
bpf
bpfprogs
btAndroid bluedroid协议栈
ca-certificates
chreContext Hub Runtime Environment (CHRE),用于平衡大小核运行不同程序的场景, 提供api,保证小型的本机应用程序(称为nanoapps )在低功耗处理器上执行
connectivity包含wificond进程,该进程通过标准 nl80211命令与WLAN 驱动程序进行通信
core包含各种依赖库,adb,祖先init进程源码,lmkd,logcat, toolbox
extras各种额外的命令工具, 比如su,memtrack(追踪graphic相关内存),playwav命令,以及一些测试代码
gatekeeper防护程序,如锁屏密码等
gsid通用系统镜像守护进程
hardware网络相关的HIDL描述文件
hwservicemanagerHAL服务管理中心,负责管理系统中的所有HAL服务,由init进程启动,属于vendor的binder通信机制,类似framework中的binder
iorapIOrap用于缩短应用程序的启动时间,该目录包含iorapd守护进程和相应的库文件
keymaster
libfmq
libhidl硬件接口定义语言依赖库
libhwbinderhwbinder依赖库
libsyspropsysprop说明文件 (.sysprop) 将系统属性定义为 API, 在java/c++代码中可以通过api访问跨分区的属性,类似以前android版本中的SystemProperties
libufdt
libvintf
linkerconfig
media包括alsa、audio、camera相关的头文件
netdAndroid中专门负责网络管理和控制的后台守护进程,如管理DNS,设置防火墙,带宽控制
nfc
nvram
security
sepolicyselinux权限策略配置目录
server_configurable_flags
testing
timezone
toolsaidl,hidl可执行程序的源码路径
ucontainer
update_engine负责A/B升级的核心逻辑代码
voldVolume守护进程,用来管理Android中存储类的热拔插事件,如设备增加,删除,修改等事件处理

framework目录

目录位置描述
avaudio/video, 如音视频解码器,录屏工具, 摄像头框架相关代码, 多媒体框架供上层程序调用的java API,连接java和C/C++的jni部分, 在framework/base/media 下
base基础核心代码
compile包含libbcc,mclinker(llvm编译器的插件) slang(Renderscript语言的编译器)
exAndroid内部使用的公共类,如联系人、小部件、io, 以及全新的相机框架 Camera2的部分代码
hardware描述传感器,虚拟现实VR,camera等硬件的HIDL接口的文件.hal
layoutlib布局相关
minikinAndroid原生字体,连体字效果
ml机器视觉
multidex多dex加载器,大多数App,解压其apk后,一般只有一个classes.dex文件,采用MultiDex的App解压后可以看到有classes.dex,classes2.dex,… classes(N).dex
nativec/c++本地语言编写的相关工具源码和特定硬件控制的头文件,如 bugreport, dumpstate, 各种硬件的访问权限声明
opt一些UI插件和java后台服务,如timezonepicker,datetimepicker, colorpicker, 网络服务,如EthernetService, WifiService, 电话服务telephony
rs渲染脚本rendor script
wilhelm基于Khronos的OpenSL ES/OpenMAX AL的audio/multimedia实现
framework/av/ 下
目录位置描述
aidl
apex
cameralibcamera_client共享库,是camera框架部分的client代码
cmds包括录屏工具,stagefright进程
drm
include
media提供音视频编解码的各种库和工具,后台进程如audioserver, mediaserver(通过binder的进程间通信方式来完成其他进程(如音乐播放器)的请求)
services多媒体相关的后台服务, 如cameraservice,audioflinger
MODULE_LICENSE_APACHE2
CleanSpec.mk
NOTICE
OWNERS
soundtrigger
tools
framework/base/ 下

其中base目录中是应用框架层的主要核心代码,目录结构如下

目录位置描述
apct-tests
apex
api声明了android应用框架层的类、属性和资源
boot
cmds开机启动的进程代码和命令(脚本), 著名的zygote进程代码和启动动画代码就在此处
config
core/javaAndroid应用开发锁依赖的各种包, 四大组件代码就在此,如android/app/Activity.java,android/app/Service.java,android/content/ContentProvider.java,/android/content/BroadcastReceiver.java
core/jni服务于android系统java核心代码所需要的jni,被编译成libandroid_runtime.so
core/res系统中所需要的各种资源, 图片,字符串,尺寸,布局文件等
core/proto
core/tests
core/xsd
data系统默认的铃声,字体, 根文件系统etc目录部分配置文件,触摸需要的kl, kcm文件等
docs
drmDigital Rights Management(数字版权管理) ,应用根据与受版权保护的内容关联的许可限制来管理自己的内容,从而达到保护应用内容的知识产权
errorprone
graphic为应用提供的android.graphics包,提供基本的图形原语(如画点画线,设置图形上下文等)另外和图形相关的包:android.view图形事件机制和android.widget包提供开发图形用户界面的控件
identity
keystore提供android.security.keystore包, 应用可以通过KeyStore API生成密钥、使用密钥签名, keystorek可以保护密钥材料免遭未经授权的使用
libs大部分都是c/c++代码,编译成so, 如Canvas 的drawing 操作转换为OpenGL 的操作的libhwui.so
location定位相关接口,被App调用的,API包是android.location
lowpan提供android.net.lowpan报,提供基于IPv6的低速无线个域网的API, lowpan功能与Zigbee类似
media多媒体相关接口,被App调用的, 包含MediaPlayer代码
mime
mms
native部分硬件相关的jni库:如sensor, net, 存储管理, 最后合并在libandroid.so中
nfc-extras
obex蓝牙文件传输obex协议
omapi
opengl提供android.opengl包, 提供android 2D/3D图形处理各种API
packages著名的SystemUI,彩蛋,锁屏,SettingProvider(系统设置数据提供者)
proto
rs提供android.renderscript 包,RenderScript 是Android 平台上的一种类C脚本语言,用于渲染绘图
samples
sax
servicesandroid开机启动的大部分后台服务,如PMS, AMS, WMS等
startop
telecomm
telephony电话相关
test-base
test-legacy
test-mock
test-runner
tests
tools提供应用开发的各种工具和脚本:如aapt
wifi提供android.net.wifi包,如wifi扫描, p2p,hotspot2相关API

libcore目录

libcore 提供Android 系统中支持众多 Java 标准的库,例如 java.lang 包

目录位置描述
luniJava 基础包、扩展包、组织提供的类库等,luni 实际上是 lang、util、net、io 这 4 个内容头字母的组合,通过文件luni/src/module/java/module-info.java可以导出的所有类
libartart 运行时部分相关包
dalvikdalvik 虚拟机相关的包
dom文档对象模型,用于解析xml
jsonjson 串在 Java 中的支持
xml一种轻量级的xml解析工具
ojluniOpen JDK 版的 Java 包,android7.0之后就开始用这个开源的java api

未完待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/828078.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PCB专题】案例:Allegro如何在PCB板上直接修改封装中的特定焊盘

在实际产品设计中我们很可能因为结构、封装的制约而将两个器件放的很近。并且也可能因为是接口器件,所以要求上锡量要多。 但是因为成本的原因我们很可能不会去为了几个器件增加钢网的阶数,以求获得更多的锡量,让PIN脚爬锡更好。而会通过扩大钢网开口的形式来增加锡量。 如…

前端技术基础-css

前端技术基础-css【了解】 一、css理解 概念:CSS:C(cascade) SS(StyleSheet) ,级联样式表。作用:对网页提供丰富的视觉效果,进行美化页面(需要在html页面基础上)样式规则:样式1:值1;样式2&…

FPGA学习——电子时钟模拟(新)

文章目录 一、数码管简介二、C4开发板数码管原理图三、代码实现四、实现效果五、总结 博主在之前曾经编写过一篇电子时钟的博客(详情请见此篇博文),但曾经编写的电子时钟,未显示小数点位,同时当时的数码管模块是为了电…

增量式PID算法及其MATLAB实现

增量式PID算法是一种常用的控制算法,用于控制系统中的反馈控制。它通过对系统的误差进行递推式的计算,实现对系统输出的调节,使得系统的输出逐渐趋向于设定值。 delta u(k)=u(k)-u(k-1)=Kp*(e(k)-e(k-1))+Ki*e(k)+Kd*(e(k)-2*e(k-1)+e(k-2)) PID算法由三个部分组成:比例(…

如何通过Navicat连接Oracle数据库

本文介绍如何通过Navicat 连接Oracle数据库。以往总是使用Oracle客户端来连接Oracle数据库,但是Oracle客户端一般有几百M的大小,而且安装繁琐配置麻烦。如果可以通过Navicat直接连接Oracle则会非常轻松方便。 1、下载Instant Client Base 用使用Navicat…

【contenteditable属性将元素改为可编辑状态】

元素添加contenteditable属性之后点击即可进入编辑状态 像这种只修改一条属性不必再打开弹框进行编辑&#xff0c;使用contenteditable会很方便 添加失焦、回车、获焦事件 如 <p :contenteditable"item.contenteditable || false"keydown.enter"key($event…

HarmonyOS/OpenHarmony-ArkTS基于API9元服务开发快速入门

一、创建项目 二、创建卡片 三、添加资源 四、具体代码 Entry Component struct WidgetNewCard {/** The title.*/readonly TITLE: string harmonyOs;readonly CONTEXT: string 技术构建万物智联;/** The action type.*/readonly ACTION_TYPE: string router;/** The…

fastadmin列表页 修改 正序排列 倒序排列 desc asc

打开控制器对应的 js文件 &#xff0c;文件目录为 public/assets/js/backend/xxx.js

接口自动化报告,生成本地服务并自动打开时失败

错误原因&#xff1a; 端口号被占用 首先可以在cmd中调出命令窗口然后执行命令netstat -ano就可以查看所有活动的链接&#xff0c;找到被占用的端口号 1、通过命令taskkill /f /t /im "进程名称" &#xff0c;根据进程的名称杀掉所有的进程。或者taskkill /f /t /p…

《码上行动:零基础学会Python编程》书籍分享

Python是一种高级的、面向对象的编程语言&#xff0c;由Guido van Rossum于1991年开发。它具有简洁、易读和可维护的语法&#xff0c;被广泛用于科学计算、Web开发、数据分析、人工智能等领域。 以下是Python的一些特点和优势&#xff1a; 简洁易读&#xff1a;Python采用简洁…

svn工具使用

svn 介绍 解决之道&#xff1a; SCM&#xff1a;软件配置管理 所谓的软件配置管理实际就是对软件源代码进行控制与管理 CVS&#xff1a;元老级产品 VSS&#xff1a;入门级产品 ClearCase&#xff1a;IBM 公司提供技术支持 SVN&#xff1a;主流产品 什么是SVN&#xff…

ATFX汇市:惠誉下调美债评级,白宫债务无序扩张下,美元国际信用受损

环球汇市行情摘要—— 昨日&#xff0c;美元指数上涨0.06%&#xff0c;收盘在101.94点&#xff0c; 欧元贬值0.12%&#xff0c;收盘价1.0984点&#xff1b; 日元贬值0.75%&#xff0c;收盘价143.33点&#xff1b; 英镑贬值0.46%&#xff0c;收盘价1.2776点&#xff1b; 瑞…

【WiFi】Wi-Fi HaLow技术

目录 1.10大Wi-Fi物联网芯片 2.面向物联网的无线通信技术对比 3.Wi-Fi HaLow值得期待 4.选择IoT Wi-Fi芯片和模块时需要考虑哪些因素&#xff1f; 5.Wi-Fi 6 IoT芯片 5.1.乐鑫科技ESP32-C6 5.2.高通Immersive Home 318平台 6.WiFi BLE IoT芯片 6.1.博流智能 BL602/BL…

SQL-事务

set autocommit 0; select * from acount where name 嘉宝 && acount.money > 1000; update acount set money money - 1000 where name 嘉宝; update acount set money money 1000 where name 煎包; commit ; 脏读;当有两个事务使用同一数据库时&#xff0c…

使用 github 同步谷歌浏览器书签

想必使用谷歌浏览器Chrome的用户一定非常头疼的一件事就是&#xff1a;账户不能登录&#xff0c;书签收藏夹不能同步&#xff0c;换一台电脑书签收藏夹没有了&#xff01; 下面教大家一招亲测有效适用的方法解决书签同步问题&#xff0c;在任何电脑都可以同步了 1、去下载谷歌…

Delphi 中High DPI开发注意事项

目录 前言&#xff1a; 什么是High DPI? 一、表现不一致的现象 二、当前的解决方案 三、重点 前言&#xff1a; 什么是High DPI? High DPI&#xff08;高分辨率显示&#xff09;是指显示设备具有高像素密度的特征。它意味着在相同的显示区域内&#xff0c;显示设备能够…

第7章 动态创建标记

一些传统方法 document.write document对象的write()方法可以方便快捷地把字符串(支持html元素)插入到文档里。 document.write("<h1>hello world</h1>")document.write的最大缺点是它违背了“行为应该与表现分离”的原则。JavaScript和HTML代码混杂在…

eNSP interface g0/0/0 报错解决办法

文章目录 1 报错截图2 解决办法2.1 排查设备是否有 GM 接口2.2 更换适合的路由器&#xff0c;并验证 1 报错截图 2 解决办法 2.1 排查设备是否有 GM 接口 查看下设备是否支持 GM 接口&#xff08;GigabitEthernet&#xff09; 方式一&#xff1a;右键路由器设备 - 设置 - 查看…

【C++】类和对象-继承

0.前言 1.基本语法 继承的用处就是极大的减少代码的重复性&#xff0c;如果没有用继承&#xff0c;看看以下代码&#xff0c;你知道了。。。。 基本实现代码&#xff1a; #include <iostream> using namespace std; /******************************************/void …

8.5周六|Move Dev Meetup厦门站不见不散

Move Dev Meetup是由MoveFuns DAO发起的线下研讨会&#xff0c;旨在为参与的开发者提供深入了解Move语言机会。截至目前为止&#xff0c;Meetup已在成都、深圳、杭州等多个城市举办。Move Dev Meetup厦门站将在8月5日&#xff08;本周六&#xff09;举办&#xff0c;Sui将作为支…