V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
TonyLiu2ca
V2EX  ›  Apple

浅析 WPS for Mac(版本 WPS_For_Mac_Alpha_1.2.3(321))的安装过程,有疑惑的看看它安装过程都干了什么

  •  
  •   TonyLiu2ca · 2018-07-12 12:34:31 +08:00 · 4012 次点击
    这是一个创建于 2319 天前的主题,其中的信息可能已经有所发展或是发生改变。

    普通的安装过程无非是复制文件和适当配置,无他。下面直奔主题:

    分发包

    WPS_For_Mac_Alpha_1.2.3(321).pkg 是以分发包的格式封装的,利用 macOS 自带的安装器(Installer)进行安装。除了 Installer 提供的基本步骤外,没有使用其它复杂技术进行特殊的定制。 主要需要说明的是下面两个部分:

    • 在分发包的描述文件中,定义了三个程序 ID/版本等:
    <bundle CFBundleShortVersionString="1.2.3" CFBundleVersion="321" id="cn.wps.presentation" path="wpp.app"/>
       <bundle CFBundleShortVersionString="1.2.3" CFBundleVersion="321" id="cn.wps.spreadsheets" path="et.app"/>
       <bundle CFBundleShortVersionString="1.2.3" CFBundleVersion="321" id="cn.wps.writer" path="wps.app"/>
    
    • 它们被封装在里面的 wpsoffice.pkg 的组件包中 而且定义该组件包不可见(用户无法选择是否安装)且必装。
    <choice id="cn.wps.writer" visible="false">
      <pkg-ref id="cn.wps.writer">
        <must-close>
          <app id="cn.wps.writer"/>
          <app id="cn.wps.presentation"/>
          <app id="cn.wps.spreadsheets"/>
        </must-close>
      </pkg-ref>
    </choice>
    

    组件包

    真正的程序文件都在组件包(wpsoffice.pkg)中,负载很简单只有三个程序:et.app, wpp.app 和 wps.app 装前脚本很简单,就是杀掉了 wpscloudsvr 进程。而最关键的要说是装后脚本了,这个也是重点,几乎所有的 pkg 包都会在装后脚本中做文章,WPS 也不例外。

    这里只挑关键的行分析。

    • 第四行:定义了全局的 kingsoft_path="$target_volume/Library/Application Support/Kingsoft" 目前可以猜测,它要在你的机器的"/Library/Application Support"目录中使用一个 Kingsoft 的子目录 /文件。

    • 接下来他定义了一个 focus_remove_folder() 函数,从名字就知道它干什么用的。

    • 第二个函数:decompress_office6():它利用 wps.app 中自带的一个 7za 命令来将储存在 wps.app 中 Frameworks 中的 office6.7z 压缩文件解压到该 Frameworks 中,然后删除了 7za 和 office6.7z. 这个看上去没有任何问题。

    • 第三个函数:redirect_app_office6():传入参数 app 的绝对路径。将传入的 app 中的多个软连接: Frameworks/office6,Resources/office6,PlugIns,的软连接重新定义到前面定义的全局 "$kingsoft_path" 中的 office6。 并使用循环遍历该 app 中 SharedSupport 目录中的所有的 app,递归调用 redirect_app_office6() 函数。

    • 第四个函数:redirect_office6():就是将 et.app, wpp.app 和 wps.app 作为参数一次调用 redirect_app_office6()函数

    • 接下来就是脚本的主体部分, 解压 office6, 创建 "$kingsoft_path" 目录,并将 wps.app 中的 office6 和 Plugins 目录移动到 "$kingsoft_path" 目录中。再讲 office6 重新连接到 Plugins 中。

    • 后来是一个循环:

    for lang in `ls "Library/Application Support/Kingsoft/WPS Cloud Files/userdata"`
    do
      for filename in `ls "Library/Application Support/Kingsoft/WPS Cloud Files/userdata/${lang}"`
      do
         if [ ${filename} != "config.ini" ]; then
            focus_remove_folder "Library/Application Support/Kingsoft/WPS Cloud Files/userdata/${lang}/${filename}"
    		fi
    	done
    done
    
    • 这里有一个 bug(两处),不太严重。大家可以看出,这个路径错了,在装后脚本目录中怎么会有 "Library/Application Support/Kingsoft..." 目录呢,即使有,对它操作也没用,毕竟安装完了 Installer 负责删除安装所有临时数据。看他的意思应该是安装目标卷的 Library 目录,所以应该加上 ”$target_volume/“。 这是个小失误,是个没用功,美中不足。

    • 脚本的最后它还创建了一个 "Library/Application Support/wps_newly_install" 文件,内容也是 wps_newly_install。应该是每个 app 初次运行时会寻找这个文件,并做初始化。

    小结

    至此完全解读了它的安装过程。其实它的主要的过程和目的就是为了节省安装包和 app 的空间,将共享程序和数据都存放在了系统的 "/Library/Application Support/Kingsoft ” 目录中,这个就如同网上流行的给 M$ Office for Mac 瘦身的思路是一样的。

    不过,就现在的网络速度和存储,没有必要这样做,直接放在每个 app 中就好,做成 DMG 格式的拖拽分发也是不错的选择,可以打消好多人的疑虑不是。至于如何分辨是否第一次运行,有很多其它方法不是。

    还可以看出,它的第一个发布版本很可能不会使用沙盒技术。从诸多方面来看,它离上线 App Store 还有一段路要走,也说不定他们不想上吧。

    卸载

    从上面的分析可以看出,如果只是安装还没有运行,那么完全删除它很简单, 就一行命令:

    rm -fr /Applications/et.app /Applications/wpp.app /Applications/wps.app "/Library/Application Support/Kingsoft"
    

    如果有洁癖的最多加一句:

    pkgutil --forget "cn.wps.writer"
    
    第 1 条附言  ·  2018-07-12 13:52:42 +08:00

    仔细看了一下,分析装后脚本的最后一行的

    "Library/Application Support/wps_newly_install" 
    

    不是我的抄录问题,原脚本就是这么写的,于是,这又是一个与上面犯相同错误的bug,至于这个bug是否致命,就要看wps.app等程序是如何判断初次安装的吧。

    22 条回复    2018-07-13 23:37:37 +08:00
    ftu
        1
    ftu  
       2018-07-12 13:17:31 +08:00
    总结:这玩意儿目前 没有坑,探测完毕
    stanjia
        2
    stanjia  
       2018-07-12 13:23:32 +08:00
    Mac 上安软件不是拖动到目录里就可以了吗?
    TonyLiu2ca
        3
    TonyLiu2ca  
    OP
       2018-07-12 13:40:30 +08:00
    @stanjia

    不总是
    TonyLiu2ca
        4
    TonyLiu2ca  
    OP
       2018-07-12 13:42:45 +08:00
    改不了了,最后删除应该是:
    sudo rm -fr ....
    chengxiao
        5
    chengxiao  
       2018-07-12 14:36:54 +08:00
    想想挺悲哀的 本来 wps 出个 mac 版是好事
    然后大家先是本着对他的好恶批判一番
    然后又怕他流氓 再审一遍代码....
    这公司之前是做了多少恶?
    nutting
        6
    nutting  
       2018-07-12 14:41:25 +08:00
    求问可以强行更改版本需求么,我是 10.11 用不了
    Bardon
        7
    Bardon  
       2018-07-12 14:42:39 +08:00
    忽然有个疑问,为什么你们都用 rm -fr,而我用 rm -rf
    yclissetj
        8
    yclissetj  
       2018-07-12 15:03:58 +08:00 via iPad
    @Bardon 其实我见的更多的是你这种 😂
    wtks1
        9
    wtks1  
       2018-07-12 16:11:51 +08:00 via Android
    @Bardon 见到的 rf 比较多
    Aruforce
        10
    Aruforce  
       2018-07-12 16:48:22 +08:00
    @chengxiao 你用过 windows 版 就知道 wps 有多流氓了。。。尤其是什么 qing 什么乱七八糟。。。
    liuzelei
        11
    liuzelei  
       2018-07-12 17:05:16 +08:00
    focus_remove_folder 是什么鬼? force_remove_folder?
    x86
        12
    x86  
       2018-07-12 17:06:28 +08:00
    @Aruforce 早期还好,后面改的都什么妖魔鬼怪,完全不想用了
    wd
        13
    wd  
       2018-07-12 17:26:21 +08:00 via iPhone
    wpscloudsrv 是什么?
    TonyLiu2ca
        14
    TonyLiu2ca  
    OP
       2018-07-12 23:59:57 +08:00
    @nutting
    如果说只是安装的话,可以改。至于能否运行就不知道了,需要测试先。
    TonyLiu2ca
        15
    TonyLiu2ca  
    OP
       2018-07-13 00:02:10 +08:00
    @Bardon
    这两个谁在前谁在后,fr 说的是:必须全部; rf:全部, 必须的。听上去,rf 是东北口音,fr 是领导口吻。;)
    TonyLiu2ca
        16
    TonyLiu2ca  
    OP
       2018-07-13 00:04:06 +08:00
    @liuzelei
    难道说它原文 copy 时被改了?回家再看看
    TonyLiu2ca
        17
    TonyLiu2ca  
    OP
       2018-07-13 00:04:41 +08:00
    @wd
    这个有待查证
    TonyLiu2ca
        18
    TonyLiu2ca  
    OP
       2018-07-13 00:43:01 +08:00
    @chengxiao
    这不是前几天有个帖子吗,说怎怎么的,还有人一看是 pkg 的要求管理员身份安装就弃锅了。
    那就先从安装 pkg 开始看看呗,让大家放心安装。

    当然运行后也会生成各种 plist/缓存等等用户客户化的东西,要想搞清楚还需要进一步分析
    Uni9k
        19
    Uni9k  
       2018-07-13 08:46:05 +08:00
    @chengxiao 金山在 Windows 上,简直......
    TonyLiu2ca
        20
    TonyLiu2ca  
    OP
       2018-07-13 12:20:14 +08:00
    @liuzelei
    focus 不是我粘贴的问题,是原作者的创作
    xratzh
        21
    xratzh  
       2018-07-13 14:24:22 +08:00 via Android
    我用的国际版加上中文包
    chenjau
        22
    chenjau  
       2018-07-13 23:37:37 +08:00 via Android
    就算今天不流氓,明天也要流氓。也没必要用,这公司这产品,劣迹斑斑,还信它那脑子有问题。wps 是刚需吗?有商业的 msoffice,有免费原生的 iwork,有开源的 libre,为什么就非得投这种坑?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2861 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 08:35 · PVG 16:35 · LAX 00:35 · JFK 03:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.