免費(fèi)網(wǎng)站qq抓取百度下載安裝最新版
背景
做這個主要為了發(fā)版之前提前發(fā)現(xiàn)崩潰,風(fēng)險前置。適合客戶端很重的業(yè)務(wù)。
優(yōu)點(diǎn):你不改動也能用, 維護(hù)成本不高。
缺點(diǎn):容易進(jìn)入H5頁面無法返回,效果有限。
備注:我這邊接手別人維護(hù),公司降本把測開工作給到我這邊了。
一.Fasbot本地搭建環(huán)境
1.定制化修改點(diǎn):
-
test目錄放了相關(guān)的各個包定向配置文件(具體查看 push定向配置部分)。需要針對不同的進(jìn)行定制,對應(yīng)包的配置值在運(yùn)行服務(wù)器上存放,沒有添加git代碼中
-
相關(guān)的jar需要人工手動的push到 手機(jī)的/sdcard 目錄中, test目錄下的相關(guān)配置文件java程序每次安裝新包的時候,會重新push到手機(jī)/sdcard 目錄中
-
fastbot的程序啟動是在java 程序中進(jìn)行啟動的。
fastbot源代碼地址如下:
https://github.com/bytedance/Fastbot_Android
https://github.com/bytedance/Fastbot_iOS
2.Android手機(jī)運(yùn)行
Push 程序 -手工push
將 framework.jar fastbot-thirdpart.jar monkeyq.jar
push 到 /sdcard (官方建議放到該路目下),push libs/*
to /data/local/tmp/
(實(shí)際操作控制都是通過這些 java 程序運(yùn)行)
java程序中有檢測,如果/sdcard 目錄中有對應(yīng)的*.jar 那么就跳過,如果沒有會去push對應(yīng)的*.jar到/sdcard 文件夾。
adb push *.jar /sdcard
adb push libs/* /data/local/tmp/
Push 定向配置
java 程序每次都會強(qiáng)制push Fastbot_Android/test目錄到對應(yīng)的手機(jī)中
?
2.1【有使用】添加限定詞,用來提升模型
Mac 本地需要安裝aapt的環(huán)境變量
? build-tools vim ~/.bash_profile
? build-tools source ~/.bash_profile
? build-tools aapt -v
APPT_HOME=/Users/Library/Android/sdk/build-tools/31.0.0
export APPT_HOME
export PATH=$PATH:$APPT_HOME
然后根據(jù)對應(yīng)的安裝包執(zhí)行命令,將生成的max.valid.strings 文件push到手機(jī)的/sdcard 中( 拉取的項目里有 max.valid.strings 文件,在test目錄下)
aapt dump --values strings [install_package_path.apk] > max.valid.strings
eg:
aapt dump --values strings "/Users/Downloads/Web_4.6.36(46361011).apk" > max.valid.strings adb push max.valid.strings /sdcard
注: 每個新包首次接入fastbot的時,都需要生成一次max.valid.strings文件、
2.2【暫未使用】白名單添加
-
在PC端新建
awl.strings
文件(名稱固定為:awl.strings)(拉取的項目里有 awl.strings 文件,在test目錄下),填寫完后即可,注意不是填寫白名單就只跑白名單頁面,因為測試會建立模型,模型完善后會盡可能對這幾個頁面進(jìn)行測試 -
在文件中寫入Activity的名稱,例如
com.app.live.activity.VideoListActivity com.app.letter.view.chat.LetterChatAct com.app.live.activity.UpLiveActivity com.app.live.boost.view.BoostListActivity
-
將
awl.strings
文件push到手機(jī)端的sdcard目錄下, 目錄必須為sdcard
adb push awl.strings /sdcard
-
運(yùn)行命令時添加以下參數(shù):
--act-whitelist-file /sdcard/awl.strings
adb -s 設(shè)備號 shell CLASSPATH=/sdcard/monkeyq.jar:/sdcard/framework.jar:/sdcard/fastbot-thirdpart.jar exec app_process /system/bin com.android.commands.monkey.Monkey -p 包名 --agent reuseq --act-whitelist-file /sdcard/awl.strings --running-minutes 遍歷時長 --throttle 事件頻率 -v -v
?
2.3【暫未使用】黑名單添加
-
在PC端新建
abl.strings
文件(名稱固定為:abl.strings)(拉取的項目里有 abl.strings 文件,在test目錄下) -
在文件中輸入Activity的名稱,同白名單方法一致
com.app.live.activity.VideoListActivity com.app.letter.view.chat.LetterChatAct
-
將
abl.strings
文件push到手機(jī)端的sdcard目錄下, 目錄必須為sdcard
adb push abl.strings /sdcard
-
運(yùn)行命令時添加以下參數(shù):
--act-blacklist-file /sdcard/abl.strings
adb -s 設(shè)備號 shell CLASSPATH=/sdcard/monkeyq.jar:/sdcard/framework.jar:/sdcard/fastbot-thirdpart.jar exec app_process /system/bin com.android.commands.monkey.Monkey -p 包名 --agent reuseq --act-blacklist-file /sdcard/abl.strings --running-minutes 遍歷時長 --throttle 事件頻率 -v -v
注意: 白名單和黑名單不能同時設(shè)置,按照非白即黑的原則,即設(shè)置了白名單則白名單外的都為黑名單。通過hook 可以監(jiān)控activity 啟動和切換,如果啟動的是黑名單中的activity,就拒絕啟動該activity,從ui上看就是點(diǎn)了跳轉(zhuǎn)沒效果
2.4【有使用】添加屏蔽控件
手動配置需要屏蔽的控件或區(qū)域
適用需求: 測試過程中“半路”中途退出登錄,屏蔽退出登錄按鈕
-
在PC端新建
max.widget.black
文件(名稱固定為:max.widget.black),文件內(nèi)容配置格式如下: -
匹配條件activity:當(dāng)activity與currentactivity一致時執(zhí)行如下匹配
-
屏蔽控件或區(qū)域共有三種方式:
-
配置bounds:屏蔽某個區(qū)域,在該區(qū)域內(nèi)的控件或坐標(biāo)不會被點(diǎn)擊,bounds 為 0.0~1.0 之間的一個百分比值。
-
配置xpath:查找匹配的控件,屏蔽點(diǎn)擊該控件。
-
配置xpath+bounds:查找匹配的控件,當(dāng)控件存在時屏蔽指定的區(qū)域,bounds 為 0.0~1.0 之間的一個百分比值。
-
-
將max.widget.black文件push到手機(jī)端的sdcard目錄下,目錄必須為sdcard。
-
adb push max.widget.black /sdcard
-
剪枝屏蔽
-
在PC端新建
max.tree.pruning
文件(名稱固定為:max.tree.pruning),文件內(nèi)容配置格式如下: -
匹配條件activity:當(dāng)activity與currentactivity一致時執(zhí)行如下匹配
-
剪枝方式:
-
配置xpath:查找匹配的控件,改變控件屬性,從而使控件屏蔽
-
-
將
max.tree.pruning
文件push到手機(jī)端的sdcard目錄下, /sdcard # 目錄必須為sdcard
-
????????????????adb push max.tree.pruning /sdcard
[{"activity":"com.app.live.activity.VideoListActivity","xpath":"//*[@resource-id='com.cmcm.live:id/setting_img']"},{"activity":"com.app.live.activity.SettingAct","xpath":"//*[@resource-id='com.cmcm.live:id/item_logout']"},{"activity":"com.app.live.activity.SettingAct","xpath":"//*[@resource-id='com.cmcm.live:id/item_update']"},{"activity":"com.app.live.activity.SettingAct","xpath":"//*[@resource-id='com.cmcm.live:id/item_clean_data']"},{"activity":"com.app.live.activity.SettingAct","xpath":"//*[@resource-id='com.cmcm.live:id/item_account_safety']"},{"activity":"com.app.live.activity.SettingAct","xpath":"//*[@resource-id='com.cmcm.live:id/layout_social_account']"},{"activity":"com.app.live.activity.SettingAct","xpath":"//*[@resource-id='com.cmcm.live:id/item_about']"}
]
2.5 【有使用】自定義輸入法(自動輸入+屏蔽輸入欄)
ADBKeyBoard在輸入欄自動輸入內(nèi)容,屏蔽UI輸入法
適用需求: 遇到搜索欄亂輸入,想要輸入指定字符
環(huán)境準(zhǔn)備: 下載 ADBKeyBoard,并在手機(jī)端中設(shè)置為默認(rèn)輸入法 ADBKeyBoard下載地址, 生效后,當(dāng)遇到輸入欄ADBKeyBoard不會彈起ui輸入欄,會顯示 ADB Keyboard{ON} tarbar
-
隨機(jī)輸入字符串:
-
配置
max.config
中max.randomPickFromStringList = false
-
在pc端新建
max.config
文件(文件名稱不可更改) -
輸入
max.randomPickFromStringList = false
-
通過以下命令將
max.config
文件push到手機(jī)端
-
-
adb push max.config /sdcard
????????
? ?2.從文件中隨機(jī)讀取字符串輸入????????
- 配置
max.config
中max.randomPickFromStringList = true
-
在pc端新建
max.strings
文件(文件名稱不可更改) -
輸入想要輸入的字符串,字符串結(jié)束要換行
-
通過以下命令將文件push到手機(jī)端
-
adb push max.strings /sdcard
?
?3.對文本控件輸入fuzzing 【new】? ?
-
將項目中 test 目錄中
max.fuzzing.strings
文件(max.fuzzing.strings文件存在即生效),參考:SecLists/Fuzzing/big-list-of-naughty-strings.txt at master · danielmiessler/SecLists · GitHubSecLists is the security tester's companion. It's a collection of multiple types of lists used during security assessments, collected in one place. List types include usernames, passwords, URLs, sensitive data patterns, fuzzing payloads, web shells, and many more. - SecLists/Fuzzing/big-list-of-naughty-strings.txt at master · danielmiessler/SecListshttps://github.com/danielmiessler/SecLists/blob/master/Fuzzing/big-list-of-naughty-strings.txt
-
文件中輸入想要輸入的字符串,字符串結(jié)束換行
-
通過以下命令將文件push到手機(jī)端
adb push test/max.fuzzing.strings /sdcard
-
fuzz概率如下:
1. 50% 概率輸入fuzzing.strings中某個string
2. 35% 概率輸入被測試 App 歷史頁面中text/desc文本內(nèi)容(不存在max.fuzzing.strings文件時概率提高到85%)
3. 15% 概率不輸入
Android機(jī)器運(yùn)行Fastbot
-s 設(shè)備號 多個設(shè)備需要指定設(shè)備號,單獨(dú)設(shè)備無需此-s參數(shù)
-p 包名 遍歷app的包名,-p+包名
--agent reuseq 遍歷模式,無需更改
--running-minutes 遍歷時長(分鐘) # 遍歷時間:--running-minutes 時間
--throttle 事件頻率 遍歷事件頻率,建議為500-800
可選參數(shù)
--bugreport
崩潰時保存bug report log
--output-directory /sdcard/xxx
log/crash 另存目錄
--act-whitelist-file /sdcard/qwl.strings
log/crash 另存目錄
拿 FA67LBN00915 設(shè)備舉例
adb -s FA67LBN00915 shell CLASSPATH=/sdcard/monkeyq.jar:/sdcard/framework.jar:/sdcard/fastbot-thirdpart.jar exec app_process /system/bin com.android.commands.monkey.Monkey -p com.cmcm.live --agent reuseq --act-whitelist-file /sdcard/awl.strings --running-minutes 5 --throttle 600 -v -v -v --output-directory /sdcard/picture-fastbot
?
意思就是運(yùn)行monkey 指定提供的jar,指定測試程序,指定白名單列表,運(yùn)行5分鐘,事件間隔為600毫秒 ,指定生成的路徑為手機(jī)上 /sdcard/picture-fastbot 最后統(tǒng)一將 /sdcard/picture-fastbot 文件夾 pull 到本地。
查看崩潰結(jié)果
Crash、ANR 捕獲
捕獲到Java Crash、ANR、Nativie Crash會以追加方式寫入/sdcard/crash-dump.log文件
捕獲的Anr 同時也會寫入 /sdcard/oom-traces.log
文件
模型文件會自動存儲在 /sdcard/fastbot_[包名].fbm
,下次進(jìn)行測試可以經(jīng)驗復(fù)用。
3.iOS手機(jī)運(yùn)行
環(huán)境設(shè)置和運(yùn)行測試
請按照中文操作手冊進(jìn)行配置,一步一步的配置, 圖上每一個設(shè)置tab都需要仔細(xì)看,就可以手工的通過Xcode執(zhí)行成功。
https://github.com/bytedance/Fastbot_iOS/blob/main/Doc/handbook-cn.md
通過命令手工執(zhí)行。 一定要手工運(yùn)行成功以后,才能用java程序來驅(qū)動
cd Fastbot_iOS-main/Fastbot-iOS #進(jìn)入到 和Fastbot-iOS.xcworkspace 同一個目錄下
BUNDLEID=com.xxxx.xxxx duration=3 throttle=600 xcodebuild test -workspace Fastbot-iOS.xcworkspace -scheme FastbotRunner -configuration Release -destination 'platform=iOS,id=00008101-00141D4102F1003A' -only-testing:FastbotRunner/FastbotRunner/testFastbot
二.Android-Java服務(wù)執(zhí)行
1.拉取代碼
Android 端: git checkout master
iOS 端: git checkout ios
2.添加測試手機(jī)到對應(yīng)的配置文件中
test-parent/test-runner/src/main/resources/json 存放著相關(guān)的手機(jī)配置信息
-
Android web包:android-live-device.json
"LGH990515b53b": {"uid": "1542786092096241665","brand": "lge","account": "test26@fluxer.tv","model": "LG-H990","system": "Android","version": "8.0.0","name": "elsa_global_com","sdk": "26"
}
注:
-
如果手機(jī)在對應(yīng)的文件中,那么就執(zhí)行對應(yīng)的手機(jī)對應(yīng)的程序
-
如果連接的手機(jī)不在配置的文件中,那么該手機(jī)不會跑fastbot
-
如果在json配置文件中的機(jī)器,未連接上,代碼會跳過,不會報錯
-
對應(yīng)手機(jī)需要提前安裝對應(yīng)的apk 和登錄對應(yīng)的liveme賬號
3.本地打包編譯
使用IntelliJ IDEA 編譯工具打開代碼
編譯以后的jar為 test-parent/test-runner/target/test-1.0.0.jar
4.本地啟動服務(wù)
同時系統(tǒng)也會開啟 8077 端口, linux 上輸入 netstat -a 可以查看到,Mac 上輸入 lsof -i tcp:8077 可以查看到 該端口是否開啟。
# 使用 pro配置文件,正式部署環(huán)境
java -jar test-portal/target/test-1.0.0.jar --spring.profiles.active=pro# 使用 dev配置文件,開發(fā)環(huán)境
java -jar test-portal/target/test-1.0.0.jar --spring.profiles.active=devjava -jar test-1.0.0.jar --spring.profiles.active=dev
如果本地調(diào)試,可以直接啟動。dev 環(huán)境啟動以后10s開始執(zhí)行,跑5min
三.Java服務(wù) test-parent 代碼詳解
簡要說明
-
iOS 單獨(dú)一臺機(jī)器運(yùn)行,如果只是自動化測試是可以在 linux 下運(yùn)行的,問題在于符號化的時候需要執(zhí)行本地的 CrashSymbolicator.py 腳本,該腳本又與 xcode 掛鉤,如果脫離了 mac 系統(tǒng),符號化失敗,所以需要一臺Mac筆記本進(jìn)行測試,如果條件允許,可以改成 Mac mini 進(jìn)行iOS 自動化測試。
-
設(shè)計模式與以前一樣,進(jìn)行 Android 自動化測試的時候,平臺會獲取 odin 的數(shù)據(jù)庫里獲取最新的 bloodeye___gp_rb 分支 主包(OuterRelease)包,iOS 會獲取最新的 release__ 的線下包。所以需要人為在 odin 平臺打這三個包。(Android 自動化測試時,有一臺 LG 手機(jī)聲音關(guān)不掉,這臺手機(jī)有問題,不清楚如何關(guān)掉,事后如果影響相關(guān)工作可以替換該手機(jī))
test-parent/test-portal/src/main/resources/config/application-pro.yml對應(yīng)的配置文件
test-parent/test-portal/src/main/resources/config/application-pro.yml
-
Fastbot 目錄
-
Android 客戶端代碼路徑
-
Tapd 相關(guān)賬號密鑰和 workspace-id
-
數(shù)據(jù)庫10.61.153.235
base:schedule:enable: true # 控制定時任務(wù),需要=true才會有定時任務(wù)project:home: "/home/root/fastbot/live-me-android" #Android 研發(fā)的代碼路徑test:android-home:plus-me: "/home/root/fastbot/android/com.plusme.live/Fastbot_Android" #plus-me Fastbot的路徑,因為每個test目錄里面的內(nèi)容是定制的ios-home:live-me: "/home/root/fastbot/ios/com.cmcm.live/Fastbot_iOS" #iOS Fastbot的路徑,workspace-id:plus-me: "22586881" # TAPD 直播 項目idlive-me: "22586881"td:username: 'WdchI7Cv' #Tapd 密鑰password: 'A93DD3E1-0230-D282-7A09-D579D9828B48'res: #從odin 下載即將測試的 應(yīng)用寶 存放地址path: '/home/root/test-project/res'
手機(jī)和應(yīng)用apk對應(yīng)關(guān)系
test-parent/test-runner/src/main/resources/json 存放著相關(guān)的手機(jī)配置信息
-
Android plusme包:android-plus-me-device.json
-
iOS liveme包:ios-live-me-device.json
"LGH990515b53b": {"uid": "1542786092096241665","brand": "lge","account": "test26@fluxer.tv","model": "LG-H990","system": "Android","version": "8.0.0","name": "elsa_global_com","sdk": "26"
}
注:
-
如果手機(jī)在對應(yīng)的文件中,那么就執(zhí)行對應(yīng)的手機(jī)對應(yīng)的程序
-
如果連接的手機(jī)不在配置的文件中,那么該手機(jī)不會跑fastbot
-
如果在json配置文件中的機(jī)器,未連接上,代碼會跳過,不會報錯
-
對應(yīng)手機(jī)需要提前安裝對應(yīng)的apk 和登錄對應(yīng)的賬號
test-parent/test-runner/src/main/java/com/joyme/runner/service/impl/DataServiceImpl.java 文件中 對應(yīng)的配置文件和 相關(guān)包程序執(zhí)行 進(jìn)行關(guān)聯(lián)。
Android Fastbot大體流程:
-
拉取Android研發(fā)最新代碼,查找當(dāng)前最新的分支
-
從打包平臺獲取最新分支的對應(yīng)apk
-
安裝apk -> 初始化運(yùn)行環(huán)境(檢查jar, push 配置文件,初始化手機(jī)環(huán)境,清理歷史崩潰信息)-> 跑fastbot
-
收集崩潰信息 -> 和數(shù)據(jù)庫的歷史崩潰信息進(jìn)行對比去重-> 提交Tapd崩潰信息
iOS Fastbot大體流程:
-
拉取iOS 研發(fā)最新代碼,查找當(dāng)前最新的分支
-
從打包平臺獲取最新分支的對應(yīng)ipa
-
安裝ipa -> 殺死liveme 進(jìn)程-> 跑fastbot
-
對iOS崩潰文件進(jìn)行格式化 -> 提交Tapd崩潰信息
服務(wù)入口
-
入口文件
test-parent/test-runner/src/main/java/com/joyme/runner/service/impl/TaskServiceImpl.java? 入口文件
@Scheduled(initialDelay = 10 * 1000L, fixedDelay = 30 * 60 * 1000L)
@Async(value = "taskExecutor")
@Override
public void testAndroidLiveMe() {if(isRunnerAndroidLiveMe.get()){return;}isRunnerAndroidLiveMe.set(true);runnerService.runnerAndroidLiveMe();isRunnerAndroidLiveMe.set(false);
}
運(yùn)行測試類在 runner 模塊下的 com.joyme.runner.service.impl.TaskServiceImpl,使用了 Scheduled 定時和 Async 異步(之前是通過 jenkins 任務(wù)進(jìn)行測試),運(yùn)行代碼里在 RunnerService 方法,里面是具體執(zhí)行某包的測試方法。
具體函數(shù)實(shí)現(xiàn)
test-parent/test-runner/src/main/java/com/joyme/runner/service/impl/RunnerServiceImpl.java -> copy 一個 runnerAndroidPlusMe 并進(jìn)行修改
-
更新本地Android代碼,拉取最新的分支
-
根據(jù)最新分支去查找測試平臺數(shù)據(jù)庫,看是否有打過最新分支的 對應(yīng)類型的包
-
如果沒有則跳過,如果有那么獲取對應(yīng)的apk地址,下載apk包到本地服務(wù)器
-
獲取對應(yīng)執(zhí)行的手機(jī)設(shè)備,安裝最新的apk 包
-
跑fastbot之前檢查相關(guān)環(huán)境
-
隱藏狀態(tài)欄
-
*.jar 是否存在,如果不存在進(jìn)行push
-
Push test目錄的文件到手機(jī)中
-
執(zhí)行fastbot
-
-
手機(jī)崩潰信息,提交tapd
四.Nginx相關(guān)操作
nginx服務(wù):顯示airtest運(yùn)行報告。
# 查看nginx是否啟動
[root@bogon sbin]# ps aux|grep nginx
root 1018326 0.0 0.0 36572 412 ? Ss 11:36 0:00 nginx: master process ./nginx
root 1018327 0.0 0.0 66860 4932 ? S 11:36 0:00 nginx: worker process
root 1018450 0.0 0.0 11808 1196 pts/0 S+ 11:36 0:00 grep --color=auto nginx# 查看nginx進(jìn)程在哪里
[root@bogon sbin]# whereis nginx
nginx: /usr/sbin/nginx /usr/lib64/nginx /etc/nginx /usr/local/nginx /usr/share/nginx /usr/share/man/man3/nginx.3pm.gz /usr/share/man/man8/nginx.8.gz# 啟動nginx
[root@bogon nginx]# cd /usr/local/nginx/sbin
[root@bogon sbin]# ./nginx# 暫停nginx
[root@bogon sbin]# ./nginx -s stop# 重啟nginx
[root@bogon sbin]# ./nginx -s reloa
# 查看nginx 配置
[root@bogon conf]# cat /usr/local/nginx/conf
五.FQA
1.Xcode 中build FastbotRunner報錯
Failed to register bundle identifier The app identifier "bytedance.FastbotRunner11" cannot be registered to your development team because it is not available. Change your bundle identifier to a unique string to try again.
原因:
這個錯誤通常表示您的Xcode項目的Bundle Identifier與您的開發(fā)者賬號中已經(jīng)存在的應(yīng)用程序的Bundle Identifier重復(fù)了。要解決此問題,您可以按照以下步驟操作:
-
在Xcode中,選擇您的項目,并在“General”選項卡下找到“Identity”部分。
-
確保您的Bundle Identifier是唯一的,并且與您的開發(fā)者賬號中已經(jīng)存在的應(yīng)用程序的Bundle Identifier不重復(fù)。
-
如果您的Bundle Identifier與已經(jīng)存在的應(yīng)用程序的Bundle Identifier重復(fù)了,請嘗試更改您的Bundle Identifier,以確保它是唯一的。
解決方案:
修改 Bundle Identifier換個名稱,在重新build 就不咋報上面的錯誤了
2.iOS java 工程啟動報錯報錯
? target git:(ios) ? java -jar test-1.0.0.jar --spring.profiles.active=dev
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/joyme/portal/MainTest8077 has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0at java.lang.ClassLoader.defineClass1(Native Method)at java.lang.ClassLoader.defineClass(ClassLoader.java:756)at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)at java.net.URLClassLoader.defineClass(URLClassLoader.java:473)at java.net.URLClassLoader.access$100(URLClassLoader.java:74)at java.net.URLClassLoader$1.run(URLClassLoader.java:369)at java.net.URLClassLoader$1.run(URLClassLoader.java:363)at java.security.AccessController.doPrivileged(Native Method)at java.net.URLClassLoader.findClass(URLClassLoader.java:362)at java.lang.ClassLoader.loadClass(ClassLoader.java:418)at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151)at java.lang.ClassLoader.loadClass(ClassLoader.java:351)at java.lang.Class.forName0(Native Method)at java.lang.Class.forName(Class.java:348)at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:46)at org.springframework.boot.loader.Launcher.launch(Launcher.java:108)at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:65)
原因:因為jdk版本過低,需要jdk11+
3.iOS Java 工程啟動報錯:8077 端口被占用
? target git:(ios) ? java -jar test-1.0.0.jar --spring.profiles.active=dev
2023-08-11 13:20:41,951 main ERROR Unable to locate appender "FileLog" for logger config "root"
.-----..----. .----..-----. .----..----..---..-. .-..-..----..----.
`-' '-'} |__}{ {__-``-' '-' ___ { {__-`} |__}} }}_}\ \_/ / { || }`-'} |__}} { } '__}.-._} } } { {___} .-._} }} '__}| } \ \ / | }| },-.} '__}`-' `----'`----' `-' `----' `----'`-'-' `-' `-'`----'`----'
2023-08-11 13:20:42.060 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 6.2.5.Final
2023-08-11 13:20:42.172 [main] INFO com.joyme.portal.MainTest8077 - Starting MainTest8077 using Java 18.0.2.1 on bogon with PID 29041 (/Users/Amei/Liveme/Git/test-parent/test-portal/target/test-1.0.0.jar started by Amei in /Users/Amei/Liveme/Git/test-parent/test-portal/target)
2023-08-11 13:20:42.177 [main] INFO com.joyme.portal.MainTest8077 - The following 1 profile is active: "dev"
2023-08-11 13:20:44.923 [main] WARN io.undertow.websockets.jsr - UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be used
2023-08-11 13:20:44.965 [main] INFO io.undertow.servlet - Initializing Spring embedded WebApplicationContext
2023-08-11 13:20:44.966 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2705 ms
2023-08-11 13:20:46.263 [main] INFO com.baomidou.dynamic.datasource.DynamicRoutingDataSource - dynamic-datasource - add a datasource named [odin-inner] success
2023-08-11 13:20:46.263 [main] INFO com.baomidou.dynamic.datasource.DynamicRoutingDataSource - dynamic-datasource - add a datasource named [auto-test] success
2023-08-11 13:20:46.264 [main] INFO com.baomidou.dynamic.datasource.DynamicRoutingDataSource - dynamic-datasource initial loaded [2] datasource,primary datasource named [odin-inner]
2023-08-11 13:20:48.240 [main] INFO io.undertow - starting server: Undertow - 2.2.25.Final
2023-08-11 13:20:48.258 [main] INFO org.xnio - XNIO version 3.8.7.Final
2023-08-11 13:20:48.284 [main] INFO org.xnio.nio - XNIO NIO Implementation Version 3.8.7.Final
2023-08-11 13:20:48.378 [main] INFO org.jboss.threads - JBoss Threads version 3.1.0.Final
2023-08-11 13:20:48.473 [main] INFO io.undertow - stopping server: Undertow - 2.2.25.Final
2023-08-11 13:20:48.479 [main] WARN org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Failed to start bean 'webServerStartStop'; nested exception is org.springframework.boot.web.server.PortInUseException: Port 8077 is already in use
2023-08-11 13:20:48.482 [main] INFO com.baomidou.dynamic.datasource.DynamicRoutingDataSource - dynamic-datasource start closing ....
2023-08-11 13:20:48.503 [main] INFO com.baomidou.dynamic.datasource.DynamicRoutingDataSource - dynamic-datasource all closed success,bye
2023-08-11 13:20:48.618 [main] ERROR org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter - ***************************
APPLICATION FAILED TO START
***************************Description:Web server failed to start. Port 8077 was already in use.Action:Identify and stop the process that's listening on port 8077 or configure this application to listen on another port.
解決方案:殺死對應(yīng)的8077 進(jìn)程
ps -ef | grep 8077
kill -9 進(jìn)程號
4. 2臺手機(jī)運(yùn)行fastbot報錯
原因:因為2臺手機(jī)是通過2個電腦的xcode進(jìn)行初始化的,所以會報錯
批量執(zhí)行時,所有手機(jī)都必須得 是同一個同一臺電腦的 xcode進(jìn)行初始化。在跑java服務(wù)之前, 一定需要先確保手工執(zhí)行fastbot ios設(shè)備可以正常執(zhí)行成功
BUNDLEID=com.cmcm.live duration=5 throttle=1200 xcodebuild test -workspace /Users/Amei/Downloads/Fastbot_iOS-main/Fastbot-iOS/Fastbot-iOS.xcworkspace -scheme FastbotRunner -configuration Release -destination 'platform=iOS,id=d6f2e764a07599906b6ce4c14a202a3a46e35eb7' -only-testing:FastbotRunner/FastbotRunner/testFastbot
六.有用的經(jīng)驗
1.包名的獲取方式(需要配置好ADB命令)
-
aapt dump badging [apk路徑]
#mac系統(tǒng)直接拖動apk文件到命令行
2.使用 Maxim 獲取當(dāng)前控件所屬的Activity
-
下載Maxim的zip 包
-
解壓zip包,將 framework.jar , monkey.jar push 到手機(jī)上某個目錄中,建議
/sdcard
adb push framework.jar /sdcard
adb push monkey.jar /sdcard
-
手機(jī)連接上mac筆記本,然后打開指定app 想要獲取的頁面,運(yùn)行下面的adb命令,就可以獲取指定頁面的activity
adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.api.CurrentActivity
3.使用airtestIDE?獲取對應(yīng)的控件
4.Xcode 獲取iOS UDID
phone鏈接上Mac,Mac打開xcode,選擇模擬器。具體參見iPhone手機(jī)輕松獲取UDID的六種方式
5.IntelliJ IDEA 配置JDK版本
File -> Project Structure 菜單下,詳細(xì)參見IDEA 配置 JDK 圖文教程(超詳細(xì)) - 犬小哈教程
七.相關(guān)文檔
1.Fastbot 原理介紹
https://mp.weixin.qq.com/s/QhzqBFZygkIS6C69__smyQ
2.Android Fastbot 中文手冊
https://github.com/bytedance/Fastbot_Android/blob/main/handbook-cn.md
3.iOS Fastbot 中文手冊
https://github.com/bytedance/Fastbot_iOS/blob/main/Doc/handbook-cn.md
4.Maxim 獲取activity工具
https://github.com/zhangzhao4444/Maxim