导航:首页 > 源码编译 > somd5源码

somd5源码

发布时间:2025-03-12 06:03:30

① 简述入侵检测常用的四种方法

入侵检测系统所采用的技术可分为特征检测与异常检测两种。

1、特征检测

特征检测(Signature-based detection) 又称Misuse detection ,这一检测假设入侵者活动可以用一种模式来表示,系统的目标是检测主体活动是否符合这些模式。

它可以将已有的入侵方法检查出来,但对新的入侵方法无能为力。其难点在于如何设计模式既能够表达“入侵”现象又不会将正常的活动包含进来。

2、异常检测

异常检测(Anomaly detection) 的假设是入侵者活动异常于正常主体的活动。根据这一理念建立主体正常活动的“活动简档”,将当前主体的活动状况与“活动简档”相比较,当违反其统计规律时,认为该活动可能是“入侵”行为。

异常检测的难题在于如何建立“活动简档”以及如何设计统计算法,从而不把正常的操作作为“入侵”或忽略真正的“入侵”行为。

(1)somd5源码扩展阅读

入侵分类:

1、基于主机

一般主要使用操作系统的审计、跟踪日志作为数据源,某些也会主动与主机系统进行交互以获得不存在于系统日志中的信息以检测入侵。

这种类型的检测系统不需要额外的硬件.对网络流量不敏感,效率高,能准确定位入侵并及时进行反应,但是占用主机资源,依赖于主机的可靠性,所能检测的攻击类型受限。不能检测网络攻击。

2、基于网络

通过被动地监听网络上传输的原始流量,对获取的网络数据进行处理,从中提取有用的信息,再通过与已知攻击特征相匹配或与正常网络行为原型相比较来识别攻击事件。

此类检测系统不依赖操作系统作为检测资源,可应用于不同的操作系统平台;配置简单,不需要任何特殊的审计和登录机制;可检测协议攻击、特定环境的攻击等多种攻击。

但它只能监视经过本网段的活动,无法得到主机系统的实时状态,精确度较差。大部分入侵检测工具都是基于网络的入侵检测系统。

3、分布式

这种入侵检测系统一般为分布式结构,由多个部件组成,在关键主机上采用主机入侵检测,在网络关键节点上采用网络入侵检测,同时分析来自主机系统的审计日志和来自网络的数据流,判断被保护系统是否受到攻击。

linux下安装Apache+ASP环境的原因

为什么要在Linux下安装ASP环境?且看这几个原因够不够:

A.
作为Linux下的开发环境

B.
当IIS中的ASP仅用于后台,同时使用人数较少.前台页面主要以HTML静态页面展示,ASP用来做的事情较少,本身对系统的负担很轻
综合以上,当ASP显得有点鸡肋时,相应的应用完全可以移植到Linux下,以充分发挥Linux下系统平台优势和资源优势。
因为ASP本为Windows下IIS的原生产物,移植到Linux下确实有些怪异,所以实现方案也比较少,目前能找到的基本以Perl转义为主。
在Linux下安装ASP环境必须的环境支持为:
Apache+Apache的perl模块+perl的Apache::ASP包,请看安装步骤:
1.安装Apache::ASP(也可在第3步之后安装)
perl
-MCPAN
-e
shell

install
CPAN

install
MLDBM

install
MLDBM::Sync

