Rockchip Android13 GKI开发指南

news2025/1/19 11:09:18

Rockchip Android13 GKI开发指南

文章目录

  • Rockchip Android13 GKI开发指南
    • GKI介绍
    • Google upstream kernel下载及编译
    • Rockchip SDK中GKI相关目录介绍
    • Rockchip GKI编译
      • 代码修改
      • 编译
      • 固件烧写
    • KO编译及修改
      • 添加新的模块驱动的方法
      • 调试ko方法
    • 开机log确认
      • uboot阶段
      • Android阶段
      • KO加载
      • KO加载报错
    • 调试技巧
      • 打印更多KO加载的log
      • 在RK的kernel打包中编译GKI使用的boot.img
      • 查看google发布的内核接口
    • 如何提交内核接口到upstream

GKI介绍

Android13 GMS和EDLA认证的一个难点是google强制要求要支持GKI。GKI通用内核映像,是google为了解决内核碎片化的问题,而设计的通过提供统一核心内核并将SoC和板级驱动从核心内核移至可加载模块中。核心内核为驱动模块提供了稳定的内核模块接口,模块驱动和核心内核可以独立进行更新。内核接口可以通过upstream的方式进行扩展。 Soc和板级厂商在驱动开发时需要使用已经定义的内核接口,如果要新加核心内核接口需要提交给google,这个周期会比较长,所以要提前做好开发准备。

Google upstream kernel下载及编译

Google的boot.img是定期发布,时间间隔比较长。 我们可以下载google的upstream的kernel源码自己编译boot.img进行验证和debug。

Google Upstream kernel下载链接:

repo init -u https://android.googlesource.com/kernel/manifest -b common-android13-5.10

需要翻墙下载

编译

tools/bazel run --config=fast //common:kernel_aarch64_dist -- --dist_dir=./out

生成boot.img

out/boot.img

Rockchip SDK中GKI相关目录介绍

  • kernel KO文件路径
mkcombinedroot/vendor_ramdisk/lib/modules/
  • Google boot.img路径
mkcombinedroot/prebuilts/boot-5.10.img
  • KO文件加载顺序配置文件
mkcombinedroot/res/vendor_ramdisk_modules.load
  • GPU mali库的路径
    GPU的mali库是单独编译在vendor.img中,源文件路径在
RK3588:
vendor/rockchip/common/gpu/MaliG610/lib/modules/bifrost_kbase.ko
RK356X:
vendor/rockchip/common/gpu/MaliG52/lib/modules/bifrost_kbase.ko
RK3326:
vendor/rockchip/common/gpu/MaliTDVx/lib/modules/mali_kbase.ko

Rockchip GKI编译

代码修改

GKI需要打开AB系统才能使用,具体代码修改如下:

  1. uboot需要打开AB配置
~/a2_Android13_sdk/u-boot$ git diff
diff --git a/configs/rk3568_defconfig b/configs/rk3568_defconfig
index fbd9820acc..e23e438792 100644
--- a/configs/rk3588_defconfig
+++ b/configs/rk3588_defconfig
@@ -207,6 +207,7 @@ CONFIG_RSA_N_SIZE=0x200
CONFIG_RSA_E_SIZE=0x10
CONFIG_RSA_C_SIZE=0x20
CONFIG_SHA512=y
CONFIG_LZ4=y
CONFIG_LZMA=y
CONFIG_SPL_GZIP=y
@@ -220,3 +221,4 @@ CONFIG_RK_AVB_LIBAVB_USER=y
CONFIG_OPTEE_CLIENT=y
CONFIG_OPTEE_V2=y
CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION=y
+CONFIG_ANDROID_AB=y
  1. Android的device产品目录下配置GKI选项
~/a2_Android13_sdk/device/rockchip/rk3588$ git diff
diff --git a/rk3588_t/BoardConfig.mk b/rk3588_t/BoardConfig.mk
old mode 100644
new mode 100755
index 50da541..06da5f3
--- a/rk3588_t/BoardConfig.mk
+++ b/rk3588_t/BoardConfig.mk
@@ -15,10 +15,21 @@
 #
 include device/rockchip/rk3588/BoardConfig.mk
 BUILD_WITH_GO_OPT := false
