2014年5月6日 星期二

在Android做LTP (Linux Test Project)測試

在Android做LTP (Linux Test Project)測試

序:

LTP是一個測試Linux核心的開源(Open Source)測試套件, 一開始由SGI發起, 由 IBM, Cisco, Fujitsu, SUSE, Red Hat 等公司開發與維護. 目前能持續的進版中. LTP針對Linux系統做可靠度, 強健度, 與穩定度做系統測試, 內涵許多的Test Case可供測試. 測試Linux伺服器時, 也可以採用這樣的測試套件來為你購買的硬體設備做燒機(Burn/Run in)測試.

Android的底層核心是Linux系統, 可透過Android ADB的連線進到大家熟悉的Linux Console環境. LTP套件基本上的設計是基於PC的系統架構與權限條件. 但Android的架構與X86是不一樣的, 因此要把LTP佈署在Android的裝置上, 必須採用可在X86環境上編譯Android架構可用的編譯器(Compiler), 稱作跨平台編譯器(Cross Compiler). 由於LTP的源碼(Source Code)的架構與參數設定, 是給X86架構使用的, 因此在編譯前, 還必須做些參數上的調整.當中有相當多的觀念可以學習.

介紹:

環境建置: 在開始編譯一個合適你的Android系統測試用的LTP前, 環境建置是必須的. 以下分別介紹要安裝那些套件.

1. 安裝Ubuntu64 bit在你的電腦上, 我是用12版.
2. 到 sourcery.mentor.com 下載Cross Compiler. 也可以用新版的Cross Compiler.
3. 於Ubuntu上安裝以下套件.

  • sudo apt-get install git-core flex bison gperf libesd0-dev libwxgtk2.6-dev zlib1g-dev build-essential libstdc++5 tofrodos
  • sudo apt-get install x-dev
  • sudo apt-get install libx11-dev
  • sudo apt-get install libncurses5-dev
  • sudo apt-get install libreadline-dev
  • sudo apt-get install g++-multilib (build kernel用) 
  • Ubuntu 64bit
  • apt-get install ia32-libs ia32-libs-gtk
  • sudo dpkg-reconfigure dash  Selection 'NO‘
  • ./arm-2012.09-64-arm-none-linux-gnueabi.bin
3. 於sourceforge.net下載LTP原始碼

4. 編譯環境設定.
  • 設定Cross Compiler的路徑到環境變數中. 以下路徑需要修改為你放置與安裝Cross Compiler的正確資料夾. 注意這些環境設定是適用於ARM平台.
export PATH=$PATH:/home/carl/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin/
export CC=/home/carl/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin/arm-none-linux-gnueabi-gcc
export LD=/home/carl/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin/arm-none-linux-gnueabi-ld
export AR=/home/carl/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin/arm-none-linux-gnueabi-ar
export LIB_DIR=/home/carl/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/lib
export AS=/home/carl/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin/arm-none-linux-gnueabi-as
export RANLIB=/home/carl/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin/arm-none-linux-gnueabi-ranlib
export STRIP=/home/carl/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin/arm-none-linux-gnueabi-strip

編譯與安裝LTP
1. 設定你的LTP.
./configure AR=arm-none-linux-gnueabi-ar CC=arm-none-linux-gnueabi-gcc RANLIB=arm-none-linux-gnueabi-ranlib STRIP=arm-none-linux-gnueabi-strip --host=arm-linux --target=arm-linux CFLAGS="-static" LDFLAGS="-static -pthread“
2. 為了要讓LTP能順利在ARM平台下的Linux執行, 需要做一些參數上的調整. 這邊參考了網路一些零碎的資料, 實做了, 是可行的. 以下以20120104的LTP版本為例. 實驗過2013版本也是可行的.
  • 在 ltp-full-20120104/testcases/kernel/controllers/libcontrollers/libcontrollers.h 裡增加 LINE_MAX 的 define, 這邊是設定為 255.
  • 將 ltp-full-20120104/testcases/kernel/fs/fs-bench 裡 random-access.c, random-del-create.c & random-access-del-create.c 這三個檔案裡的 openlog[] 陣列名稱修改成其他的名稱, 避免衝突.
  • 在 ltp-full-20120104/testcases/kernel/sched/sched_stress/sched_driver.c 和 ltp-full-20120104/testcases/kernel/fs/ftest/libftest.c 這兩個檔案裡, 增加 PATH_MAX 的 define 值, 這裡是設定成 1024.
  • 在 ltp-full-20120104/testcases/kernel/sched/cfs-scheduler/hackbench.c 裡加上 PTHREAD_STACK_MIN 的 define, 這兒是設成 1024.
  • make
  • make install prefix=/[Install Folder]
3. 開始編譯與安裝在指定的資料夾. 這會需要一段很長的時間, 視電腦速度而異. 編譯出來約1GByte的大小. 若只有100M上下的檔案大小, 就是沒有編譯成功.

  • make
  • make install prefix=/[Install Folder]

佈署LTP到你的Android裝置

1. 下載Busybox, 並且推到你的Android中. 因為Android裝置內的Linux指令已經精簡過了, 因此少了很多Shell Command. 你需要補強幾個LTP會用到的Linux Shell Command.
adb push busybox /data/local/tmp
2. 把編譯出的LTP整個資料夾推送到Android裝置內的/data/local/tmp/資料夾.
3. 讓你的Busybox內的command可以實體化. 以下只舉幾個例子, 最好可以把busybox內的所有command都做一次以下動作.

  • busybox ln -f busybox readlink
  • busybox ln -f busybox basename
  • busybox ln -f busybox mktemp
  • busybox ln -f busybox dirname
  • busybox ln -f busybox grep
  • busybox ln -f busybox sed
  • busybox ln -f busybox awk
  • busybox ln -f busybox head
  • busybox ln -f busybox free
  • busybox ln -f busybox uname

4. 於Android ADB命令列下設定執行LTP環境. 例如我編譯出的LTP都推到Android內的 /data/local/tmp/LTP13/資料夾內.

  • export PATH=/data/local/tmp/busyboxdir:$PATH
  • export PATH=/data/local/tmp/LTP13:$PATH
  • export PATH=/data/local/tmp/LTP13/testcases/bin:$PATH
  • export PATH=/data/local/tmp/LTP13/runtest:$PATH
開始執行LTP
sh ./runltp -p -l 130326report1ipc.log -o 130326output1ipc.log  -d /data/local/tmp/LTP13/tmp -f ipc

後記

由於LTP的Source Code中有些程式碼不符合Android的一些限制, 需要做修改後方可正常執行. 若有興趣的人, 在留言板上留言, 我們再來討論吧.

至於LTP的Soruce Code是用甚麼語言寫的, 主要分為兩種, 一種是C語言, 另外一種是Shell Script配合Shell Command執行.

參考資料:

Internet Q&A

關鍵字: LTP, Android, Linux Test Project, Stress Test, Android Reliability, Automation Test. 分享到Line

沒有留言:

張貼留言