install
Apache::ASP
如果通过perl安装失败,可以去下载这几个源代码包:
Digest-MD5-2.20.tar.gz
MLDBM-2.01.tar.gz
MLDBM-Sync-0.30.tar.gz
Apache-ASP-2.37.tar.gz
按顺序展开源代码,各自执行以下操作安装:
perl
Makefile.PL
make
make
test
make
install
2.安装Apache,
在Linux环境下模拟ASP环境目前仅能查到Apache+ASP的方案
#下载
tar
zxf
httpd-2.2.15.tar.gz
cd
httpd-2.2.15
./configure
--prefix=/usr/local/apache
make
make
install
cd
..
3.安装apache的mod_perl模块
#下载apache的perl模块
wget
tar
zxf
mod_perl-2.0-current.tar.gz
cd
mod_perl-2.0.4/
perl
Makefile.PLUSE_APXS=1
WITH_APXS=/usr/local/apache/bin/apxs
EVERYTHING=1
make
make
install
cd
..
4.httpd.conf配置:
因为ASP环境不是我们在Linux下要用的主用环境,主用环境是Nginx,所以将Apache监听端口修改为80端口之外的端口,我修改为81
Listen
81
网站根目录也需修改成Nginx网站根目录,例如我的Nginx网站根目录为:/var/webhosts/htdocs/www,那么需要修改如下2个位置:
DocumentRoot
"/var/webhosts/htdocs/www"
在httpd.conf文件末尾追加如下内容:
LoadMole
perl_mole
moles/mod_perl.so
PerlMole
Apache::ASP
SetHandler
perl-script
PerlHandler
Apache::ASP
PerlSetVar
Global
.
PerlSetVar
StateDir
/tmp/asp
ok,ASP环境安装完成,启动Apache试试:)
/usr/local/apache/bin/apachectl
start
在网站根目录下创建test.asp,内容如下:
For
loop
incrementing
font
size:
<%
for(1..7)
{
%>
Size
=
<%=$_%>
<%
}
%>

③ hash文件怎么打开

hash如何打开文件?
(hash文件在哪里打开)
很多朋友下载了一个文件打不开,或者打开后根本不是这样。有些朋友甚至下载了一个官方系统,但安装了一堆病毒,这通常是由于下载的文件货物错误造成的。由于网络问题,CDN由于缓存甚至钓鱼网站等原因,默认情况下很难判断下载的文件是否会错误。要解决这个问题,对文件进行Hash哈希校验是一种非常有效的做法,但是Windows这个功能选项似乎没有默认。怎么办?今天就享几招!
命令
其实说Windows默认没有Hash文件的功能不准确,Windows其实系统是有的Hash文件功能,但不直接提供给用户,可以通过命令行执行Hash命令。
首先,我们需要查询文件的具体路径,这很简单,可以通过点击文件呼出右键菜单来查看属性。
接着,运行PowerShell,输入以下命令。
Get-FileHash -Algorithm | Format-List
其中,填写文件的位置,填写你想操作的Hash类型。Windows默认支持SHA1、SHA256、SHA384、SHA512、MACTripleDES、MD5、RIPEMD不支持160算法CRC-32、CRC-64。
例如,有一份文件叫做1.jpgC盘的根目录存在,想用MD验证算法时,应输入以下命令。
Get-FileHash C:\\1.jpg -Algorithm md5| Format-List
之后,PowerShell中就会给出Hash值了。
7-Zip
命令行虽然有用,但毕竟麻烦,有没有更简单的方法?实际上可以着用7-Zip压缩软件。
7-Zip:https://www.7-zip.org/
7-Zip我相信很多人都听说过这个名字。它是世界上最流行的开源压缩软件之一,具有巨大的影响力。许多压缩软件,特别是国内压缩软件,使用了7个-Zip的源代码。但鲜为人知的是,其实7-Zip除了帮助您压缩和解压文件外,它还提供了非常方便和快速的文件Hash文件功能。
打开7-Zip点击工具进入选项的主界面,可以看到多个选项卡。切换到“7-Zip”,勾选“添加7-Zip到右键菜单,检查以下CRC SHA选项,然后用右键单击文件,可以看到7-Zip提供的Hash功能了。
7-Zip支持CRC-32、CRC-64、SHA256、SHA1以及BLAKE2sp等Hash算法很好地弥补了Windows自带Hash算法不足。可惜的是7-Zip没有提供非常常见的MD5,如果需要MD5的Hash,还得另寻他法。
OpenHashTab
7-Zip虽然不错,但其本职始终是压缩软件。若需要更专业的解决方案,OpenHashTab也许是更完美的选择。
OpenHashTab:https://github.com/namazso/OpenHashTab
OpenHashTab是一款开源的、专注于提供Hash小软件验证功能。它体积小,支持中文,没有使用门槛。
OpenHashTab使用简单,下载后可直接安装。之后,只要打开文件属性,就可以看到哈希信息的标签,上面列出了各种哈希值。
OpenHashTab功能专业全面。在支持算法方面,OpenHashTab支持以下Hash算法。
CRC32, CRC64 (xz)
xxHash (XXH32, XXH64)
xxHash3 (64 and 128 bit variants)
MD4, MD5
RipeMD160
Blake2sp
SHA-1
SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512)
SHA-3 (SHA3-224, SHA3-256, SHA3-384, SHA3-512)
BLAKE3 (256 bit, 512 bit)
KangarooTwelve (264 bit, 256 bit, 512 bit)
ParallelHash128 (264 bit) and ParallelHash256 (528 bit)
Streebog (GOST R 34.11-12) (256 bit, 512 bit)
另外,OpenHashTab还支持文件夹,也可以选择多个文件一起计算Hash,双击计算Hash复制值很方便。
一般来说,如果你经常有计算文件Hash的需求,OpenHashTab这将是一个很好的选择。
一般来说,如果你经常有计算文件Hash的需求,OpenHashTab这将是一个很好的选择。
总结担心下载的文件出错,使用Hash比较确实是一种有效的方法。目前Windows默认的Hash功能不方便,希望以上方法能对大家有所帮助!

