美文网首页
Wire——端到端加密IM通讯详解(环境搭建+项目运行)

Wire——端到端加密IM通讯详解(环境搭建+项目运行)

作者: 雷小坏 | 来源:发表于2018-12-19 16:50 被阅读0次

    背景简述

    刚接触wire-android项目是在18-03-18刚来目前公司上班时,公司的IM是基于wire二次开发的,那时候对接此项目的同事简单地给介绍了一下项目,讲解了依赖库运行的cmd。之后在大概半天的时间把本地环境弄好了,但是由于scala代码占了很大一部分,导致期初花了不少时间加班加点,终于搞出了个IMLib,供第三方使用,但是自己的产品依然是基于wire源码开发的。下面详细讲一下项目环境搭建和编译运行。

    Scala + SBT环境,基于homebrew

    安装方式

    安装完成后将bin目录导出:

    BIN_SBIN_HOME=/bin:/sbin:/usr/bin/:/usr/sbin/:/usr/local/bin
    PATH=$PATH:$BIN_SBIN_HOME
    export PATH
    

    本地终端信息如下:

    brew -v
    Homebrew 1.8.5
    Homebrew/homebrew-core (git revision e0b94; last commit 2018-12-12)
    Homebrew/homebrew-cask (git revision 3e10fe; last commit 2018-12-11)
    

    安装ScalaSBT,brew 命令如下:

    brew install scala
    brew install sbtbrew install sbt@1

    之后将 sbt 和 scala 的bin目录设置并导出环境变量

    for scala
    SCALA_HOME=/usr/local/Cellar/scala/2.12.6/bin
    PATH=$PATH:$SCALA_HOME
    for sbt
    SBT_HOME=/usr/local/Cellar/sbt/1.2.6/bin
    PATH=$PATH:$SBT_HOME
    export PATH
    

    下面贴出本地全部环境变量配置:

    for java
    JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_172.jdk/Contents/Home
    PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$JAVA_HOME
    CLASS_PATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
    PATH=$PATH:$CLASS_PATH
    for XCode 尽量别随便升级beta版本系统,10.13beta版没有CommandLineTool
    XCode=/Applications/Xcode.app/Contents/Developer/usr/bin
    PATH=$PATH:$Code
    for maven proxy
    NexusMavenJcenterProxy=/Library/Nexus-mavenProxy/nexus-3.14.0-04-mac/nexus-3.14.0-04/bin
    PATH=$PATH:$NexusMavenJcenterProxy
    for git
    GIT_HOME=/usr/bin/git
    PATH=$PATH:$GIT_HOME
    for android  ndk
    ANDROID_NDK_HOME=/Users/self/android-ndk-r10e/  
    PATH=$PATH:ANDROID_NDK_HOME
    for android sdk
    ANDROID_SDK_HOME=/Users/self/Library/AndroidStudioSdk
    PATH=$PATH:ANDROID_SDK_HOME
    for android sdk tool
    ANDROID_SDK_TOOL_HOME=$/Users/self/Library/androidStudioSdk/tools:/Users/self/Library/androidStudioSdk/platform-tools
    PATH=$PATH:ANDROID_SDK_TOOL_HOME
    for scala
    SCALA_HOME=/usr/local/Cellar/scala/2.12.6/bin
    PATH=$PATH:$SCALA_HOME
    for sbt
    SBT_HOME=/usr/local/Cellar/sbt/1.2.6/bin
    PATH=$PATH:$SBT_HOME
    for brew ...
    BIN_SBIN_HOME=/bin:/sbin:/usr/bin/:/usr/sbin/:/usr/local/bin
    PATH=$PATH:$BIN_SBIN_HOME
    FLUTTER_HOME=$PATH:/Users/self/Library/flutter-beta/flutter/bin
    PATH=$PATH:$FLUTTER_HOME
    export PATH
    

    编译运行

    环境搭建好之后,先下载最新的wire的跨平台的消息模型——generic-message-proto关于protobuf,上文讲到protobuf用的最有实际意义的地方是message,而wire也把它使用到极致。终端进入该目录下android目录,执行sbt publishM2,成功后本地会生成 .m2 文件夹,.m2 表示本地仓库地址。用jar工具打开.m2里面generic-message-proto-xxx.jar,里面即为Messages.java类:

    image.png

    下载最新的wire-engin,终端进入该路径,最好先翻个墙,然后执行 sbt publishM2 ,网络好的情况下估计半个多小时就可以下载完。。如果出现异常请R(etry),直到 success 为止。

    这时候本地会生成 .android/sbt 、.m2 和 .ivy2目录。.m2目录下存放当前的wire-engin项目生成的架包,.ivy2里面的东西比较多,一百多个库都存在这里。
    如果后续需要改相关代码,可用Intellij import 此项目开发,项目sbt结构依赖包如下:


    image.png

    没有sbt依赖包Intellij无法找到相关库,很多函数方法没法跳转,相当于记事本敲代码了,但是不影响编译打包成本地仓库!
    接下来下载最新的wire-android项目,as打开,同步完毕之后选中Build Variants ,选择 devDebug,选择右上角账号下方的Gradle,打开app->Tasks->build->assembleDebug双击(或在as终端输入./gradlew assembleDebug)没有异常就表明可以运行项目,又异常则可以定位到具体哪一行报错,因为Scala代码在运行的时候不会在logcat中输出错误日志,所以这个方式可以用来找问题所在。

    wire-enginwire-android 常见问题集锦:

    如果你下载的是早期的wire版本代码(16年底),需要留意 scala 配置

    AndroidStudio 3.0+相关,针对具有多个 productFlavors的项目

    AndroidStudio 3.0+相关,apply plugin: 'android-apt'

    app/build.gradle 2.14到4.1(或现在最新的4.6)输出文件自定义,gradle语法有差异

    android.applicationVariants.all { variant ->
        variant.outputs.all {
            def cal = java.util.Calendar.getInstance()
            def builtApkTime = new StringBuilder()
                    .append(cal.get(Calendar.YEAR)).append('.')
                    .append(cal.get(Calendar.MONTH) + 1).append('.')
                    .append(cal.get(Calendar.DAY_OF_MONTH)).append(' ')
                    .append(cal.get(Calendar.HOUR_OF_DAY)).append(':')
                    .append(cal.get(Calendar.MINUTE)).append(':')
                    .append(cal.get(Calendar.SECOND)).toString()
            outputFileName = "【XX】code=${android.defaultConfig.versionCode} name=${android.defaultConfig.versionName} builtApkTime=${builtApkTime}.apk"
        }
    }
    

    相关文章

      网友评论

          本文标题:Wire——端到端加密IM通讯详解(环境搭建+项目运行)

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