Android操作系统移植运行UnixBench进行基准性能测试

          先上移植后运行UnixBench基准性能测试的效果图:

  Android操作系统移植运行UnixBench进行基准性能测试_第1张图片       Android操作系统移植运行UnixBench进行基准性能测试_第2张图片

                        整形运算测试过程                                                                                    输出测试结果

       UnixBench 移植过程参考下面的步骤:

        一、 为原生Android操作系统(核心Linux环境)准备基础环境,基础环境目标包括root权限获取、gcc编译器及工具链、BusyBox工具集,Perl脚本语言运行环境,为完成此目标至少需要完成以下工作:

(1)获取root权限;

       使用如“Root大师”等流行的Android root权限破解工具获取操作系统root权限,这里不多赘述,只是还要提一下关于破解的原理问题,先来看下面一段脚本:

mount -o rw,remount -t yaffs2 /dev/block/mtdblock11 /system
rm /system/xbin/su
rm /system/bin/su
mkdir /system/xbin
cat /superboot/su>/system/xbin/su
chmod 4755 /system/xbin/su

        这段脚本成为了你可能获取root权限的关键,它主要完成了三件事,清理操作系统原有的su文件,用破解的su文件进行替换,对su文件设置带有suid位的权限(-rwsr-xr-x),这样任何用户进程都可以通过su命令将权限提升为root权限(即获取root身份)。当然,你会有疑问,上面脚本的执行是需要root权限的,我们如何才能在破解之前获取root权限呢?原理是利用Android拥有root权限程序中的安全漏洞,如利用RageAgainstTheCage漏洞使连接系统注册服务adbd的adb获取root权限从而实现上述脚本的执行任务。

(2)文件系统写权限;

        Android默认将“/”目录mount为Read-only file system,因此,需要对其重新mount,使其具备读写权限,参考如下方法:

mount -o rw,remount -t ext2 /dev/block/mtdblock3 /
注:此步骤的目的是为了建立与X86环境下相匹配的目录结构。

(3)Shell环境;

        移植X86的源码包特别需要注意的一点就是sh的路径问题,默认为SHELL = /bin/sh,但对于Android下,该实际路径为/system/bin/sh,因此,需要对此细节进行调整,参考如下方法:

mkdir /bin
ln -s /system/bin/sh /bin/sh

注:由于Android下目录结构与FHS存在差异,因此,X86移植程序中如Shell、Perl等脚本均需要重新建立一个仿FHS的目录结构,以便可以在不修改脚本本身的情况下运行脚本。

(4)BusyBox环境;

        需要安装BusyBox工具环境,可以下载一个BusyBox针对Android的安装工具,根据Android的版本选择工具版本,之后会自动进行安装。

(5)gcc编译环境;

        需要下载一个针对Android的gcc编译器以及相关工具和库环境,参考如下配置方法:

      上传gcc编译器的二进制包到/data目录,并设置环境变量:

export GCCHOME="/data/gcc"                                                 
export GCCPATH=$GCCHOME/bin:$GCCHOME/arm-linux-androideabi/bin:$GCCHOME/libexec/  
export PATH=$PATH:$GCCHOME:$GCCPATH
export LIBRARY_PATH=" /system/lib"

(6)Perl脚本支持环境;

       对于Perl脚本的支持可以使用google的SL4A,可以访问项目http://code.google.com/p/android-scripting/,下面提供了对Perl和Python脚本语言的支持,下载一个Perl的安装程序,运行后可以自动下载和安装Perl脚本语言的支持组件,但除非,否则只能手工安装组件,手工方法是下载perl_r9.zip(perl与核心库)和perl_extras_r7.zip(Android扩展库),解压后,建立以下目录结构,并分别进行上传:

        将perl_r9.zip中的perl上传至/usr/bin下;perl_r9.zip中的5.10.0目录和perl_extras_r7.zip中的site_perl目录上传至/data/data/com.googlecode.perlforandroid/files/perl/下。

            二、移植UnixBench程序,需要根据编译和运行错误对原有的程序进行微调,达到可以运行基准测试并输出结果的目标:

(1)主程序源码编译问题调试;

问题一:

gcc -o ./pgms/fstime -DTIME -Wall -pedantic -ansi -O2 -fomit-frame-pointer -ffor
ce-addr -ffast-math -Wall ./src/fstime.c
./src/fstime.c:54:13: error: conflicting types for 'sync'
In file included from /data/gcc/bin/../lib/gcc/arm-linux-androideabi/4.7.1/inclu
de/fcntl.h:34:0,
                 from ./src/fstime.c:39:
/data/gcc/bin/../lib/gcc/arm-linux-androideabi/4.7.1/include/unistd.h:128:12: no
te: previous declaration of 'sync' was here
./src/fstime.c: In function 'r_test':
./src/fstime.c:321:20: error: conflicting types for '__errno'
In file included from ./src/fstime.c:38:0:
/data/gcc/bin/../lib/gcc/arm-linux-androideabi/4.7.1/include/errno.h:48:24: note
: previous declaration of '__errno' was here
make: *** [pgms/fstime] Error 1
解决方案:

1、修改unistd.h文件,暂时去掉sync的声明;

2、修改fstime.c文件,将extern int errno;修改为extern volatile int errno。

问题二:

gcc -o ./pgms/whetstone-double -DTIME -Wall -pedantic -ansi -O2 -fomit-frame-poi
nter -fforce-addr -ffast-math -Wall -DDP -DUNIX -DUNIXBENCH ./src/whets.c -lm
/data/gcc/bin/../lib/gcc/arm-linux-androideabi/4.7.1/../../../../arm-linux-andro
ideabi/bin/ld: warning: ./ccB4JrHQ.o uses variable-size enums yet the output is
to use 32-bit enums; use of enum values across objects may fail
./ccB4JrHQ.o: In function `whetstones':
whets.c:(.text+0xa04): undefined reference to `sincos'
whets.c:(.text+0xa28): undefined reference to `sincos'
collect2: error: ld returned 1 exit status
make: *** [pgms/whetstone-double] Error 1
解决方案:

由于libm.so缺少对sincos的支持,修改whets.c文件,暂去掉有关sincos相关的测试内容。

(2)运行脚本Run运行时问题调试

Run脚本实际是一个perl脚本,调用的系统命令需要适应busybox环境,如将`pwd`修改为`busybox pwd`。

       介绍到此,我们的移植工作基本可以告一段落了,虽然还有许多更细节的优化部分需要调整,但UnixBench已经可以运行了。最后,通过./Run运行UnixBench基准性能测试,来测试Android操作系统以及搭载它的硬件设备的基准性能吧。


你可能感兴趣的:(C/C++,Android,测试工具,性能)