Perl腳本調試/測試Android

軟件寫好後,進行一系列測試,先測試功能,再測試穩定性

perl腳本很適合做測試腳本,配合上adb,fastboot,i2ctool 等工具,可以windows/linux上使用。Android手機內安裝busybox,shell的東西基本都能用。

perl腳本也不侷限於測試,可以讀取手機配置,修改手機配置,安裝應用。


舉個例子,我們需要重複開關機,測試芯片是否成功掛載。

在kernel 我打log

	xxx_chip_probe()
	{
		.......
		rc = xxx_i2c_read(chip, CFG_BATT_CHG_REG, &reg);
		if (rc) 
		{
			pr_err("Failed to detect xxx, device may be absent\n");
			return -ENODEV;
		}
		.....
	}

簡單看log

1 、在cmd終端  adb shell “dmesg | grep 'xxx' ” 

2、adb reboot

然後重複1、2兩步,重複幾百次看是否穩定。


windows批處理可以實現,但是功能不完全,字符串的處理能力弱,想要存儲結果或者判斷都不方便。perl可以很好解決批處理。

查看芯片掛載情況:

功能:自動重啓手機,掛載出錯時,打印掛載信息。

$time = 1;
$try = "xxx";
while (1)						
{
	`adb wait-for-device`;                #等待重啓完畢
	$ret=`adb shell "dmesg | grep 'xxx'"`;#查找trace
	print "$time ";                       #打印次數
	if ($ret =~/$try/)                    #查找是否包含xxx
	{
		print "\n$ret\n";             #打印結果
	}
	$time++;
	`adb reboot`;                         #重啓
}

說明:`cmd`反引號,執行shell命令,而且有返回值,$ret可以對字符處理,perl支持正則表達式,$ret =~/$try/,判斷返回的結果是否包含字符串xxx。


大白天,守在電腦旁邊,可以隨時查看結果。不至於錯過查看log的機會,晚上掉電或者突發,電腦可能保存不了資料。可以在這個基礎上加上文件讀寫,把log存起來。

查看芯片掛載情況:

功能:自動重啓手機,掛載出錯時,保存掛載信息。

$time = 1;
$try = "xxx";

while (1)									
{
	`adb wait-for-device`;                #等待重啓完畢
	$ret=`adb shell "dmesg | grep 'xxx'"`;#查找trace
	print "$time ";                       #打印次數
	if ($ret =~/$try/)                    #查找是否包含xxx
	{
		open (FILE_LOG, ">>mlog.log") || die ("Could not open  file");	#打開文件
		print FILE_LOG $ret;          #存儲LOG
		close(FILE_LOG);              #關閉文件

	}
	$time++;
	`adb reboot`;                         #重啓
}

說明:>>是追加的方式打開文件,這樣晚上就可以放心的自動測試了。


檢測了40多次,還未檢測出失敗。


這個方法可以解決很多問題,不僅侷限測試,比如讀取手機配置,修改手機配置,安裝應用。

比如實際生產,批量修改手機型號。

基本思路

1、導出build.prop配置表

2、判斷型號

3、修改型號,再把build.prop 塞進手機

4、修改build.prop文件屬性,重啓

方法和上面腳本差不多,我就不舉例了。


某些情況,要觀察中斷是否正常。遇到不清楚設備,調試的時候不清楚哪個設備發生中斷,可以用perl腳本跟蹤觀察中斷變化。以下是perl腳本:

測試/查看中斷次數:

功能:間隔時間查看中斷次數,指定中斷號,時間,如果不指定可以查看所有變化。

$first_time=1;
%tb = {};
$times=0;
($irq,$tick) = @ARGV;
print "find irq:".$irq."\n";
if($tick le 0 || $tick <=0)
{
	$tick = 1;
}

print "cycle time:".$tick."\n";
while(1)
{
	$ret = `adb shell cat /proc/interrupts >tmp`;
	open(FILE, "<tmp");
	$times=$times+1;

	sleep($tick);
	system("cls");
	print "======================================\n";
	print "===== find irq:".$irq."\n";
	print "===== tick:".$tick."\n";
	print "===== cycle Times:".$times."=====\n";
	print "======================================\n";
	while(<FILE>)
	{
		if (~/\s?\w+\d+\:/)
		{
			$key = $&;
			$key =~s/\://;
		}
		else
		{
			next;
		}

		if (~/:\s+\d+/)
		{
			$value = $&;
			if ($value=~/\d+/)
			{
					$value = $&;
					if ($tb{$key} ne $value)
					{
						$tb{$key} = $value;
						if($first_time ne 1)
						{
							if($irq=~/\d+/)
							{
								if($irq eq $key)
								{
									print $key."   ".$value."\n";
								}
							}
							else
							{
								print $key."   ".$value."\n";
							}
						}
					}
			}
		}
		
	}
	$first_time=0;
	close(FILE);
}

20,128,166號均發生中斷,結合/proc/interrupts可以查看具體中斷信息。


perl方便在shell命令使用和文字處理能力,IO處理,語法和C語言相近,很容易入手。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章