④ AndroidKillerV131正式版AndroidKillerV131正式版功能简介

大家好,关于Android Killer V1.3.1 正式版,Android Killer V1.3.1 正式版功能简介这个很多人还不知道,现在让我们一起来看看吧!
Android Killer最新版是一款功能强大的安卓APK反汇编工具,软件集APK反编译、APK打包、APK签名,编码互转,ADB通信等特色功能于一身,支持logcat日志输出,能够大大简化安卓应用和游戏修改过程中各类繁琐工作。
【功能特点】
1、可视化、全自动的反编译、编译、签名;支持批量编译APK。
2、以树形目录管理反编译出的Apk源码文件,浏览、打开、编辑、都可以统一在软件中实现,不同项目间可以自由切换,方便快捷。
3、自动识别图像资源,并提供该类资源的快捷替换功能,方便修改这类图片资源。
4、内置代码编辑器,支持包含,但不限于.samli、.xml、.html等各类格式文件的语法高亮显示,根据 smali文件格式的自动匹配相应语法;同时支持使用系统编辑器来编辑代码文件。
5、内置基于文件内容的单行或多行代码关键字搜索、可显示无穷多个搜索结果以标签的形式分门别类;可指定搜索范围,整个项目或在指定的文件或文件夹中搜索、大小写,编码类型;从此无需再借助其他工具,即可轻松的完成搜索任务。
6、内嵌Unicode、UTF8、ANSI编码互转工具,方便硬编码文字的检索以及相关汉化类修改。
7、内置Log等调试工具,方便应用进程、logcat输出查看等进阶操作,监测修改apk的运行状况,以助于分析和查找错误
8、内置ADB功能,包括使用ADB向设备,或模拟器安装、卸载、运行修改后的apk,进行测试,并可管理所连接设备的存储文件,包括系统以及用户文件
9、所有操作步骤、结果都会显示在日志窗口,方便查看。
10、默认支持记事本、计算器等小工具,开放设置接口可根据需要自定义外部工具,满足个性化需求。
【更新内容】
增加中英文版本切换,相关提示信息没有英化,有其他语言需求者在 "AK\cfgs\lang\" 路径下手动处理
增加自动识别java的bin目录
修复搜索批量替换后编译出错的BUG
增加 APK 签名工具
增加 APK 签名多项自定义添加
增加 APK 编译完后是否自动签名选项
增加 Apktool 管理器,用于 apktool 版本切换(支持反编译时参数定义)、框架安装和卸载等功能
增加 APK 安装管理器工具,移除上一版本的简单APK推送安装功能
增加 MD5 查看器工具
增加方法声明中只查看本地方法的功能,用于快速过滤查看 smali 对 so 中的方法调用
增加文本搜索工具
增加图片资源预览子目录功能
增加识别最新版的娜迦壳
增加搜索后批量替换功能
增加批量删除工程项
增加日志信息多选复制功能
增加 Androidkiller lua 脚本功能
更新 dex2jar 为最新版本
调整 APK 签名方式,去除从设置中选择签名,只保留签名的添加及编辑功能,改为从编译按钮的下拉菜单中选择
调整一些内部逻辑
调整搜索清空、管理项置顶
调整 apktool 默认为 ShakeApktool 版本
修复搜索中文字符时高亮位置错误
修复工程信息相关BUG

