环境
博主测试环境是在Android 7.0上,理论上不用任何修改就可以适合所有Android版本。
memtester
memtester主要用于测试内存稳定性
官网:http://pyropus.ca/software/memtester/
版本:memtester-4.3.0.tar.gz(目前最新版本-2018.10.21)
官方已经预编译了大部分Linux系统的二进制文件,可以直接使用,现在我们将它移植到Android系统中。
移植
首先我们看看Makefile文件它在Linux系统是怎么编译的,这里移植memtester-4.3.0.tar.gz压缩包里的文件不需要任何修改。
memtester: \
$(OBJECTS) memtester.c tests.h tests.c tests.h conf-cc Makefile load extra-libs
./load memtester tests.o `cat extra-libs`
从上面的Makefile可以知道,要编译memtester需要编译memtester.c和tests.c以及相关的头文件,所以我们可以写出下面的Android.mk文件。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := memtester.c tests.c
LOCAL_MODULE := memtester
LOCAL_C_INCLUDES := $(LOCAL_PATH)
include $(BUILD_EXECUTABLE)
我们把下载下来的memtester-4.3.0.tar.gz解压到system/core/目录下,并命名为memtester目录,并把Android.mk放到同一目录。文件如下显示。
lemon@ubuntu:~/Develop/OrangePi_Lite2/android/system/core/memtester$ tree
.
├── Android.mk
├── BUGS
├── CHANGELOG
├── conf-cc
├── conf-ld
├── COPYING
├── extra-libs.sh
├── find-systype.sh
├── make-compile.sh
├── Makefile
├── make-load.sh
├── make-makelib.sh
├── memtester.8
├── memtester.c
├── memtester.h
├── README
├── README.tests
├── sizes.h
├── tests.c
├── tests.h
├── trycpp.c
├── types.h
└── warn-auto.sh
0 directories, 23 files
接下来mm此目录就可以编译生成
lemon@ubuntu:~/Develop/OrangePi_Lite2/android/system/core/memtester$ mm -j8
........
5 warnings generated.
[100% 6/6] Install: out/target/product/petrel-p1/system/bin/memtester
make: Leaving directory '/home/lemon/Develop/OrangePi_Lite2/android'
#### make completed successfully ####
然后就可以通过
adb push memtester /system/bin/
adb shell "chmod 777 /system/bin/memtester"
adb shell memtester
来执行测试。
由于我需要打包到系统,所以还需要在device.mk里面进行定义。
diff --git a/android/device/softwinner/petrel-p1/device.mk b/android/device/softwinner/petrel-p1/device.mk
index 9696939..9b6ff8f 100755
--- a/android/device/softwinner/petrel-p1/device.mk
+++ b/android/device/softwinner/petrel-p1/device.mk
@@ -62,6 +62,8 @@ PRODUCT_PACKAGES += \
PRODUCT_PACKAGES += serial_comm
+PRODUCT_PACKAGES += memtester
+
PRODUCT_COPY_FILES += \
device/softwinner/petrel-p1/configs/virtual-remote.kl:system/usr/keylayout/virtual-remote.kl \
device/softwinner/petrel-p1/configs/sunxi-keyboard.kl:system/usr/keylayout/sunxi-keyboard.kl \
编译出system.img进行烧写测试。
测试
使用方法:Usage: memtester [-p physaddrbase [-d device]] [B|K|M|G] [loops],比如memtester 5M 1,对应测试1次5M内存
petrel-p1:/ # memtester
memtester version 4.3.0 (32-bit)
Copyright (C) 2001-2012 Charles Cazabon.
Licensed under the GNU General Public License version 2 (only).
pagesize is 4096
pagesizemask is 0xfffff000
need memory argument, in MB
Usage: memtester [-p physaddrbase [-d device]] <mem>[B|K|M|G] [loops]
查看系统空闲内存,还有251M
petrel-p1:/ # free -h
total used free shared buffers
Mem: 978M 727M 251M 0 13M
-/+ buffers/cache: 714M 264M
Swap: 128M 0 128M
演示:memtester 5M 1,这里只是演示,测试1次5M内存,实际项目中这两个参数应尽可能大,才能覆盖整块内存,才能达到压力测试的结果,测试时失败有相应的log,我这里比较难复现就不贴了。
petrel-p1:/ # memtester 5M 1
memtester version 4.3.0 (32-bit)
Copyright (C) 2001-2012 Charles Cazabon.
Licensed under the GNU General Public License version 2 (only).
pagesize is 4096
pagesizemask is 0xfffff000
want 5MB (5242880 bytes)
got 5MB (5242880 bytes), trying mlock ...locked.
Loop 1/1:
Stuck Address : ok
Random Value : ok
Compare XOR : ok
Compare SUB : ok
Compare MUL : ok
Compare DIV : ok
Compare OR : ok
Compare AND : ok
Sequential Increment: ok
Solid Bits : ok
Block Sequential : ok
Checkerboard : ok
Bit Spread : ok
Bit Flip : ok
Walking Ones : ok
Walking Zeroes : ok
Done.
petrel-p1:/ #