+BOARD_BUILD_GKI := true

-# AB image definition
-BOARD_USES_AB_IMAGE := false
-BOARD_ROCKCHIP_VIRTUAL_AB_ENABLE := false
+ifeq ($(strip $(BOARD_BUILD_GKI)), true)
+    #for gki
+    # AB image definition
+    BOARD_USES_AB_IMAGE := true
+    BOARD_ROCKCHIP_VIRTUAL_AB_ENABLE := true
+    #PRODUCT_KERNEL_CONFIG := rockchip_defconfig android-13.config
+    PRODUCT_KERNEL_CONFIG := gki_defconfig rockchip_gki.config
+    BOARD_BOOT_HEADER_VERSION := 4
+else
+    BOARD_ROCKCHIP_VIRTUAL_AB_ENABLE := false
+    BOARD_USES_AB_IMAGE := false
+    PRODUCT_KERNEL_CONFIG := rockchip_defconfig android-13.config
+endif

 BOARD_GRAVITY_SENSOR_SUPPORT := true
 BOARD_COMPASS_SENSOR_SUPPORT := true
@@ -26,14 +37,21 @@ BOARD_SENSOR_COMPASS_AK8963-64 := true
 BOARD_GYROSCOPE_SENSOR_SUPPORT := true
 BOARD_PROXIMITY_SENSOR_SUPPORT := true
 BOARD_LIGHT_SENSOR_SUPPORT := true
 ifeq ($(strip $(BOARD_USES_AB_IMAGE)), true)
     include device/rockchip/common/BoardConfig_AB.mk
     TARGET_RECOVERY_FSTAB := device/rockchip/rk3588/rk3588_t/recovery.fstab_AB
 endif
-
+ifeq ($(strip $(BOARD_BUILD_GKI)), true)
+    #for gki
+    BOARD_SUPER_PARTITION_SIZE := 4294967296
+    BOARD_ROCKCHIP_DYNAMIC_PARTITIONS_SIZE := $(shell expr $(BOARD_SUPER_PARTITION_SIZE) - 4194304)
+endif
 PRODUCT_UBOOT_CONFIG := rk3588
 PRODUCT_KERNEL_DTS := rk3588-evb1-lp4-v10
 BOARD_GSENSOR_MXC6655XA_SUPPORT := true
 BOARD_CAMERA_SUPPORT_EXT := true

编译

完整编译方式与非GKI的一样

source  build/envsetup.sh
lunch rk3588_t-userdebug
./build.sh -ACUKup

注意:这里编译的kernel只是为了编译出resource.img,kernel源码部分都是使用mkcombinedroot/vendor_ramdisk/lib/modules/下的ko文件直接打包成vendor_boot.img。内核部分使用的是google发布的boot.img,具体路径在mkcombinedroot/prebuilts/boot-5.10.img

编译完可以直接烧写 rockdev/Image-rk3588_t/update.img

在调试阶段也支持单独编译vendor_boot.img
编译命令:

make installclean;make vendorbootimage -j12

编译完可以直接烧写

out/target/product/rk3588_t/vendor_boot.img

固件烧写

固件烧写分2中方式:

  • 完整包update.img
    固件路径
rockdev/Image-rk3588_t/update.img

在这里插入图片描述

可以通过瑞芯微开发工具烧写

  • 散包烧写
    首先导入配置文件,方法是在工具 空白处右键-导入配置-选择导入txt文件-选择parameter.txt
    在这里插入图片描述
    然后依次选择rockdev/Image-rk3588_t/下对应的img文件进行烧写,分区A和B导入的固件是同一个
rockdev/Image-rk3588_t
├── baseparameter.img
├── boot.img
├── dtbo.img
├── init_boot.img
├── MiniLoaderAll.bin
├── misc.img
├── parameter.txt
├── resource.img
├── super.img
├── uboot.img
├── update.img
├── vbmeta.img
└── vendor_boot.img

在这里插入图片描述

KO编译及修改

