? 大家都知道,android的adb連接支持wifi調(diào)試,有個前提是需要android手機和電腦在同一個網(wǎng)絡中撕蔼。那么怎么做到在不同網(wǎng)段達到控制android手機的目的呢?
? 這里用到了一個熱門的內(nèi)網(wǎng)穿透工具ngrok,借助ngrok我們可以實現(xiàn)在不同網(wǎng)絡環(huán)境adb連接到手機吆视。
接下來手把手教大家怎么做。
1.搭建ngrok服務器
需要一臺公網(wǎng)服務器酥宴,假設你訪問公網(wǎng)服務器的的域名為ngrok.domain.com
同樣假設服務器上已經(jīng)安裝go的開發(fā)環(huán)境和git
如果沒有安裝:下面以centos為例:
yum install gcc -y
yum install git -y
yum install mercurial git bzr subversion golang golang-pkg-windows-amd64 golang-pkg-windows-386 -y
下載源碼:
git clone https://github.com/inconshreveable/ngrok.git
生成證書:
cd ngrok
mkdir cert
cd cert
export NGROK_DOMAIN="ngrok.domain.com"
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
openssl genrsa -out device.key 2048
openssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
#替換證書
cp rootCA.pem ../assets/client/tls/ngrokroot.crt
cp device.crt ../assets/server/tls/snakeoil.crt
cp device.key ../assets/server/tls/snakeoil.key
回到ngrok目錄啦吧,生成服務端與客戶端:
這里我們暫時先只需要生成linux服務端,后面再講述如何生成安卓的client端
<!--linux服務端-->
GOOS=linux GOARCH=386 make release-server (32位)
GOOS=linux GOARCH=amd64 make release-server(64位)
<!--Mac OS客戶端-->
GOOS=darwin GOARCH=386 make release-client
GOOS=darwin GOARCH=amd64 make release-client
<!--windows客戶端-->
GOOS=windows GOARCH=386 make release-client
GOOS=windows GOARCH=amd64 make release-client
啟動服務器:
#這里運行ngrok服務器為nohup模式拙寡,其中httpAddr參數(shù)指定映射域名http訪問的端口授滓,httpsAddr是https的訪問端口,tunnelAddr為客戶端連接的端口肆糕,這里筆者修改成其它端口是因為服務上相應的80般堆,443,和默認的4443端口被占用了
nohup ./bin/ngrokd -tlsKey="assets/server/tls/snakeoil.key" -tlsCrt="assets/server/tls/snakeoil.crt" -domain="$NGROK_DOMAIN" -httpAddr=":81" -httpsAddr=":444" -tunnelAddr=":4444" > server.log &
#檢查服務器運行狀態(tài)
tail -f server.log
2.生成ngrok的android client
這里我們用go的一條命令可以看到 支持的os和arch列表
$ go tool dist list
android/386
android/amd64
android/arm
android/arm64
....
windows/386
windows/amd64
我們可以看到支持編譯生成android的arm擎宝,是不是意味著我們可以直接用下面的命令生成呢郁妈?
GOOS="android" GOARCH="arm64" CGO_ENABLED="0" make release-client
答案是否定的。
系統(tǒng)自帶的gcc绍申、clang等編譯器都不支持Android平臺噩咪,我們需要安裝 Android NDK。
如果 Android NDK 網(wǎng)址打不開极阅,請掛上vpn胃碾,或百度搜索 Android NDK 下載
安裝配置方法參考了這個網(wǎng)址,編譯可在Android設備上運行的Go語言程序
假設下載解壓后的目錄為/opt/android-ndk
export ANDROID_NDK_ROOT=/opt/android-ndk
#按需安裝 Android 獨立工具鏈
#Android 獨立工具鏈安裝目錄統(tǒng)一為 $ANDROID_NDK_ROOT/bin
# android/arm
$ANDROID_NDK_ROOT/build/tools/make-standalone-toolchain.sh --platform=android-16 --install-dir=$ANDROID_NDK_ROOT/bin/arm-linux-androideabi/ --arch=arm
# android/arm64
$ANDROID_NDK_ROOT/build/tools/make-standalone-toolchain.sh --platform=android-21 --install-dir=$ANDROID_NDK_ROOT/bin/aarch64-linux-android/ --arch=arm64
# android/386
$ANDROID_NDK_ROOT/build/tools/make-standalone-toolchain.sh --platform=android-16 --install-dir=$ANDROID_NDK_ROOT/bin/i686-linux-android/ --arch=x86
# android/amd64
$ANDROID_NDK_ROOT/build/tools/make-standalone-toolchain.sh --platform=android-21 --install-dir=$ANDROID_NDK_ROOT/bin/x86_64-linux-android/ --arch=x86_64
#或者使用python安裝
# android/arm
$ANDROID_NDK_ROOT/build/tools/make_standalone_toolchain.py --api=16 --install-dir=$ANDROID_NDK_ROOT/bin/arm-linux-androideabi/ --arch=arm
# android/arm64
$ANDROID_NDK_ROOT/build/tools/make_standalone_toolchain.py --api=21 --install-dir=$ANDROID_NDK_ROOT/bin/aarch64-linux-android/ --arch=arm64
# android/386
$ANDROID_NDK_ROOT/build/tools/make_standalone_toolchain.py --api=16 --install-dir=$ANDROID_NDK_ROOT/bin/i686-linux-android/ --arch=x86
# android/amd64
$ANDROID_NDK_ROOT/build/tools/make_standalone_toolchain.py --api=21 --install-dir=$ANDROID_NDK_ROOT/bin/x86_64-linux-android/ --arch=x86_64
#安裝完成Android 獨立工具鏈筋搏,CC 編譯器的位置分別為
#android/arm
CC=$ANDROID_NDK_ROOT/bin/arm-linux-androideabi/bin/arm-linux-androideabi-gcc
#android/arm64
CC=$ANDROID_NDK_ROOT/bin/aarch64-linux-android/bin/aarch64-linux-android-gcc
#android/386
CC=$ANDROID_NDK_ROOT/bin/i686-linux-android/bin/i686-linux-android-gcc
#android/amd64
CC=$ANDROID_NDK_ROOT/bin/x86_64-linux-android/bin/x86_64-linux-android-gcc
#編譯Android的Go語言程序
#需要指定 CC 編譯器的位置
# android/arm
CC=$ANDROID_NDK_ROOT/bin/arm-linux-androideabi/bin/arm-linux-androideabi-gcc GOOS="android" GOARCH="arm" CGO_ENABLED="1" go build
# android/arm64
CC=$ANDROID_NDK_ROOT/bin/aarch64-linux-android/bin/aarch64-linux-android-gcc GOOS="android" GOARCH="arm64" CGO_ENABLED="1" go build
# android/386
CC=$ANDROID_NDK_ROOT/bin/i686-linux-android/bin/i686-linux-android-gcc GOOS="android" GOARCH="386" CGO_ENABLED="1" go build
# android/amd64
CC=$ANDROID_NDK_ROOT/bin/x86_64-linux-android/bin/x86_64-linux-android-gcc GOOS="android" GOARCH="amd64" CGO_ENABLED="1" go build
接下來生成ngrok的android的client端
這里筆者的手機是arm的仆百,不是arm64,這里因為搞錯了android的位數(shù)奔脐,結(jié)果導進去之后無法運行
#在ngrok目錄下執(zhí)行下面命令
CC=$ANDROID_NDK_ROOT/bin/arm-linux-androideabi/bin/arm-linux-androideabi-gcc GOOS="android" GOARCH="arm" CGO_ENABLED="1" make release-client
檢查生成的二進制文件
$ tree bin
bin
├── android_arm
│ └── ngrok
├── android_arm64
│ └── ngrok
├── darwin_amd64
│ └── ngrok
├── go-bindata
└── ngrokd
3.導入ngrok client端和配置到android 手機
這里需要兩個文件俄周,一個是ngrok的client的二進制文件吁讨,上面我們已經(jīng)生成出來了
還需要一個ngrok.cfg配置文件
下面是配置文件的樣例
#填寫服務器域名和連接端口
server_addr: ngrok.domain.com:4444
trust_host_root_certs: false
tunnels:
adb:
#這里的remote_port是指從ngrok.domain.com:5555->android手機的5555端口
remote_port: 5555
proto:
#使用tcp協(xié)議
tcp: 5555
我們把ngrok二進制文件和ngrok.cfg放在公網(wǎng)上,一個可以下載的地方
然后在手機端下載這兩個文件峦朗。
在手機端安裝termux這個終端模擬器軟件
把ngrok和ngrok.cfg文件拷貝到data/local/ngrok
為什么要拷貝到這個目錄呢建丧?因為下載的文件都是放在sdcard的,而sdcard是沒有執(zhí)行權(quán)限的波势,即便使用命令
chmod +x也是無效的翎朱。
我們使用chmod +x ngrok命令給二進制文件賦予執(zhí)行權(quán)限。
4.啟動adb-tcp連接端口
#手機端開啟adb tcp連接端口尺铣,使用termux
:/$setprop service.adb.tcp.port 5555
:/$stop adbd
:/$start adbd
5.啟動ngrok 客戶端
./ngrok -config ngrok.cfg start-all
運行成功拴曲,連接狀態(tài)為online
6.adb調(diào)試
adb kill-server
adb tcpip 5555
adb connect ngrok.domain.com:5555
adb shell