最近在調(diào)研網(wǎng)絡(luò)通信框架,libp2p跟gRPC罢屈。公司之前用的是libp2p, 但是這個(gè)框架是針對(duì)p2p 網(wǎng)絡(luò)的,最近才從IPFS分離出來的子項(xiàng)目牍帚,比較新儡遮,功能還在完善中,并且功能比較全暗赶。公司項(xiàng)目并沒有用到這么多的功能鄙币,并且擔(dān)心后續(xù)維護(hù)起來成本會(huì)比較高,所以就想找替代方案蹂随。
gRPC目前看來是一個(gè)比較流行的通信框架十嘿。這幾天分析了服務(wù)注冊(cè)、通信岳锁、交互等流程(后續(xù)會(huì)有相關(guān)的文章)绩衷。因?yàn)楹罄m(xù)需要支持移動(dòng)端的開發(fā),從gRPC的文檔來看激率,已經(jīng)能夠支持Android(Java 跟 kotlin)咳燕、IOS(Objective-C跟 swift) 。紙上得來終覺淺乒躺,所以今天就在Android上實(shí)驗(yàn)了一把招盲。
自己之前沒有寫過安卓,相當(dāng)于從零開始嘉冒,搭建環(huán)境曹货、配置簡(jiǎn)單的demo、支持gRPC讳推、利用gRPC跟golang服務(wù)端交互顶籽。中間也遇到了幾個(gè)小問題,這兒也會(huì)簡(jiǎn)單提一下银觅。本文更多的是記錄當(dāng)時(shí)參考的文章礼饱,以及遇到的問題。
1 安裝開發(fā)環(huán)境-Android Studio
由于我的電腦是Mac環(huán)境究驴,所以后續(xù)的安裝慨仿,包括編碼都是在Mac上執(zhí)行操作。
下載
網(wǎng)上去找Andoid Studio的下載路徑纳胧。下載即可。
https://developer.android.com/studio?gclid=CjwKCAiA5JnuBRA-EiwA-0ggPYl7MqcMn_VwfZ7TY5fID_qbEcdGwTBz0iPIO-8AxGssoPnD5TV7CRoCxA0QAvD_BwE
SDK安裝
下載之后帘撰,需要進(jìn)行一些SDK的安裝跑慕。打開AS, 會(huì)遇到一個(gè)問題:
unable to access android sdk add-on list
網(wǎng)上找了些教程,有下面這樣的答案,可以短暫跳過這個(gè)問題核行,但是這解決不了根本問題牢硅。先看下怎么跳過
解決: 在 Android Studio 安裝目錄 bin/idea.properties 文件最后追加一句 disable.android.first.run=true
但是這兒并不能解決本質(zhì)問題, 我自己加了個(gè)代理芝雪,這個(gè)問題是因?yàn)閲?guó)內(nèi)網(wǎng)絡(luò)“墻”的原因减余。
具體加代理的方法: http://www.reibang.com/p/6ba60be77855
代理OK了,就進(jìn)行SDK的下載了惩系。
2 配置Java環(huán)境
忽略位岔,網(wǎng)上一堆教程。
3 搭建第一個(gè)Android項(xiàng)目
這兒主要參考了
https://developer.android.com/training/basics/firstapp/creating-project?hl=zh-cn
在執(zhí)行之前堡牡,在Tool中一直找不到AVD抒抬。這是因?yàn)槲覜]有安裝的緣故。去下載就好晤柄,有些大擦剑,得等一會(huì)。
AVD下載OK芥颈,就可以正常運(yùn)行了惠勒。
4 golang 服務(wù)端程序
這個(gè)部分是我之前自己搭建的,如果需要爬坑,可以參看網(wǎng)上其他人寫的文章:
https://www.gitdig.com/go-mobile-research-01/
服務(wù)啟動(dòng)纠屋,等待調(diào)用即可。
5 Android支持gRPC
這一步主要是參考的 https://www.gitdig.com/go-mobile-research-02/妇垢。
在啟動(dòng)之后巾遭,連接golang server,一直報(bào)錯(cuò):
java.net.SocketException: socket failed: EPERM (Operation not permitted)
開始網(wǎng)上有人說是因?yàn)?安卓網(wǎng)絡(luò)權(quán)限沒有開闯估,下面通過如下兩個(gè)方法打開灼舍,但是其實(shí)打開之后還是沒用:
/Users/xxx/AndroidStudioProjects/HelloAndroidJava/app/src/main/AndroidManifest.xml 中加入如下兩個(gè)配置:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
然后還有人提到說是因?yàn)槭褂昧薃ndroid模擬器,如果本地連接涨薪,不能使用127.0.0.1骑素,得使用網(wǎng)絡(luò)實(shí)際的地址,于是又改了下刚夺,還是不行献丑。這是因?yàn)榘沧课沂鞘褂玫哪M器,模擬器自己使用的是127.0.0.1侠姑,其他的服務(wù)得使用本地的實(shí)際地址创橄。這個(gè)確實(shí)起作用,不過我的問題不只是出在這兒莽红。先看下這兒在建立clientStub時(shí)怎么寫妥畏。(自己不懂Android在這兒體現(xiàn)的淋漓盡致)邦邦。參考: https://stackoverflow.com/questions/53083653/grpc-android-client-exception-io-grpc-statusruntimeexception-unavailable
// gRPC 交互
final GreeterGrpc.GreeterStub greeterStub = GreeterGrpc.newStub(newChannel("192.168.1.9", 50051));
// final GreeterGrpc.GreeterStub greeterStub = GreeterGrpc.newStub(newChannel("127.0.0.1", 50051));
改完之后,還是不行醉蚁,
繼續(xù)搜集燃辖,網(wǎng)上有人說可能是AVD版本問題,于是自己嘗試更換了AVD.原來使用的是Nexus 4API 29
网棍。后面更換為Nexus 6 API 29
才可以黔龟。
6 總結(jié)
本文主要是記錄了自己調(diào)研g(shù)RPC在安卓上是否支持時(shí)搭建過程的記錄以及遇到問題的總結(jié)。從安裝環(huán)境滥玷、部署氏身、排查問題前前后后一天一晚的時(shí)間,對(duì)于安卓開發(fā)的同學(xué)來說罗捎,可能分分鐘就可以搞定观谦。這充分說明一個(gè)問題,術(shù)業(yè)有專攻桨菜。不過只要我們肯研究豁状,肯堅(jiān)持,還是可以搞定的倒得。
安卓項(xiàng)目代碼:
https://github.com/zhanglvmeng/HelloAndroidJava.git
golang服務(wù)端代碼:
https://github.com/zhanglvmeng/grpcServerDemo.git
7 其他
如果有疑問泻红,可以直接留言,也可以關(guān)注公眾號(hào) “鏈人成長(zhǎng)chainerup” 提問留言霞掺,或者加入知識(shí)星球“鏈人成長(zhǎng)”谊路,期待與您共同成長(zhǎng)~