⑤ 军哥求助 pureftpd FTP 连接数 无法更改

FTP不安全,万不得已情况下,才可使用。vsftp安全性相对较好可采用sftp代替FTPLinux另外常用的FTP:proftpvsftppureftp下面以VSFTP为例:安装方式一:源码包安装useradd -s /bin/false -d /var/ftp ftpvirtualcd ......makemake installcp vsftpd.conf /etc/usr/local/sbin/vsftpd & #启动安装方式二:rpm安装,推荐rpm -ivh vsftpd-2.0.1-5.i386.rpm或者 yum install vsftpd/etc/init.d/vsftpd start两种方式安装完成后,配置方法都一样,下面开始讲配置。首先讲主配置文件常见配置vi /etc/vsftpd/vsftpd.confanonymous_enable=NO #禁止匿名登录local_enable=NO #禁止本地用户登录 write_enable=YES #对本地用户的写权限local_umask=022 #本地用户文件生成掩码dirmessage_enable=YES #显示隐藏文件xferlog_enable=YES #启用上传和下载日志connect_from_port_20=YES #服务器将启用FTP数据端口的连接请求xferlog_std_format=YES #服务器将使用标准的ftpd xferlog日志格式pam_service_name=vsftpd #设置PAM认证服务的配置文件名称userlist_enable=YES #设置文件中指定的用户是否可以访问vsftpd服务器listen=YES #FTP服务器将处于独立启动模式 tcp_wrappers=YES #使用tcp_wrappers作为主机访问控制方式 chroot_local_user=YES #将FTP本地用户禁锢在宿主目录中 chroot_list_enable=YES #将用户禁锢在宿主目录中listen_address=192.168.0.2 #侦听地址pasv_enable=YES #是否允使用被动模式,默认是允许的。pasv_min_port=10000 #指定使用被动模式时打开端口的最小值pasv_max_port=10004 #指定使用被动模式时打开端口的最大值。max_clients=100 #设置FTP服务器所允许的最大客户端连接数,值为0时表示不限制 max_per_ip=5 #同一IP地址允许的最大客户端连接数,值为0时表示不限制,即线程 local_max_rate=500000 #设置本地用户的最大传输速率,单位为bytes/sec,值为0时表示不限制 anon_max_rate=200000 #设置匿名用户的最大传输速率,单位为bytes/sec,值为0表示不限制 use_localtime=YES #在vsftp之中的时间默认值是显式GMT时间,因此我们会发现上面的时间与我们时寄存取的时间差八小时。改了这一项就好了。listen_port=10021 改端口one_process_model=NO yes可增加性能,增加负载,便降低安全,建议NOnopriv_user=nobody 默认以nobody运行vsftp对外服务,建议使用stand alone方式启动,性能好。仅内部人员,建议用super daemon启动,修改如下:listen=NO……略vsftp默认使用GMT时间,建议修改如下:use_localtime=YES/etc/vsftpd.ftpusers #保存不允许进行FTP登录的本地用户帐号,提高系统的安全性/etc/vsftpd.user_list #禁止vsftpd.user_list中的用户userlist_enable=YESuserlist_deny=YES #仅允许vsftpd.user_list中的用户userlist_enable=YESuserlist_deny=NO 日志:vsftpd_log_file=/var/log/vsftpd.log下面开始讲vsftp四种“用户认证”的方式一、匿名用户 ftp anonymous/var/ftp 默认主目录在/etc/vsftpd/vsftpd.conf中:anonymous_enable=YESanon_upload_enable=YESanon_other_write_enable=YES #可删除chmod -R 777 /var/ftp/pub/修改/var/ftp/pub的SELinux权限执行以下命令,修改/var/ftp/pub这目录的类型:chcon -R -t ftpd_anon_rw_t /var/ftp/pub/anon_root=/var/www/html/ftp #改匿名用户的宿主目录二、本地用户默认支持,使用各自的宿主目录。不安全local_root=/opt #新增这一项,改成其他路径三、虚拟用户 PAM文件方式 推荐建立虚拟用户口令库文件# cat logins.txt mikepwabcdjohnpw1234生成vsftpd的认证文件db_load -T -t hash -f logins /etc/vsftpd/vsftpd_login.dbchmod 600 /etc/vsftpd/vsftpd_login.db 新创建虚拟用户所需的PAM配置文件cat /etc/pam.d/vsftpd.vuauth required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_loginaccount required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login 新创建虚拟用户的系统用户所要访问的目录并设置相应权限# useradd -s /bin/false -d /home/ftpsite ftpvirtual# chmod 700 /home/ftpsite#设置vsftpd.conf配置文件,支持虚拟用户guest_enable=YESguest_username=ftpvirtualpam_service_name=vsftpd.vu user_config_dir=/etc/vsftpd/vsftpd_user_conf #添加用户配置文件目录设置/etc/vsftpd/vsftpd_user_conf/mike (同名),这里没有的设置默认按vsftpd.conf的设置执行anon_world_readable_only=NO #可以浏览FTP目录和下载文件anon_upload_enable=YES #用户可以上传文件,等同于 write_enable=yes 允许上传anon_mkdir_write_enable=YES #具有建立和删除目录的权利 anon_other_write_enable=YES #具有文件改名和删除文件的权限 local_root=/data/userspace #设置虚拟用户登录后的主目录anon_max_rate=1024000 #以Bytes/s为单位,这里限8Mbit,范围大概在80%到120%之间四、虚拟用户 mysql认证方式 推荐1. mysql安装见mysql笔记2.1 openssl-0.9.8e 源程序预编译时在日志中可能出现md5.h "Present But Cannot Be Compiled的错误,卸载下面某些包可能解决问题。cyrus-sals-sql cyrus-sasl-ntlm cyrus-sasl-gssapi cyrus-sasl-devel openldap-devel然后移除系统可能自带的:mv /usr/bin/openssl /usr/bin/openssl.OFFmv /usr/include/openssl /usr/include/openssl.OFFln -s /usr/local/ssl/bin/openssl /usr/bin/opensslln -s /usr/local/ssl/include/openssl /usr/include/openssl配置库文件搜索路径#echo "/usr/local/ssl/lib" >> /etc/ld.so.conf#ldconfig -v2.2 或者安装openssl-0.9.8e的rpm包3. pam_mysql-0.7RC1.tar.gz#./configure --with-mysql=/usr/local/mysql --with-openssl=/usr/local/ssl如果mysql是rpm安装的,则不带--with-mysql参数,如果openssl是rpm安装的,参数为--with-opensslmake;make install注意pam_mysql.so路径,可能在/usr/lib/security/pam_mysql.so或/lib/security/pam_mysql.sovi /etc/pam.d/vsftp.mysql #新建,仅两行auth required /lib/security/pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftp table=users usercolumn=name passwdcolumn=passwd crypt=2account required /lib/security/pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftp table=users usercolumn=name passwdcolumn=passwd crypt=24.0 准备数据库、表和数据mysql> create database vsftp;mysql> grant select on vsftp.* to vsftpd@localhost identified by '123456';mysql> grant select on vsftp.* to [email protected] identified by '123456';mysql> use vsftp;mysql> create table users (-> id int AUTO_INCREMENT NOT NULL,-> name char(20) binary NOT NULL,-> passwd char(48) binary NOT NULL,-> primary key(id)-> );mysql> insert into users(name,passwd) values('hlc',password('hlc'));mysql> insert into users(name,passwd) values('holly',password('holly'));5.0 修改主配置文件vi /etc/vsftpd/vsftpd.confguest_enable=YESguest_username=vsftplisten=YESpam_service_name=vsftpd.mysql以上完成了vsftp的配置,下面是补充:dirmessage_enable=YES #设置欢迎语 在每个目录下建立.message,写入欢迎语即可。db_load支持包(前面三个即可):db4db4-develdb4-utilsdb4-javadb4-tclLinux建议关闭selinux或征对FTP不做任何安全setsebool -P -ftpd_disable_trans onsetsebool -P -allow_ftpd_full_access onservie vsftpd restart或者需要重启服务器底下列出FTP访问中所出现数字代码的含意。110 重新启动标记应答。 120 服务在多久时间内ready。 125 数据链路端口开启,准备传送。 150 文件状态正常,开启数据端口。 200 命令执行成功。 202 命令执行失败。 211 系统状态或是系统求助响应。 212 目录的状态。 213 文件的状态。 214 求助的讯息。 215 名称系统类型。 220 新的联机服务ready。 221 服务的控制端口关闭,可以注销。 225 数据链接开启,但无传输动作。 226 关闭数据端口,请求的文件操作成功。 227 进入passive mode。 230 用户登录。 250 请求的文件操作完成。 257 显示目前的路径名称。 331 用户名称正确,需要密码。 332 登入时需要帐户信息。 350 请求的操作需要进一部的命令。 421 无法提供服务,关闭控制连结。 425 无法开启数据链路。 426 关闭联机,终止传输。 450 请求的操作未执行。 451 命令终止:有本地的错误。 452 未执行命令:磁盘空间不足。 500 格式错误,无法识别命令。 501 参数语法错误。 502 命令执行失败。 503 命令顺序错误。 504 命令所接的参数不正确。 530 未登入。 532 储存文件需要账户登入。 550 未执行请求的操作。 551 请求的命令终止,类型未知。 552 请求的文件终止,储存位溢出。 553 未执行请求的的命令,名称不正确。

