1.Unity - Addressables项目总结(一):基础工作流
2.飞凌嵌入式i.MX 8M Plus开发板的源码OTA远程升级方案
3.转载Celadon快速上路指南Part2:编译Celadon镜像
4.译:一文科普 RocksDB 工作原理
5.Linux内核源码分析:Linux内核版本号和源码目录结构
Unity - Addressables项目总结(一):基础工作流
近期未更新,现已投入新项目,源码初期采用Addressables进行资源管理。源码需对资源从打包、源码发布、源码运行时进行完善,源码文字css源码期间遇到不少问题,源码也有不少难以理解的源码使用方式,现记录如下。源码
一、源码综述 & Start
1.1 综述
Unity默认的源码资源打包发布方式是AssetBundle,Addressables在AssetBundle基础上,源码处理了资源在项目整个流程中的源码管理。具体涉及资源打包、源码加载与卸载以及热更。源码传统的AssetBundle对于资源管理来说相对繁琐,主要体现在以下几个方面:
对于成熟的项目,通常已有一套完善的工具链,可能对于部分打包步骤不太直观方便,但整体流程较为完善,一般也不用考虑Addressables。如果是在项目前期,Addressables可能是一个不错的工具,其功能特性如下:
1.2 Start
(1)安装
(2)拉取Package到本地
在Package Manager中拉取的内容是无法修改的,若需要修改源码,则需要将Cache文件夹中的缓存放到Package(包括依赖package)
(3)标记资源:将资源或文件夹放入对应Group即可
(4)配置Profile
只需要配置远端路径(Http服务可使用Addressables自带的Host Services,但建议使用HFS方便测试)
(5)发布资源
Addressbales提供了两种资源发布模式:全量发布;增量发布
(6)选择Play Mode & Start
fastest模式通过AssetDatabase加载资源,Editor下不需要发布资源。Existing Build会真实得加载AB包,Editor下需要打包资源。
二、Settings
2.1 AssetGroup
Addressbales以GUI的方式较为便捷得对资源进行分组打包管理。默认每个分组的资源文件存在于AddressableAssetsData/AssetGroups目录下,分组可以使用相同策略对资源批量管理。
选中Group可以看到其属性面板。Build & Load Paths定义Group的打包与加载路径,该路径可在Profile中修改。包体分为本地包与远程包。
Group提供三种压缩方式:无压缩、源码查看方式LZ4、LZMA。LZ4包体大小中等,解压较快,可以只解压部分资源;LZMA包体较小,但解压资源较慢,只能将资源全部解压。通常选择LZ4。
这三个选项表示打包时,是否将资源的Address、GUID、Label写入包体中。对于有分包更新需求的情况下,建议都勾选上。
Internal Asset Naming Mode:如何为内部asset命名
Asset Load Mode、Asset Provider、Asset Bundle Provider通常不用修改,这三个选项用于控制asset的加载方式、AB包的获取方式。如果存在自定义的处理方式,可自行选择。
2.2 AddressableAssetSettings
Profile定义了各种路径参数,切换不同的路径以灵活映射到的路径。(修改路径后需要重新Build资源后才能生效,因为locator的下载路径是在Build时序列化到本地的。体验上不太舒服~~)
Addressables提供了三种Editor下资源加载方式:Use the Asset database(Asset database加载)、Simulate groups(模拟Group处理)、Use existing build(加载实际包体资源)
三、打包处理
3.1 打全量包
处理步骤如下: (1)根据需求配置Group的构建路径(Remote\Local) (2)根据远端路径(CDN\HFS)修改Profile,选择需要的Profile (3)修改资源版本号(如果只是本地测试不需要,但若是正式发布需要修改,避免影响老版本) (4)点击New Build/Default Build Script进行资源打包 Profile定义Build和Load路径,若需要从多个项目加载资源的情况(比如美术、Scene单独分离出工程进行制作),可以定义不同的Profile以满足需求。对于大部分工程来说,通常不需要修改local资源相管路径,这些工程会构建到相同的txt游戏源码目录中。 注意:路径字符(以及自动生成的子目录)长度限制在个character,否则会构建失败 默认的local build路径:Library\com.unity.addressables\aa\平台\系统 默认的local load路径:Editor模式与构建路径相同;实机运行时被解析为StreamingAssets目录 Build输出文件:
注意:使用默认的local路径,在构建应用时,Addressbales会将打包资源拷贝到StreamingAssets目录,在应用构建结束后再将资源移除。如果使用自定义的local路径,需要自己处理这一过程。 默认的Remote Build路径:ServerData\平台 默认的Remote Load路径:为实际的下载url,必须要启用相管服务(CDN\HFS)后自行定义。 构建的文件:
3.2 打增量包
全量包会重新构建所有资源,当我们只需要对一部分资源修改时,这会产生很多不必要的工作。Addressbales提供了根据资源更新记录进行增量式更新
需要注意的是,能够进行增量式更新的前提是存在addressables_content_state.bin文件,并且不能修改资源版本号。此文件记录了资源的状态数据。当我们构建全量包时,会在“Assets\AddressableAssetsData\平台”创建该文件,一定不要手动修改此文件。只有相同版本号的catalog才会检测差异,从而更新。
四、运行时的资源
4.1 资源加载
Addressables提供了通过address、label、AssetReference以及IResourceLocation进行资源加载。在执行异步操作时,会执行以下流程:
若加载失败,相关信息会存储在AsyncOperationHandle.OperationException。默认情况下,加载失败不会抛出异常,如果需要可以为ResourceManager.ExceptionHandler设置回调。此外还可以通过设置抛出异常。
4.2 资源卸载
通过 Addressables.Release可以卸载资源、实例、handle。释放handle可以减少资源的引用计数,并且handle会失效。如果不需要使用回调结果,gogs源码分析某些API接口提供了自动的handle回收参数,例如 UnloadSceneAsync。 即便handle回调失败了,仍然需要对其进行释放。通常情况下,Addressables会自动释放Operation失败期间的资源,但手动释放handle仍然是有必要的。 Addressables.LoadAssetsAsync是无法取消的,但如果在操作完成之前释放对应的handle,会减少对handle引用,在资源加载完成后会自动释放。
飞凌嵌入式i.MX 8M Plus开发板的OTA远程升级方案
传统Linux系统更换镜像的手段相对单一,但RAUC工具为Linux引入了Android式的OTA升级功能。本文以飞凌嵌入式i.MX 8M Plus的OKMX8MP-C开发板为实例,展示如何基于Linux 5.4.内核通过RAUC实现系统更新。 升级前,系统启动时会读取boot.0和rootfs.0分区。切换至OTA模式,uboot引导系统将从boot.1和rootfs.1启动。实现Linux-OTA的关键步骤如下:环境准备
下载Ubuntu .虚拟机镜像,链接地址:mirrors.tuna.tsinghua.edu.cn...
升级虚拟机GCC至7.0版本:修改apt源,安装GCC-7和G++-7,然后将原有GCC和G++备份并指向新版本。
安装RAUC工具:通过apt进行安装。
源码配置与环境配置
-
配置eMMC分区:修改Init.sh脚本。
解压RAUC及相关依赖工具:包括liblz4、fw_setenv、unsquashfs和yocto-rauc-1.5.1。
修改配置文件:fw_env.config、system.conf,以及编译脚本和挂载配置文件,确保兼容性和分区正确。
生成升级包
-
全编译镜像,获取所需文件。
复制镜像和密钥文件,创建并编辑manifest.raucm配置文件。
编写打包脚本run.do_bundle.sh,生成bundle.raucb升级包。最新要饭源码
系统升级与管理
-
将升级包传到开发板,检查系统状态并进行升级。
升级后确认uboot引导分区,切换至新系统,然后同步并重启。
如果需要回退,重新配置uboot引导分区。
通过以上步骤,飞凌嵌入式OKMX8MP-C开发板成功实现了RAUC支持的OTA升级,升级过程涉及的分区管理和RAUC工具的使用是关键。希望这个教程能为开发者提供实践指导。转载Celadon快速上路指南Part2:编译Celadon镜像
上一期我们向您介绍了如何安装Celadon预编译镜像(Celadon快速上路指南 Part1:安装Celadon镜像),本期我们将向您介绍如何建立Celadon的开发环境,编译制作您自己的Celadon镜像。
一、开发环境
虽然Android通常是用GNU/Linux或Mac OS操作系统构建的,但我们建议:如果要使用其他操作系统,请参考Android开源项目(AOSP)网站的构建环境部分:source.android.com/setu...
二、搭建开发环境
Celadon源码中有直接引用google代码仓库的部分,也有托管到github上的部分,每一个项目都是一个Git仓库,每个Git仓库都有很多分支版本,为了方便统一管理各个项目的Git仓库,需要一个上层工具批量进行处理。这里就不得不提强大的repo工具了,repo是一种代码版本管理工具,repo init也会建立一个Git仓库,用来记录整个代码中的各个项目分别处于哪一个分支,这个仓库通常叫做manifest仓库。
1. 创建本地bin/目录,将repo工具下载到该目录,并使用以下命令给repo添加可执行权限:mkdir -p ~/bin curl storage.googleapis.com/... > ~/bin/repo chmod a+x ~/bin/repo
2. 此外,您需要在您的Ubuntu . LTS Bit开发工作站上安装以下软件包:sudo apt-get update sudo apt-get install \ openjdk-8-jdk git ccache automake \ lzop bison gperf build-essential \ zip tcl zlib1g-dev g++-multilib \ python-networkx libxml2-utils \ bzip2 libbz2-dev libbz2-1.0 \ libghc-bzlib-dev squashfs-tools \ pngcrush schedtool dpkg-dev \ liblz4-tool make optipng maven \ libssl-dev bc bsdmainutils \ gettext python-mako libelf-dev \ sbsigntool dosfstools mtools \ efitools git-lfs python-pystache \ git-core gnupg flex curl \ libc6-dev-i libncurses5-dev \ xproto-core-dev libx-dev \ libz-dev libgl1-mesa-dev \ libxml2-utils xsltproc unzip
三、下载源码
1. 创建一个空目录,用于保存Celadon的源文件,并用作工作目录。
2. URL指定Manifest,该Manifest里包含了Celadon所使用的各种git仓库。
3. 下载源代码到当前工作目录。
4. 如果您在中国大陆地区无法直接链接github,可以改为连接中国大陆地区的服务器,以连接清华服务器为例,您可以在~/.gitconfig中添加如下两行:[url " aosp.tuna.tsinghua.edu.cn..."] insteadOf = " android.googlesource.com..." 也可以export repo的URL地址 export REPO_URL=' mirrors.tuna.tsinghua.edu.cn...'
四、编译系统镜像
1.(可选)在Celadon的最顶层目录运行以下命令,用于删除之前产生的编译文件make clobber
2. 应用envsetup.sh脚本初始化编译的环境变量,source build/envsetup.sh
3. lunch target 示例 (也可以在lunch 的时候可以不带参数,手动选择target的编号) lunch celadon_ivi-userdebug
4. 编译生成Celadon安装程序文件,编译成功后,在out/的子目录下会有一个.zip格式的压缩安装包。
五、安装系统镜像
安装镜像方法请参考 Celadon快速上路指南 Part1:安装Celadon镜像
六、尾声
我们用了两篇文章向您介绍了如何下载、编译Celadon源码,和安装Celadon镜像的方法,您现在已经可以在您的NUC上使用Celadon了,但是搭载英特尔CPU的电脑还有很多,如何在更多的英特尔的平台上使用Celadon,这是Celadon团队目前正在着重解决的问题,我们的解决方案就是CaaS(Celadon As A Service)。之后我们会有系列文章来从各个角度来全面解析CaaS,希望它可以成为您的助力助您成功。敬请持续关注AndroidIA Celadon公众号信息,更多精彩还在路上。您还可以选择加入“Celadon技术讨论群”,跟更多的Celadon技术人员直接交流。在该微信群建立的1小时之内人数就已经超过了人,无法直接扫码入群了。请扫码关注公众号留言“微信群”按照里面提示的方法来入群,或者您可以找到身边已经在群的小伙伴儿拉您入群。
译:一文科普 RocksDB 工作原理
RocksDB 是一种可持久化的、内嵌型的键值存储(KV 存储)。它旨在存储大量 key 及其对应的 value,常被用于构建倒排索引、文档数据库、SQL 数据库、缓存系统和消息代理等复杂系统。RocksDB 在 年从 Google 的 LevelDB 分叉而来,针对 SSD 服务器进行了优化,并目前由 Meta 开发和维护。它以 C++ 编写,支持 C、C++ 及其他语言(如 Rust、Go、Java)的嵌入。如果你熟悉 SQLite,可以认为 RocksDB 是一种内嵌式数据库,需依赖应用层实现特定功能。
RocksDB 使用日志结构合并树(LSM-Tree)作为核心数据结构,这是一种基于多个有序层级的树形数据结构,可用于应对写密集型工作负载。LSM-Tree 的顶层是 MemTable,一个内存缓冲区,用于缓存最近的写入数据。较低层级的数据存储在磁盘上,以 L0 层为例,存储从内存移动到磁盘的数据,其他层级存储更旧的数据。当某一层级的数据量过大时,会通过合并操作转移到下一层。
为了保证数据持久化,RocksDB 将所有更新写入磁盘上的预写日志(WAL)。当应用重启时,可以通过回放 WAL 来恢复 MemTable 的原始状态。WAL 是一个只允许追加的文件,包含一组更改记录序列,每个记录包含键值对、操作类型和校验和。
当 MemTable 变满时,会触发刷盘(Flush)操作,将不可变的 MemTable 内容持久化到磁盘,并丢弃原始 MemTable,同时开始写入新的 WAL 和 MemTable。MemTable 默认基于跳表实现,以提高查询和插入效率。RocksDB 支持各种压缩算法,如 Zlib、BZ2、Snappy、LZ4 或 ZSTD,用于存储 SST 文件。
SST 文件是 MemTable 刷盘后生成的,包含了有序的键值对。每个 SST 文件由数据部分和索引块组成,数据部分包含一系列有序的键值对,而索引块存储了数据块中最后一个键的偏移量,便于快速定位键值对。RocksDB 还支持布隆过滤器,用于快速检测某个键是否存在于 SST 文件中。
当数据库大小增加时,空间放大(存储数据所用实际空间与逻辑大小的比值)和读放大(用户执行一次逻辑读操作所需实际 IO 次数)的问题变得明显。为了解决这些问题,RocksDB 实现了 Compaction 机制,通过合并 SST 文件来降低空间和读放大,同时增加写放大。Leveled Compaction 是默认策略,它会在不同层级之间进行选择性合并,以优化空间使用。
RocksDB 的读路径相对简单,主要涉及从 MemTable 开始,下探到 L0 层,然后继续向更低层级查找,直到找到目标键或检查完整个树。合并(merge)操作允许用户在内存中对键值进行聚合操作,适用于需要对已有值进行少量更新的场景。然而,这种操作增加了读时的复杂性,因为读操作需要在多次调用 merge 函数后才能得到最终结果。
使用 RocksDB 需要针对特定工作负载进行配置调优,因为它提供了许多可配置项,但理解其内部原理并调整这些配置通常需要深入研究源代码。RocksDB 是构建高性能数据库模块的优秀选择,能够帮助开发者专注于上层业务逻辑实现,而无需从零开始设计底层存储系统。
Linux内核源码分析:Linux内核版本号和源码目录结构
深入探索Linux内核世界:版本号与源码结构剖析
Linux内核以其卓越的稳定性和灵活性著称,版本号的精心设计彰显其功能定位。Linux采用xxx.yyy.zzz的格式,其中yy代表驱动和bug修复,zz则是修订次数的递增。主版本号(xx)与次版本号(yy)共同描绘了核心功能的大致轮廓,而修订版(zz)则确保了系统的稳定性与可靠性。
Linux源码的结构犹如一座精密的城堡,由多个功能强大的模块构成。首先,arch目录下包含针对不同体系结构的代码,比如RISC-V和x的虚拟地址翻译,是内核与硬件之间的重要桥梁。接着,block与drivers的区别在于,前者封装了通用的块设备操作,如读写,而后者则根据特定硬件设备分布在各自的子目录中,如GPIO设备在drivers/gpio。
为了保证组件来源的可信度和系统安全,certs目录存放认证和签名相关的代码,预先装载了必要的证书。从Linux 2.2版本开始,内核引入动态加载模块机制,fs和net目录下的代码分别支持虚拟文件系统和网络协议,这大大提升了灵活性,但同时也对组件验证提出了更高要求,以防止恶意代码的入侵。
内核的安全性得到了进一步加强,crypto目录包含了各种加密算法,如AES和DES,它们为硬件驱动提供了性能优化。同时,内核还采用了压缩算法,如LZO和LZ4,以减小映像大小,提升启动速度和内存利用效率。
文档是理解内核运作的关键,《strong>Documentation目录详尽地记录了模块的功能和规范。此外,include存储内核头文件,init负责初始化过程,IPC负责进程间通信,kernel核心代码涵盖了进程和中断管理,lib提供了通用库函数,而mm则专注于内存管理。网络功能则在net目录下,支持IPv4和TCP/IPv6等协议。
内核的实用工具和示例代码在scripts和samples目录下,而security则关注安全机制,sound负责音频驱动,tools则存放开发和调试工具,如perf和kconfig。用户内核源码在usr目录,虚拟化支持在virt,而LICENSE目录保证了源码的开放和透明。
最后,Makefile是编译内核的关键,README文件则包含了版本信息、硬件支持、安装配置指南,以及已知问题、限制和BUG修复等重要细节。这份详尽的指南是新用户快速入门Linux内核的绝佳起点。
通过深入研究这些目录,开发者和爱好者可以更全面地理解Linux内核的运作机制,从而更好地开发、维护和优化这个强大的操作系统。[原文链接已移除,以保护版权]