Realm编译提速

作者: 咕咕鷄 | 来源:发表于2016-11-25 12:03 被阅读1069次

原创文章转载请注明出处

由于Realm跨平台的特性以及一些相对于SQLite性能上的提升,我在15年就开始尝试在项目中使用Realm替换SQLite。

到了16年以后,Realm进行了一些升级,通过源码编译的时候还会从网络下载realm-core和realm-sync两个包,由于众所周知的GFW影响,这两个包几乎无法下载,导致编译失败进而影响了整个工程的编译打包。

接下来的步骤你需要有一个梯子,我们要通过浏览器下载这两个包,让整个编译速度快起来,而且保证能完成编译。

1.配置Carthage去取一下realm-cocoa的源码,打开build.sh文件找到以下两个函数。

download_core() {
    echo "Downloading dependency: core ${REALM_CORE_VERSION}"
    TMP_DIR="$TMPDIR/core_bin"
    mkdir -p "${TMP_DIR}"
    CORE_TMP_TAR="${TMP_DIR}/core-${REALM_CORE_VERSION}.tar.xz.tmp"
    CORE_TAR="${TMP_DIR}/core-${REALM_CORE_VERSION}.tar.xz"
    if [ ! -f "${CORE_TAR}" ]; then
        local CORE_URL="https://static.realm.io/downloads/core/realm-core-${REALM_CORE_VERSION}.tar.xz"
        set +e # temporarily disable immediate exit
        local ERROR # sweeps the exit code unless declared separately
        ERROR=$(curl --fail --silent --show-error --location "$CORE_URL" --output "${CORE_TMP_TAR}" 2>&1 >/dev/null)
        if [[ $? -ne 0 ]]; then
            echo "Downloading core failed:\n${ERROR}"
            exit 1
        fi
        set -e # re-enable flag
        mv "${CORE_TMP_TAR}" "${CORE_TAR}"
    fi

    (
        cd "${TMP_DIR}"
        rm -rf core
        tar xf "${CORE_TAR}" --xz
        mv core core-${REALM_CORE_VERSION}
    )

    rm -rf core-${REALM_CORE_VERSION} core
    mv ${TMP_DIR}/core-${REALM_CORE_VERSION} .
    ln -s core-${REALM_CORE_VERSION} core
}

download_sync() {
    echo "Downloading dependency: sync ${REALM_SYNC_VERSION}"
    TMP_DIR="$TMPDIR/sync_bin"
    echo ${TMP_DIR}
    mkdir -p "${TMP_DIR}"
    SYNC_TMP_TAR="${TMP_DIR}/sync-${REALM_SYNC_VERSION}.tar.xz.tmp"
    echo ${SYNC_TMP_TAR}
    SYNC_TAR="${TMP_DIR}/sync-${REALM_SYNC_VERSION}.tar.xz"
    echo ${SYNC_TAR}
    if [ ! -f "${SYNC_TAR}" ]; then
        local SYNC_URL="https://static.realm.io/downloads/sync/realm-sync-cocoa-${REALM_SYNC_VERSION}.tar.xz"
        set +e # temporarily disable immediate exit
        local ERROR # sweeps the exit code unless declared separately
        ERROR=$(curl --fail --silent --show-error --location "$SYNC_URL" --output "${SYNC_TMP_TAR}" 2>&1 >/dev/null)
        if [[ $? -ne 0 ]]; then
            echo "Downloading sync failed:\n${ERROR}"
            exit 1
        fi
        set -e # re-enable flag
        mv "${SYNC_TMP_TAR}" "${SYNC_TAR}"
    fi

    (
        cd "${TMP_DIR}"
        rm -rf sync
        tar xf "${SYNC_TAR}" --xz
        mv core sync-${REALM_SYNC_VERSION}
    )

    rm -rf sync-${REALM_SYNC_VERSION} core
    mv ${TMP_DIR}/sync-${REALM_SYNC_VERSION} .
    ln -s sync-${REALM_SYNC_VERSION} core
}

大概看一下这两个函数就是去 https://static.realm.io 下载对应的依赖包,然后拷贝到TMP_DIR目录,解压,知道这个过程就简单了。

2.我们先在download_core()的代码中打印一下TMP_DIR、CORE_TMP_TAR、CORE_TAR、REALM_CORE_VERSION和REALM_SYNC_VERSION这几个变量,记住echo的代码要写在变量赋值语句后面。然后我们执行一下命令,看看结果。