添加新的模块驱动的方法

  1. 将驱动代码放到kernel-5.10对应的目录下,这里以新加触摸屏驱动gt1x为例进行说明。
    将gt1x的驱动放在drivers/input/touchscreen/下面,并添加对应的MakefileKconfig,这里按kernel的标准方式进行操作;
  2. 增加一个自己的config文件, 在arch/arm64/configs/下新建一个xxx_gki.config,并将CONFIG_TOUCHSCREEN_GT1X=m (m表示编译为ko)添加到xxx_gki.config中;
  3. 将ko文件名添加到load文件中, load文件在SDK的mkcombinedroot/res/目录下,如下

|.load文件名称| 对应分区 | makefile解析 |加载时间|
| - | - | - |
| vendor_ramdisk_modules.load | vendor_boot | vendor_ramdisk_gki.mk |ramdisk init阶段|
| vendor_modules.load | vendor | vendor_gki.mk |android启动时|
| recovery_modules.load | recovery | recovery_gki.mk |recovery阶段|

触摸屏驱动要在init阶段加载所以加到vendor_ramdisk_modules.load

echo "gt1x-ts.ko" >> res/vendor_ramdisk_modules.load

触摸屏驱动要在init阶段加载所以加到vendor_ramdisk_modules.load
同时要将也要在res/debug_list.load中添加,作为调试用,在这里面加编译的时候才会从kernel中更新对应的ko到vendor_boot.img中。 注意: res/debug_list.load仅做调试用,不需要提交到服务器上。

echo "gt1x-ts.ko" >> res/debug_list.load

注意 1:.load文件关乎驱动的加载顺序,请不要修改原有顺序,仅在需要时添加自己的驱动名称,否则可能会导致系统无法启动!!!

注意 2:如果使用A/B系统,请务必保证vendor_ramdisk_modules.loadrecovery_modules.load文件内容一致,否则会导致无法启动!代码默认使用软链接将二者链接起来,请不要自己修改!!!

注意 3:如果是在android启动的时候加载的ko可以放在vendor_modules.load中,但需要注意:vendor下的ko不会被系统主动加载!如果仅需要在开机阶段自动加载,可以使用Rockchip提供的默认加载脚本init.insmod.sh,该脚本会自动加载device/rockchip/common/rootdir/init.insmod.cfg配置中的所有ko。

  1. 编译
  • 进到kernel-5.10目录下进行ko文件编译

配置clang编译链(编译链版本请参考build.sh中的配置)

export PATH=../prebuilts/clang/host/linux-x86/clang-r450784d/bin:$PATH
make CROSS_COMPILE=aarch64-linux-gnu- LLVM=1 LLVM_IAS=1 ARCH=arm64 gki_defconfig rockchip_gki.config xxx_gki.config && make CROSS_COMPILE=aarch64-linux-gnu- LLVM=1 LLVM_IAS=1 ARCH=arm64 rk3588s-evb8-lp4x-v10.img -j32
  1. 拷贝KO文件到mkcombinedroot/vendor_ramdisk/lib/modules/
    KO编完后进到mkcombinedroot/下执行mkgki4.sh脚本自动从kernel-5.10下面拷贝; 也可以手动进行拷贝
cd ../mkcombinedroot/
./mkgki4.sh
  1. 编译vendor_boot.img
    在工程根目录下编译vendor_boot.img,命令如下。 这一步是将KO文件打包到vendor_boot.img,在降vendor_boot.img烧写到机器中。
make installclean;make vendorbootimage -j12
  1. 验证
  • 烧写out/target/product/rk3588_t/vendor_boot.img文件到机器中开机验证

  • 如果是放在vendor分区的ko可以在系统起来后直接push到机器内的vendor分区中,手动挂载进行验证

  • 如果有涉及到dts的修改,需要烧写kernel-5.10下的resource.img

附:AOSP定义的各类ko加载阶段

Boot modeStorageDisplayKeypadBatteryPMICTPNFC/Wi-Fi/BTSensorsCamera
RecoveryYYYYYNNNN
ChargerYYYYYNNNN
AndroidYYYYYYYYY

