背景简述
刚接触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)
安装Scala 和 SBT,brew 命令如下:
brew install scala
brew install sbt
或 brew 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类:
下载最新的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-engin 和wire-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"
}
}
网友评论