⑥ 存储性能优化 MMKV源码解析

好久没有更新常用的第三方库了。让我们来聊聊MMKV这个常用的第三方库。MMKV这个库是做什么的呢?他本质上的定位和sp有点相似,经常用于持久化小数据的键值对。其速度可以说是当前所有同类型中速度最快,性能最优的库。

它的最早的诞生,主要是因为在微信iOS端有一个重大的bug,一个特殊的文本可以导致微信的iOS端闪退,而且还出现了不止一次。为了统计这种闪退的字符出现频率以及过滤,但是由于出现的次数,发现原来的键值对存储组件NSUserDefaults根本达不到要求,会导致cell的滑动卡顿。

因此iOS端就开始创造一个高新性能的键值对存储组件。于此同时,Android端SharedPreferences也有如下几个缺点:

因此Android也开始复用iOS的MMKV,而后Android有了多进程的写入数据的需求,Android组又在这个基础上进行改进。

这里是官方的性能的比较图:

能看到mmkv比起我们开发常用的组件要快上数百倍。

那么本文将会从源码角度围绕MMKV的性能为什么会如此高,以及SharePrefences为什么可能出现ANR的原因。

请注意下文是以MMKV 1.1.1版本源码为例子分析。如果遇到什么问题欢迎来到本文 https://www.jianshu.com/p/c12290a9a3f7 互相讨论。