调试ko方法

  1. 在kernel-5.10目录下修改对应ko的驱动源码

  2. 使用如下命令进行ko编译

  • 配置clang编译链(编译链版本请参考build.sh中的配置)
    export PATH=../prebuilts/clang/host/linux-x86/clang-r450784d/bin:$PATH
    
  • 编译ko
    make CROSS_COMPILE=aarch64-linux-gnu- LLVM=1 LLVM_IAS=1 ARCH=arm64 gki_defconfig rockchip_gki.config xxx_gki.config && make CROSS_COMPILE=aarch64-linux-gnu- LLVM=1 LLVM_IAS=1 ARCH=arm64 rk3588s-evb8-lp4x-v10.img -j32
    
  1. 进到mkcombinedroot目录。将需要更新的ko文件名添加到res/debug_list.load

  2. 进到mkcombinedroot目录,配置dtb,执行./mkgki4.sh将ko文件打包到vender_boot.img

    cd ../mkcombinedroot/
    export MY_DTB=rk3588s-evb8-lp4x-v10
    ./mkgki4.sh
    
    1. 拷贝KO文件到mkcombinedroot/vendor_ramdisk/lib/modules/
      KO编完后进到mkcombinedroot/下执行mkgki4.sh脚本自动从kernel-5.10下面拷贝; 也可以手动进行拷贝
    cd ../mkcombinedroot/
    ./mkgki4.sh
    
    1. 编译vendor_boot.img
      在工程根目录下编译vendor_boot.img,命令如下。 这一步是将KO文件打包到vendor_boot.img,在降vendor_boot.img烧写到机器中。
     make installclean;make vendorbootimage -j12
    
    1. 验证
    • 烧写out/target/product/rk3588_t/vendor_boot.img文件到机器中开机验证
    • 如果是放在vendor分区的ko可以在系统起来后直接push到机器内的vendor分区中,手动挂载进行验证
    • 如果有涉及到dts的修改,需要烧写kernel-5.10下的resource.img
    1. 调试完成后,将vendor_ramdisk/lib/modules的ko文件(被脚本自动拷贝)进行提交

有关打包工具的详细说明,请参考:mkcombinedroot/README

注意:kernel编译ko的时候如果有修改了config,则编译中间会卡住很长一段时间,这是在做编译优化,根据编译服务器硬件配置不同优化的速度也不同,即卡住的时间也不同。 所以这个卡住是正常现象。

开机log确认

uboot阶段

内容header版本
vendor_ramdisk(v-ramdisk)V3+
bootconfigV4+
## Booting Android Image at 0x003ff000 ...
Kernel: 0x00400000 - 0x03088ffc (45604 KiB)
v-ramdisk:  0x0a200000 - 0x0a6944c8 (4690 KiB)
ramdisk:    0x0a6944c8 - 0x0a7e54df (1349 KiB)
bootconfig: 0x0a7e54df - 0x0a7e559c (1 KiB)
bootparams: 0x0a7e559c - 0x0a7e759c

Android阶段

GKI版本: Linux version 5.10.117-android13-9-00037-gbc08447eb7bd

[    0.000000][    T0] Booting Linux on physical CPU 0x0000000000 [0x412fd050]
[    0.000000][    T0] Linux version 5.10.117-android12-9-00037-gbc08447eb7bd (build-user@build-host) (Android (7284624, based on r416183b) clang version 
12.0.5 (https://android.googlesource.com/toolchain/llvm-project c935d99d7cf2016289302412d708641d52d2f7ee), LLD 12.0.5 (/buildbot/src/android/llvm-toolchai
n/out/llvm-project/lld c935d99d7cf2016289302412d708641d52d2f7ee)) #1 SMP PREEMPT Thu Aug 25 15:24:20 UTC 2022

Kernel command line: Header V4中不能存在androidboot.xxx这一类的命令行参数,这类参数全部在bootconfig中。此类参数可以通过cat /proc/bootconfig确认。

