• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2023-09-17 16:34 Aet 隐藏边栏 |   抢沙发  19 
文章评分 3 次,平均分 5.0

Windows

安装

  1. 为了确定安装目标,在安装前后调用了get_reg_items

  1. get_reg_items

  1. 上买的Windows实现是通过枚举注册表
    1. 把几个目标路径的注册表存到一起
    2. 然后根据安装前后这些路径下的注册表的项数,来找出新增的那个

  1. 通过比较,确定新增项,然后记录下新安装软件的卸载位置,为了安装后的卸载
    1. 下面的set_db_record就是把下载的软件的编号和对应的卸载路径存起来

卸载

  1. 根据编号去获取存储的软件卸载路径

  1. 设置路径参数

  1. 根据这个路径开始卸载

Linux

安装

  1. linux同样也是在安装前后,把一些文件做了保存,然后根据这些文件来确定,具体安装的是哪一个软件
    1. 这里选择保存的是linux下软件的list文件

  1. 具体安装的方法暂时linuxapple都使用了system调命令的方法

  1. 不同之处在于,单步过程中发现个别软件表现不一致,比如一些软件卸载完成后就删掉了list文件,而有一些则是清空list文件但不删除
    1. 这会导致部分软件在第二次安装的时候,比list数量时,发现是一样的
    2. 所以,暂时想了个策略,就是在安装前记录下一个时间戳,用以对比,如下:

  1. 当安装完后,发现成功了,当发现list数量安装后比安装前多,就获取目标软件的路径
    1. 可以看到,这里是用上了上面记录的时间戳,进程函数后,又创建了一个时间戳,并计算出了一个时间间隔
    2. 然后获取每个文件的最后修改时间,和后面的时间戳作间隔处理,并和上面的对比
    3. 如果后面的间隔小于等于前面两个时间戳的间隔,则认为这个文件是目标软件安装过程中被修改过的
    4. 所以把它保存起来,并且,这里我的做法是,找了一个这样的路径后,就不再查找了
    5. 这样的做法,从理论上来看,是做不到完全的准确的

  1. 还有一种情况,就是上面说的list数量一样的情况,同样也做了类似处理
    1. 根据时间间隔来处理,考虑到这样的文件可能会有多个,所以在实现时,只使用了res[0]
    2. 并对路径进行了保存

卸载

  1. linux的卸载,同样还是调用了system命令

  1. 关于上面代码中的路径,使用了list文件的名字来拼接了卸载命令

macOS

安装

  1. macos下面的安装,和上面讲的linux也有类似之处
    1. 同样是通过文件数量来定位安装的是哪个文件,不过macos用的bom文件

  1. 安装

  1. 至于路径的确定,macos这里使用了不一样的方法
    1. 可以看到调用了一个get_goal_second_path
    2. 具体就是,定位到这个bom文件,用apple的工具lsbom去输出它的内容,并把内容重定位到一个临时文件里面
    3. 然后再冲文件里面去逐行读取
    4. 把第一个找到.app字样的行进行处理,从中拿出一个路径,类似/Applications/xx.app

  1. 同样的,上面的bom的文件数量也有一样的时候,因为这个bom文件是apple操作系统写的,所以,软件卸载的时候不会去删掉它
    1. 也就是,第二次安装的时候,这个软件对应的bom文件其实已经存在的
    2. 所以,还是需要和上面linux一样的方法来确定到底是哪个bom文件
    3. 不同的是,apple这里的实现,我当时写死了,就是判断30秒以内的

  1. 然后存储的时候,就是把软件的队友编号,和上面解析出来的那个/Applications/xx.app这个路径对照起来,然后存起来

卸载

  1. 卸载的话,首先从数据库里面获取了软件编号对应的应用路径,如/Applications/xx.app
  2. 然后,为了达到阻塞的效果,使用了oc的方法,如下:
    1. 具体的效果,就是用这个路径,拼了一个苹果脚本
    2. 这个脚本的效果,就是把这个路径对应的应用放到废纸篓(涉及权限)
    3. 为了阻塞的去执行这个任务,用oc的方法创建了一个进程

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享