老规矩,先来看看MMKV怎么使用。mmkv其实和SharePrefences一样,有增删查改四种操作。

MMKV作为一个键值对存储组件,也对了存储对象的序列化方式进行了优化。常用的方式比如有json,Twitter的Serial。而MMKV使用的是Google开源的序列化方案:Protocol Buffers。

Protocol Buffers这个方案比起json来说就高级不少:

使用方式可以阅读下面这篇文章: https://www.jianshu.com/p/e8712962f0e9

下面进行比较几个对象序列化之间的要素比较

而MMKV就是看重了Protocol Buffers的时间开销小,选择Protocol Buffers进行对象缓存的核心。

使用前请初始化:

当然mmkv除了能够写入这些基本类型,只要SharePrefences支持的,它也一定能够支持。

同上,每一个key读取的数据类型就是decodexxx对应的类型名字。使用起来十分简单。

能够删除单个key对应的value,也能删除多个key分别对应的value。containsKey判断mmkv的磁盘缓存中是否存在对应的key。

mmkv和SharePrefences一样,还能根据模块和业务划分对应的缓存文件:

这里创建了一个id为a的实例在磁盘中,进行数据的缓存。

当需要多进程缓存的时候:

MMKV可以使用Ashmem的匿名内存进行更加快速的大对象传输:
进程1:

最重要的一点,mmkv把SharePrefences的缓存迁移到mmkv中,之后的使用就和SharePrefences一致。

这里就是把SharedPreferences的myData数据迁移到mmkv中。当然如果我们需要保持SharePreferences的用法不变需要自己进行自定义一个SharePreferences。

mmkv的用法极其简单,接下来我们关注他的原理。

首先来看看MMKV的初始化。

能看到实际上initialize分为如下几个步骤:

能看到其实就是做这个判断。由于此时设置的是libc++的打包方式。此时BuildConfig.FLAVOR就是StaticCpp,就不会加载c++_shared。当然,如果我们已经使用了c++_shared库,则没有必要打包进去,使用defaultPublishConfig "SharedCppRelease"会尝试的查找动态链接库_shared。这样就能少2M的大小。

请注意一个前提的知识,jni的初始化,在调用了 System.loadLibrary之后,会通过dlopen把so加载到内存后,调用dlsym,调用jni中的JNI_OnLoad方法。

实际上这里面做的事情十分简单:

能从这些native方法中看到了所有MMKV的存储方法,设置支持共享内存ashemem的存储,支持直接获取native malloc申请的内存

接下来就是MMKV正式的初始化方法了。

这个方法实际上调用的是pthread_once方法。它一般是在多线程环境中,根据内核的调度策略,选择一个线程初始化一次的方法。

其实这里面的算法很简单:

defaultMMKV此时调用的是getDefaultMMKV这个native方法,默认是单进程模式。从这里的设计都能猜到getDefaultMMKV会从native层实例化一个MMKV对象,并且让实例化好的Java层MMKV对象持有。之后Java层的方法和native层的方法一一映射就能实现一个直接操作native对象的Java对象。

我们再来看看MMKV的mmkvWithID。

感觉上和defaultMMKV有点相似,也是调用native层方法进行初始化,并且让java层MMKV对象持有native层。那么我们可否认为这两个实例化本质上在底层调用同一个方法,只是多了一个id设置呢?

可以看看MMKV.h文件:

这里就能看到上面的推测是正确的,只要是实例化,最后都是调用mmkvWithID进行实例化。默认的mmkv的id就是mmkv.default。Android端则会设置一个默认的page大小,假设4kb为例子。

所有的mmkvID以及对应的MMKV实例都会保存在之前实例化的g_instanceDic散列表中。其中mmkv每一个id对应一个文件的路径,其中路径是这么处理的:

如果发现对应路径下的mmkv在散列表中已经缓存了,则直接返回。否则就会把相对路径保存下来,传递给MMKV进行实例化,并保存在g_instanceDic散列表中。

我们来看看MMKV构造函数中几个关键的字段是怎么初始化。

mmkvID就是经过md5后对应缓存文件对应的路径。

能看到这里是根据当前的mode初始化id,如果不是ashmem匿名共享内存模式进行创建,则会和上面的处理类似。id就是经过md5后对应缓存文件对应的路径。

注意这里mode设置的是MMKV_ASHMEM,也就是ashmem匿名共享内存模式则是如下创建方法:

实际上就是在驱动目录下的一个内存文件地址。

接下来,在构造函数中使用了共享的文件锁进行保护后,调用loadFromFile进一步的初始化MMKV内部的数据。

我们大致的了解MMKV中每一个字段的负责的职责,但是具体如何进行工作下文都会解析。

在这里面我们遇到了看起来十分核心的类MemoryFile,它的名字有点像 Ashmem匿名共享内存 一文中描述过Java层的映射的匿名内存文件。

我们先来看看MemoryFile的初始化。

MemeoryFile分为两个模式进行初始化:

这里的处理很简单:

能看到此时将会调用mmap系统调用,通过设置标志位可读写,MAP_SHARED的模式进行打开。这样就file就在在内核中映射了一段4kb内存,以后访问文件可以不经过内核,直接访问file映射的这一段内存。