[    0.000000][    T0] Kernel command line: stack_depot_disable=on kasan.stacktrace=off kvm-arm.mode=protected cgroup_disable=pressure cgroup.memory=nokme
m storagemedia=emmc console=ttyFIQ0 firmware_class.path=/vendor/etc/firmware init=/init rootwait ro loop.max_part=7 bootconfig buildvariant=userdebug earl
ycon=uart8250,mmio32,0xfeb50000 irqchip.gicv3_pseudo_nmi=0 

KO加载

开始加载ko,可以看到log:

[    1.034730][    T1] Run /init as init process
[    1.036190][    T1] init: init first stage started!
[    1.040534][    T1] init: Loading module /lib/modules/io-domain.ko with args ''
[    1.042038][    T1] init: Loaded kernel module /lib/modules/io-domain.ko

KO加载报错

使用了未导出的符号,报错重启:

[    0.805736][    T1] cryptodev: Unknown symbol crypto_ahash_final (err -2)
[    0.806383][    T1] cryptodev: Unknown symbol sg_nents (err -2)
[    0.806972][    T1] cryptodev: Unknown symbol crypto_alloc_akcipher (err -2)
[    0.819768][    T1] Kernel panic - not syncing: Attempted to kill init! exitcode=0x00007f00

注: 正常不会出现此问题,参考 名词解释阶段——ABI进行处理

调试技巧

打印更多KO加载的log

修改ratelimit的值,可以打印更多init的log,方便查问题,init信息太少会把ko加载的报错信息隐藏掉。

xxx@sys2_206:~/a2_Android13_29_sdk/kernel-5.10$ git diff
diff --git a/include/linux/ratelimit_types.h b/include/linux/ratelimit_types.h
index b676aa419eef..db7eb5be2d8b 100644
--- a/include/linux/ratelimit_types.h
+++ b/include/linux/ratelimit_types.h
@@ -7,7 +7,7 @@
#include <linux/spinlock_types.h>
#define DEFAULT_RATELIMIT_INTERVAL     (5 * HZ)
-#define DEFAULT_RATELIMIT_BURST                10
+#define DEFAULT_RATELIMIT_BURST                1000

在RK的kernel打包中编译GKI使用的boot.img

先按正常编译步骤编译kernel,生成arch/arm64/boot/Image
用如下命令打包boot.img
mkbootimg --kernel arch/arm64/boot/Image --header_version 4 --output …/mkcombinedroot/prebuilts/boot-5.10.img

查看google发布的内核接口

标准的内核接口定义在android目录下:

:~/a5_google_kenrel/common$ tree a
android/ arch/
wlq@sys2_206:~/a5_google_kenrel/common$ tree android/
android/
├── abi_gki_aarch64
├── abi_gki_aarch64_core
├── abi_gki_aarch64_db845c
├── abi_gki_aarch64_exynos
├── abi_gki_aarch64_fips140
├── abi_gki_aarch64_galaxy
├── abi_gki_aarch64_generic
├── abi_gki_aarch64_hikey960
├── abi_gki_aarch64_rockchip
├── abi_gki_aarch64_type_visibility
├── abi_gki_aarch64_virtual_device
├── abi_gki_aarch64.xml
├── abi_gki_modules_exports
├── abi_gki_modules_protected
├── gki_aarch64_fips140_modules
├── gki_aarch64_modules
└── gki_system_dlkm_modules

如何提交内核接口到upstream

如果需要添加新的内核接口,可以生成对应的patch,再将patch通过瑞芯微的redmine系统提交个瑞芯微审核然后再统一提交给google

diff --git a/android/abi_gki_aarch64_rockchip b/android/abi_gki_aarch64_rockchip
index 3344cf064e06..203c79ff1123 100644
--- a/android/abi_gki_aarch64_rockchip
+++ b/android/abi_gki_aarch64_rockchip
@@ -2560,6 +2560,9 @@
   sdhci_remove_host
   sdhci_request
 
+# required by sensorbox.ko
+  kernel_sigaction
+
 # required by sensor_dev.ko
   class_create_file_ns
   class_remove_file_ns

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

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

相关文章

Java IO流详解

