概述
??本系列文章主要介紹批處理在日常工作中的應(yīng)用,具體的語法不作介紹,網(wǎng)上有很多這方面的博客,以下推薦幾個:
本篇文章主要介紹adb和批處理結(jié)合解決平時工作上的問題。
一、通過adb安裝apk
????對于android開發(fā)和測試的小伙伴來說,安裝apk很是常見的,我們可以通過批處理來做這件事。不過你們肯定問會說,這個有啥麻煩的,一個adb install xxx.apk 搞定,但有時候情況并不是,舉個最常見的例子:平時一臺電腦可能連了多個android設(shè)備,這時候你要安裝的話,要不拔掉不用的,只保留一個需要安裝的設(shè)備,要不通過-s 命令參數(shù)指定一臺需要安裝的android設(shè)備,但感覺都挺麻煩。有時候安裝apk的時候需要查看這個apk版本和包名,可以通過:
aapt d badging xx.apk
查出版本號和包名稱,這時候我們可以考慮將這兩個功能合在一起,既能看版本又能方便安裝。
????首先想到的是批處理,因為批處理在win系統(tǒng)上天然支持,只要寫好這個腳本就可以幫你做很多事,而且不需要像java,python一樣安裝運行環(huán)境。
1. apk安裝腳本代碼
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set devs=
set num=0
set select=
set devname=
set packname=
set newVersionName=
echo ==================== 當前連接的設(shè)備 ====================
rem 獲取版本信息
for /f "tokens=2,3,4" %%a in ('aapt d badging %1') do (
set /a n+=1
if !n!==1 (
echo 應(yīng)用名稱: %~n1%~x1 %%a
echo 應(yīng)用版本: %%b %%c
set newVersionName=%%c
for /f "tokens=2 delims=^=" %%i in ("%%a") do set packname=%%i
)
)
rem 獲取當前連接的設(shè)備
echo.
for /f "skip=1" %%a in ('adb devices') do (
set dev=%%a
if not "!devs!"=="" (
set "devs=!devs!,!dev!"
) else (
set "devs=!devs!!dev!"
)
set /a num+=1
rem 獲取設(shè)備名稱
for /f "delims=," %%i in ('adb -s !dev! shell getprop ro.product.model') do set devname=%%i
rem 顯示可選設(shè)備
echo 設(shè)備: !num! !dev! !devname!
)
echo ==================== 當前連接的設(shè)備 ====================
echo.
rem 如果只有一個設(shè)備,直接安裝
if !num! equ 1 (
set select=!devs!
goto :install
)
rem 如果有多個設(shè)備選擇一個設(shè)備進行安裝
set /p num=選擇一個設(shè)備進行安裝(選擇序號):
for /f "delims=, tokens=%num%" %%i in ("!devs!") do set select=%%i
goto :install
:install
echo.
set versionName=
for /f "delims=" %%i in ('adb -s !select! shell dumpsys package !packname! ^| findstr versionName') do (
set versionName= %%i
)
if "%versionName%" neq "" (
echo 版本升級: %versionName% --^> %newVersionName%
)
rem 開始安裝
echo.
echo 正在安裝..., 待安裝的設(shè)備: !select!
if "%~d1" == "\\" (
adb -s !select! install -r -d %1
) else (
rem 進入相應(yīng)目錄,避免特殊目錄導(dǎo)致安裝失敗問題
cd %~dp1
adb -s !select! install -r -d %~nx1
)
pause
2. 代碼介紹
????代碼邏輯還是比較清晰的,從上到下主要分3個部分,第一部分通過aapt解析apk獲取版本號和包名稱。第二部分通過adb devices命令獲取當前連接的設(shè)備,第三部分是apk安裝命令。需要注意的是,adb install對于一些中文目錄不支持,安裝回報錯,需要先進入這個目錄后開始安裝。但類似共享目錄這種就不能這樣,只能按照路徑進行安裝,所以安裝部分代碼拆成兩個邏輯實現(xiàn)。代碼注釋也比較清楚了,詳細的不介紹了,可以對比注釋理解這段腳本代碼。
3. 怎么應(yīng)用這個批處理
????代碼都是實現(xiàn)了,但怎么和apk進行關(guān)聯(lián)呢,我們知道一個文件可以指定他的打開方式,bat處理也可以看成是一個程序。那依次類推是不是我們可以指定apk打開方式為批處理。這樣我們就可以直接雙擊這個apk就能安裝了。
????我們新建一個后綴為 .bat 的install_apk.bat文件,這個批處理文件你就當成一個軟件放到一個文件夾下,這時候如下圖1-1 指定打開方式為 install_apk.bat。指定打開方式完成后,這時候直接雙擊apk就能安裝了。

????雙擊后如下圖所示:

????是不是很方便,只要雙擊apk就能安裝,不需要再去敲命令,就能幫你安裝又能查看apk安裝的信息,甚至看到安裝在android設(shè)備的上個版本號信息。
二、通過adb截屏
????這個也是很常見的應(yīng)用,平時的時候需要敲至少兩行命令才行,
第一步截圖保存到sd卡中:
adb shell /system/bin/screencap -p /sdcard/screen.png
第二步copy sd卡中保存的圖片到電腦端
adb pull /sdcard/screen.png C:/Users/%username%/Desktop/screen.png
通過批處理進行組合我們能更高效的完成,只要點點鼠標就行。
1. 代碼實現(xiàn)
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set devs=
set num=0
set select=
set devname=
for /f "skip=1" %%a in ('adb devices') do (
set dev=%%a
if not "!devs!"=="" (
set "devs=!devs!,!dev!"
) else (
set "devs=!devs!!dev!"
)
set /a num+=1
rem 獲取設(shè)備名稱
for /f "delims=," %%i in ('adb -s !dev! shell getprop ro.product.model') do set devname=%%i
rem 顯示可選設(shè)備
echo 設(shè)備: !num! !dev! !devname!
)
echo ==================== 當前連接的設(shè)備 ====================
echo.
if !num! equ 1 (
set select=!devs!
goto :shot2
)
set /p num=選擇一個設(shè)備進行安裝(選擇序號):
for /f "delims=, tokens=%num%" %%i in ("!devs!") do set select=%%i
goto :shot2
:shot2
echo ------^>正在截圖...
adb -s !select! shell /system/bin/screencap -p /sdcard/screenshot.png
if !errorlevel! equ 1 goto :fail
echo ------^>正在復(fù)制圖片到桌面
adb -s !select! pull /sdcard/screenshot.png C:/Users/%username%/Desktop/screenshot.png > Nul
if !errorlevel! equ 1 goto :fail
echo ------^>截圖成功
goto :end
:fail
echo ------^>截圖失敗!!
:end
echo.
pause
2. 代碼介紹
????主要也分三個部分,第一部分選擇設(shè)備,第二部分截圖,第三部分copy圖片到電腦桌面。第一部分是直接拿上面安裝腳本代碼的。當然了,像這種共用的模塊可以封裝成一個函數(shù)供其他模塊調(diào)用。我偷了個懶直接拿來用了。
3. 應(yīng)用
????應(yīng)用么,很簡單,雙擊這個寫好的批處理即可。
總結(jié)
????上面介紹的2個只是我平時遇到比較多的例子,還有許多其他應(yīng)用,需要各位大大去挖掘,肯定還有許多我還沒發(fā)現(xiàn)的,各位都可以提提意見,共同進步哈。上面有啥錯誤,也歡迎指正。下篇介紹其他的應(yīng)用。