关于mmap系统调用的源码解析可以看这一篇 Binder驱动的初始化 映射原理 。

能看到在这个过程中实际上还是通过ftruncate进行扩容,接着调用zeroFillFile,先通过lseek把指针移动当前容量的最后,并把剩余的部分都填充空数据'\0'。最后映射指向的地址是有效的,会先解开后重新进行映射。

为什么要做最后这个步骤呢?如果阅读过我解析的mmap的源码一文,实际上就能明白,file使用MAP_SHARED的模式本质上是给file结构体绑定一段vma映射好的内存。ftruncate只是给file结构体进行了扩容,但是还没有对对应绑定虚拟内存进行扩容,因此需要解开一次映射后,重新mmap一次。

MMKV在如果使用Ashmem模式打开:

接下来loadFromFile 这个方法可以说是MMKV的核心方法,所有的读写,还是扩容都需要这个方法,从映射的文件内存,缓存到MMKV的内存中。

进入到这个方法后进行如下的处理:

在这里,遇到了一个比较有歧义的字段m_version ,从名字看起来有点像MMKV的版本号。其实它指代的是MMKV当前的状态,由一个枚举对象代表:

注意m_vector是一个长度16的char数组。其实很简单,就是把文件保存的m_vector获取16位拷贝到m_metaInfo的m_vector中。因为aes的加密必须以16的倍数才能正常运作。

初始化分为这6点,我们从最后三点开始聊聊MMKV的初始化的核心逻辑。我们还需要开始关注MMKV中内存存储的结构。

能看到首先从m_file获取映射的指针地址,往后读取4位数据。这4位数据就是actualSize 真实数据。但是如果是m_metaInfo的m_version 大于等于3,则获取m_metaInfo中保存的actualSize。

其校验的手段,是通过比较m_metaInfo保存的crcDigest和从m_file中读取的crcDigest进行比较,如果一致说明数据无误,则返回true,设置loadFromFile为true。

其实这里面只处理m_metaInfo的m_version的状态大于等于3的状态。我们回忆一下,在readActualSize方法中,把读取当前存储的数据长度,分为两个逻辑进行读取。如果大于等于3,则从m_metaInfo中获取。

crc校验失败,说明我们写入的时候发生异常。需要强制进行recover恢复数据。
首先要清除crc校验校验了什么东西:

MMKV做了如下处理,只处理状态等级在MMKVVersionActualSize情况。这个情况,在m_metaInfo记录上一次MMKV中的信息。因此可以通过m_metaInfo进行校验已经存储的数据长度,进而更新真实的已经记录数据的长度。

最后读取上一次MMKV还没有更新的备份数据长度和crc校验字段,通过writeActualSize记录在映射的内存中。

如果最后弥补的校验还是crc校验错误,最后会回调onMMKVCRCCheckFail这个方法。这个方法会反射Java层实现的异常处理策略

如果是OnErrorRecover,则设置loadFromFile和needFullWriteback都为true,尽可能的恢复数据。当然如果OnErrorDiscard,则会丢弃掉所有的数据。

阅读全文

与somd5源码相关的资料

热点内容
王者荣耀安卓区如何登录生活区 浏览:395
怎么用命令获得少年骇客小破表 浏览:873
qt可以下载源码直接使用吗 浏览:911
java程序员面试葵花宝典 浏览:977
文档如何解压两次 浏览:307
三菱plc编程软件转换中文 浏览:989
如何设置服务器端 浏览:924
单片机存储器访问 浏览:622
解压缩文件夹是什么 浏览:840
android水平垂直居中 浏览:740
java命令模式应用 浏览:5
如何更改软件源码 浏览:335
基岩服务器如何安装老版本 浏览:673
28335flashapi编程 浏览:556
星际战甲安卓版怎么上飞船 浏览:152
地基回弹在压缩 浏览:645
风险净额算法 浏览:493
程序员资料推荐 浏览:845
文件夹选项对话框中的查看是用来设置 浏览:939
文件夹名称导入excel代码 浏览:765