./build.sh download-core

比如我这里打印出来的是

Downloading dependency: core 2.1.4
1.0.0-BETA-3.3
/var/folders/dz/cj9x9hg10t1927wqlgjfdlqm0000gn/T//core_bin
/var/folders/dz/cj9x9hg10t1927wqlgjfdlqm0000gn/T//core_bin/core-2.1.4.tar.xz.tmp
/var/folders/dz/cj9x9hg10t1927wqlgjfdlqm0000gn/T//core_bin/core-2.1.4.tar.xz

3.现在我们已经知道要下载的依赖包版本,从build.sh里面可以知道具体的下载链接分别是:

https://static.realm.io/downloads/core/realm-core-2.1.4.tar.xz
https://static.realm.io/downloads/sync/realm-sync-cocoa-1.0.0-BETA-3.3.tar.xz

打开浏览器,爬梯子去下载这两个包吧。这里有个特殊情况,我通过Chrome浏览器下载的压缩包,在执行tar xf xxx.tar.xz --xz的时候会报错:

core/librealm-watchos.a: Lzma library error: No progress is possible
tar: Error exit delayed from previous errors.

改成Safari浏览器下载的压缩包就能正常解压。

4.根据第二步打印的内容,将realm-core-2.1.4.tar.xz文件拷贝到/var/folders/dz/cj9x9hg10t1927wqlgjfdlqm0000gn/T/core_bin目录中,根据build.sh的代码要求修改文件名为core-2.1.4.tar.xz,将realm-sync-cocoa-1.0.0-BETA-3.3.tar.xz文件拷贝到/var/folders/dz/cj9x9hg10t1927wqlgjfdlqm0000gn/T/sync_bin目录中,根据build.sh的代码要求修改文件名为sync-1.0.0-BETA-3.3.tar.xz

现在你可以愉快的进行编译了,存在依赖包的时候就会直接解压压缩包,不会再去从网络下载。

因为CocoaPods经常出错,时不时的就会清空缓存文件,导致Realm的库重新打包,所以我采用Carthage将Realm打包成静态库导入工程中,这样其他同事就不需要再做上述重复性的工作了,记得备份那两个依赖库哦,也许哪天还需要重新编译静态库呢。

在React Native中使用Realm也一样,只是打包脚本是在node_modules中。Android我没有集成过,想来应该也是一样需要依赖包,依样画葫芦去解决吧。

我是咕咕鸡,一个还在不停学习的全栈工程师。
热爱生活,喜欢跑步,家庭是我不断向前进步的动力。

相关文章

  • Realm编译提速

    原创文章转载请注明出处 由于Realm跨平台的特性以及一些相对于SQLite性能上的提升,我在15年就开始尝试在项...

  • 解决ButterKnife与realm无法同时使用的问题

    问题描述: ButterKnife和realm同时使用时,在编译运行之后报空指针,只有realm的文件能编译好而B...

  • Android Error:Execution failed f

    在使用butterknife和realm进行开发时,realm无法正常编译,原来冲突的时候是butterknife...

  • swift 编译提速

    HEADERMAP_USES_VFS=YES;解决swift 每次编译都会全部编译一遍BuildSetting -...

  • vue3.0

    1、更快 Virtual DOM 完全重写,mounting & patching 提速 100% ; 更多编译时...

  • iOS编译加速-CCache

    CCache是一个编译工具,可以将xcode编译文件缓存起来,从而达到编译提速。 优点能大幅度地提升编译速度,起码...

  • Maven 高级玩法

    实用技巧 Maven 提速 多线程 跳过测试 编译失败后,接着编译 跳过失败的模块,编译到最后再报错 使用 Nex...

  • Android ABI想到的

    缘起 最近在项目中用到了realm,引起项目编译找不到so库,原来是realm的多版本so库所导致的。所以,解铃还...

  • android - realm无法编译问题

    导入realm数据库后出现 无法编译问题 错误: 找不到符号 符号: 类 DaggerUserComponent ...

  • QQ音乐Android端120万行代码,编译耗时是怎样优化的

    介绍QQ音乐团队在增量编译组件研发上的探索与实践。原文:QQ音乐Android编译提速之路[https://jue...

网友评论

本文标题:Realm编译提速

本文链接:https://www.haomeiwen.com/subject/hjiipttx.html