文章目录一、File1.1 构造方法1.2 文件操作 方法1.3 目录操作 方法1.4 文件检测 方法1.5 获取文件信息 方法1.6 应用练习二、IO 流2.1 InputStream 字节输入流 (读)&#x1f353;FileInputStream&#x1f353;BufferedInputStream2.2 OutputStream 字节输出流 (写)&#x1f34c…

【Redis】redis大key和大value的危害,如何处理?

前序 还记得上次和同事一起去面试候选人时&#xff0c;同事提了一个问题&#xff1a;Redis的大key有什么危害&#xff1f;当时候选人主要作答的角度是一个key的value较大时的情况&#xff0c;比如&#xff1a; 内存不均&#xff1a;单value较大时&#xff0c;可能会导致节点之…

[经验分享]gpt-3.5-Turbo|unity中实现http接口调用gpt新接口以及信息处理的实现案例分享

最近openAI发布了目前chatGPT所使用的模型gpt-3.5-Turbo&#xff0c;之前使用了text-davinci-003模型做了一个galgame的AI女友对话的demo。这次趁着新接口的发布&#xff0c;对这个demo也同步更新了模型调用的代码。本篇文章将分享一下&#xff0c;如何在unity里使用UnityWebRe…

记录一次PWM信号异常问题

问题我使用单片机输出PWM控制机械臂&#xff0c;但是控制过程中&#xff0c;机械臂总是会出现莫名的抽动。利用示波器测试PWM信号&#xff0c;发现信号正常。过程&#xff08;1&#xff09;在反复的测试过程中&#xff0c;队友提出&#xff0c;将示波器的地线放在左侧的GND波形…

计算机EI会议论文,和EI期刊论文有什么区别? - 易智编译EaseEditing

EI期刊论文&#xff0c;是期刊论文的一种。顾名思义&#xff0c;就是指发在期刊上的论文。 期刊论文发表的格式需要具体参考各期刊文章的要求学术论文格式&#xff0c;主要会发在月刊/季刊/年刊/不定期的刊上。 目前&#xff0c;国际著名的科技文献检索系统是SCI&#xff08;…

安卓-AndroidManifest.xml修复

解析编译之后的AndroidManifest文件格式&#xff1a;http://www.520monkey.com/archives/575 案例apk jadx打开发现AndroidManifest.xml异常&#xff0c;无法正常显示 那么我们用apktool反编译试试 apktool d APK逆向-2.apk -f可以看到报错了&#xff0c;显示不能解析此xml…

[SSD科普] 固态硬盘物理接口SATA、M.2、PCIe常见疑问,如何选择?

前言犹记得当年Windows 7系统体验指数中&#xff0c;那5.9分磁盘分数&#xff0c;在其余四项的7.9分面前&#xff0c;似乎已经告诉我们机械硬盘注定被时代淘汰。势如破竹的SSD固态硬盘&#xff0c;彻底打破了温彻斯特结构的机械硬盘多年来在电脑硬件领域的统治。SSD数倍于HDD机…

数据结构 “串“ 的补充提升与KMP算法及其优化的具体实现

❤️作者主页&#xff1a;微凉秋意 ✅作者简介&#xff1a;后端领域优质创作者&#x1f3c6;&#xff0c;CSDN内容合伙人&#x1f3c6;&#xff0c;阿里云专家博主&#x1f3c6; ✨精品专栏&#xff1a;C面向对象 &#x1f525;系列专栏&#xff1a;数据结构与课程设计 文章目录…

XSS漏洞基本概念

目录 XSS的原理和分类 XSS漏洞分类 dom 存储型 XSS的危害 XSS漏洞的验证 XSS的黑盒测试 XSS漏洞的白盒测试 XSS的原理和分类 xss全称跨站脚本攻击xss&#xff08;Cross Site Scripting&#xff09; 为了不和层叠样式表&#xff08;Cascading Style Sheets, CSS)的缩写混淆&am…

MCU实现对外部脉冲信号的计数功能

有的传感器会输出脉冲信号&#xff0c;MCU需要统计脉冲输入的个数&#xff0c;通常有如下实现方式&#xff1a; 1.GPIO中断 原理很简单&#xff0c;利用GPIO的上升沿或者下降沿中断&#xff0c;进中断的次数就是脉冲的个数。只需要在中断服务函数里计数即可。 使用GPIO中断需…

Streaming System是第一章翻译

GIthub链接&#xff0c;欢迎志同道合的小伙伴一起翻译 Chapter 1.Streaming101 如今&#xff0c;流数据处理在大数据中是非常重要的&#xff0c;其主要原因是&#xff1a; 企业渴望对他们的数据有更及时的了解&#xff0c;而转换到流处理是实现更低延迟的一个好方法&#xf…

使用vite+vue3.0 创建一个cesium基础应用 ----01 项目搭建

使用vitevue3.0 创建一个cesium基础应用 ----01 项目搭建 1.使用yarn创建一个vite项目 我们可以在vite官网找到vite创建项目的命令 https://cn.vitejs.dev/ 可以使用yarn创建项目选择使用vue3.0框架&#xff0c;语言使用js 创建完成后结构如下&#xff1a; 2.找到vite社区中的…

idea通过Dockerfile上传项目到服务器

Docker通过Dockerfile上传项目 文章目录Docker通过Dockerfile上传项目1.创建一个简单的springBoot项目2.写一个简单的接口3.写Dockerfile文件4.新建docker镜像5.上传代码运行1.创建一个简单的springBoot项目 点击文件–>新建–>项目 点击选择Spring Initializer &#x…

火山引擎 DataTester:A/B 实验如何实现人群智能化定向?

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 在精细化运营时代&#xff0c;用户需求和业务场景愈加多元&#xff0c;在产品功能迭代以及各类活动中&#xff0c;面向不同人群的兴趣点&#xff0c;有针对性地“精…

导师信息管理系统

技术&#xff1a;Java、JSP等摘要&#xff1a;随着我国教育产业化的飞速发展&#xff0c;社会对教育水平和教学管理软硬件的要求日益提高&#xff0c;尤其是对一个学校能够具有一整套的管理软件提出了更多的要求。为了适应这种形式&#xff0c;教育系统尤其是大学不仅首先要有坚…

小成本互联网创业怎么做?低成本创业的方法分享

多数人都会有想法创业&#xff0c;尤其是在互联网上面创业&#xff0c;很多人看到了商机&#xff0c;但是因为成本的原因又放弃了&#xff0c;实际上&#xff0c;小成本也可以互联网创业&#xff01;那么&#xff0c;小成本互联网创业怎么做&#xff1f;低成本创业的方法在这里…

【React】React——redux

&#x1f6a9;&#x1f6a9;&#x1f6a9; &#x1f48e;个人主页: 阿选不出来 &#x1f4a8;&#x1f4a8;&#x1f4a8; &#x1f48e;个人简介: 一名大二在校生,学习方向前端,不定时更新自己学习道路上的一些笔记. &#x1f4a8;&#x1f4a8;&#x1f4a8; &#x1f48e;目…

Java 数据类型

数据类型用于对数据归类&#xff0c;以便开发者理解和操作。 基本数据类型 Java 确定了每种基本数据类型所占存储空间的大小&#xff0c;不会像其它语言那样随机器硬件架构的变化而变化&#xff0c;这使 Java 程序更具可移植性。 Java 中定义了如下的基本数据类型。 byte …

【MobileNet V2】MobileNet V2

目录1、简介2、论文创新点1&#xff09;倒残差结构 -- Inverted residual block2&#xff09;ReLU63、网络结构文献名称&#xff1a;MobileNetV2: Inverted Residuals and Linear Bottlenecks 发表时间&#xff1a;2018年 下载地址&#xff1a;https://openaccess.thecvf.com/c…

Vue基础入门讲义(四)-组件化

文章目录1.引言2.定义全局组件3.组件的复用4.局部注册5.组件通信5.1.父向子传递props5.2.传递复杂数据5.3.子向父的通信1.引言 在大型应用开发的时候&#xff0c;页面可以划分成很多部分。往往不同的页面&#xff0c;也会有相同的部分。例如可能会有相同的头部导航。 但是如果…