2022年android技术报告 .pdf
D09M02嵌入式彭辉一、前言Android 是 Google 开发的基于Linux 平台的开源手机操作系统。它包括操作系统、用户界面和应用程序移动电话工作所需的全部软件,而且不存在任何以往阻碍移动产业创新的专有权障碍。Google 与开放手机联盟合作开发了 Android,这个联盟由包括最中国移动、摩托罗拉、高通、宏达电和 T-Mobile 在内的 30 多家技术和无线应用的领军企业组成。Google 通过与运营商、设备制造商、开发商和其他有关各方结成深层次的合作伙伴关系,希望借助建立标准化、开放式的移动电话软件平台,在移动产业内形成一个开放式的生态系统。可以看出android是一个具有相当潜力的操作系统,因此在关于android 移植上面花了近40 天的时间 ,从一无所知到基本熟练,我认为是值得的。下面就移植的过程和移植过程中遇到的问题作一一详细的记录。二、硬件,软件平台1. 研发硬件配置freescale3780开发板, linux Pc机,串口线, 512M Sd卡, USB 电源线。2. 研发语言及编译器研发语言java ,C,汇编。编译器 arm-none-linux-gnueabi交叉编译工具3. 软件支持工具开发板自带软件LTIB,android SDK。4. 第三方工具串口通信软件minicom ,Meld 差异查看器 , 内核裁剪工具menuconfig 及底层支持工具,diff工具等。三、基本流程1. 得到 android基于 linux的内核2. 得到 android文件系统3. 烧入板中测试并反复修改4. 触摸屏, USB等驱动移植5. 校准触摸屏,对应按键6. 程序测试四、制作android内核用的工具包有linux2.27标准内核源码(linux-2.6.27),android 2.27内( common ), 开发板 patch 过的linux2.28内核 (linux-2.6.28).这里说明一下,因为没有目前 android 2.28的内核,所以只能退而求其次用2.27 的内核,因为linux2.27与 linux2.28标准内核相差不是很大,故也能完成任务。以下是步骤:1. 比较 android 2.27内核与标准内核的差异并得到patch 文件 (linux-2.6.27与 common,linux-2.6.28放在同一目录下面) # diff -Nuar -x .git linux-2.6.27 common android-2.6.27.patch 2. 将补丁打到开发板 patch 过的 linux2.28内核上#cp android-2.6.27.patch linux-2.6.28 #cd linux-2.6.28 #patch -p1 android-2.6.27 在打补丁的过程会出现10 几个错误,需要手动合并,这里不一一讲述。3. 配置编译内核make CROSS_COMPILE=arm-none-linux-gnueabi- ARCH=arm menuconfig进行内核配置,确保以下几项得到配置 CONFIG_ARM_THUMB=y CONFIG_AEABI=y CONFIG_BINDER=y CONFIG_ANDROID_LOG=y CONFIG_ANDROID_POWER=y CONFIG_ANDROID_POWER_STAT=y 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 5 页 - - - - - - - - - export PATH=$PATH:/opt/freescale/usr/local/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/bin (我的交叉编译工具的路径) 下面可以开编译了#make CROSS_COMPILE=arm-none-linux-gnueabi- ARCH=arm 在编译的过程也会出现若干错误,自己修改源码即可通过编译。4. 编译完成后,在linux-2.6.28/arch/arm/boot下可以找到我们需要的内核zImage 五、制作android文件系统 1. 启动配置android模拟器emulator& 等待 emulator 启动 , 看到出现 Android 系统画面 , 进入菜单 ALL/Dev Tools/Development Settings 下, 将 Wait for debugger,Show running processes,Show screen updates 这三项打勾2. 回到命令输入终端, 将 busybox 工具 push 进模拟器中adb push /busybox /data 3. 进入模拟器终端,将文件系统各目录打包#adb shell $chmod 777 /data/busybox (给 busybox 加权限,不然运行不了) $/data/busybox tar -czf system.tar.gz /system $/data/busybox tar -czf data.tar.gz /data $/data/busybox tar -czf etc.tar.gz /etc $/data/busybox tar -czf sbin.tar.gz /sbin $exit 4. 将得到的打包文件从模拟器中pull出来adb pull /system.tar.gz ./ adb pull /data.tar.gz ./ adb pull /etc.tar.gz ./ adb pull /sbin.tar.gz ./ adb pull /init ./ adb pull /init.rc ./ 5. 制作根文件系统mkdir rootfs #tar -xf system.tar.gz rootfs #tar -xf data.tar.gz rootfs #tar -xf etc.tar.gz rootfs #tar -xf sbin.tar.gz rootfs #mv init rootfs #mv init.rc rootfs 6. 但是这个文件系统还需要一点修改才能正常运行在 rootfs/init.rc中,注释掉除mount tmpfs tmpfs /sqlite_stmt_journals size=4m以外,所有的mount 命令。7. 这样就得到了一个基本的根文件系统rootfs 六、烧入板中所用为 1G Sd 卡1.SD 卡分区#sudo fdisk /dev/sdb (不一定是sdb,可能是sdc,sdd 等,用 fdisk -l查看 ) 进行相应的操作并保存#sudo fdisk /dev/sdb -l查看Disk /dev/sdb: 1014 MB, 1014497280 bytes 64 heads, 32 sectors/track, 967 cylinders Units = cylinders of 2048 * 512 = 1048576 bytes 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 5 页 - - - - - - - - - /dev/sdb1 1 16 16368 53 OnTrack DM6 Aux3 /dev/sdb2 17 967 973824 83 Linux 注意,以上两个分区均为主分区(primary),否则会出错。2. 烧入文件系统2.1 格式化第二分区#sudo mkfs.ext2 /dev/sdb2 2.2 挂载第二分区#sudo mount /dev/sdd2 /mnt/mmc 2.3 拷入 roofs到第二分区#sudo cp -r /rootfs/* /mnt/mmc 3. 烧入 bootstream(相当于 bootloader + 内核配置 + 内核 ) 3.1 制作 bootstream 将得到的内核zImage 拷到 ltib中 boot_stream-1.1下(如果没有请在/opt/freescale/pkgs中找压缩包)修改命令行gedit linux_prep/cmdlines/stmp378x_dev.txt设置默认为console=ttyAM0,115200 root=/dev/mmcblk0p2 rw rootwait lcd_panel=lms350 ssp1=mmc init=/init 编译 linux_prep make -C linux_prep 编译 bootstream image ./elftosb2 -z -c stmp378x_linux_sb.db -o stmp378x_linux.sb 当前目录下得到 bootsteam image stmp378x_linux.sb 3.2 将 bootstream烧入 SD卡中第一分区#dd if=/dev/zero of=mmc_boot_partition.raw bs=512 count=4 #dd if=stmp378x_linux.sb of=mmc_boot_partition.raw ibs=512 seek=4 conv=sync,notrunc #sudo dd if=mmc_boot_partition.raw of=/dev/sdb1 至此一个基本的系统已经搭建起来七、测试系统1. 开发板设置 Jumper settings: - JP4: 1-2 - JP5: 1-2 - JP6: 1-2 - JP7: 1-2 - JP17: 2-3 to connect VDD_5V input to wall power supply 1-2 to connect VDD_5V input to USB VBUS - JP21: 1-2 - JP23: Leave empty - J6: Leave empty ? Switches: - SW1: 1000 - SW2: On to supply 5.0V power to the CPU from USB or wall power depending on JP17 setting - SW3: 0000 USB boot 0100 NAND boot Copyright (c) 2009 Embedded Alley Solutions, Inc. 10 0110 Wait to be debugged (to debug with Jtag) 1001 MMC boot 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 5 页 - - - - - - - - - LMS350 LCD transporter card ? Jumper settings: JP3: Closed JP4: Empty JP5: 1-2 2. 启动系统接好串口线,打开minicom ,点击开发板上PSWITCH 按键启动系统3.android系统启动,能看到界面4. 问题4.1 视频显示不正常(两个界面,画面质量差)4.2 按键不灵4.3 触摸屏无响应八、问题解决1. 视频显示不正常(两个界面,画面质量差)原因: samsung lms350gf10不支持双缓存和565 的视频格式解决: 1. 修改 linux-2.6.28/drivers/video/stmp37xxfb.c中,把 stmp3xxxfb_fix.smem_len = pentry-y_res * pentry-x_res * pentry-bpp / 8; 改为 stmp3xxxfb_fix.smem_len = (pentry-y_res * pentry-x_res * pentry-bpp /8)*2; 2.文件系统:参考附件2,修改 Android SDK 中的 EGLDisplaySurface.cpp文件,然后编译Android SDK 得到文件系统。mydroid/frameworks/base/libs/ui (mydroid 为 Android SDK 所在目录)关键点是将mFbi.format = GGL_PIXEL_FORMAT_RGB_565; 改为 mFbi.format = GGL_PIXEL_FORMAT_BGRA_8888; 2. 按键不灵原因 : 键值未设置对应功能解决:修改文件系统中rootfs/system/usr/keylayout/qwerty.kl文件,把功能的键值设成对应开发板上的键值即可3. 触摸屏无响应原因 : 未添加对应事件驱动解决:修改linux-2.6.28/drivers/input/touchscreen/stmp3xxx_ts.c文件在函数 static void process_lradc中:case TS_STATE_TOUCH_VERIFY: ts_debug(%s: touch verify state, sample_count %dn, _func_, info-sample_count); ts_debug(%s: x %d, y %dn, _func_, info-x, info-y); input_report_abs(info-idev, ABS_X, info-x); input_report_abs(info-idev, ABS_Y, info-y); /- 添加input_event(info-idev,EV_KEY,BTN_TOUCH,pressure); /printk(=%s n,info-idev-name); input_report_key(info-idev,BTN_TOUCH,pressure); /- input_report_abs(info-idev, ABS_PRESSURE, pressure); input_sync(info-idev); 在函数 static int stmp3xxx_ts_probe中:idev-name = STMP3XXX touchscreen; idev-evbit0 = BIT(EV_ABS); /- 添加/idev-absbit0 = BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE); idev-evbit0 = BIT(EV_ABS)|BIT(EV_SYN)|BIT(EV_KEY); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 5 页 - - - - - - - - - idev-absbit0 = BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) | BIT_MASK(ABS_PRESSURE); /- input_set_abs_params(idev, ABS_X, 0, 0 xFFF, 0, 0); input_set_abs_params(idev, ABS_Y, 0, 0 xFFF, 0, 0); input_set_abs_params(idev, ABS_PRESSURE, 0, 1, 0, 0); 4. 触摸屏终于有反应了,但是很不准确原因:触摸屏没有校准解决:由于android没有校准程序,于是我在底层驱动中添加校准程序,而手动校准计算坐标不仅烦琐耍且不准。于是我们在经历手动计算系数失败后决定用开发板上自带的校准程序获得校准系数。在原来的系统上运行ts_calibrate,分别点击相应的五点后,得到rootstmp378x:# ts_calibrate xres = 320, yres = 240 Took 6 samples. Top left : X = 1134 Y = 951 Took 7 samples. Top right : X = 1089 Y = 3363 Took 5 samples. Bot right : X = 3224 Y = 3426 Took 15 samples. Bot left : X = 3262 Y = 954 Took 11 samples. Center : X = 2200 Y = 2171 -32.639893 -0.001396 0.090053 -25.675720 0.065658 0.001115 Calibration constants: -2139088 -91 5901 -1682684 4302 73 65536 于是我们得到ABS_Y=(-2139088-91*x+5901*y)16 ABS_X=(-1682684+4302x+73*y)16 注意,由于”/ ”运算的效率很低,故将”/65536 ”改为” 16”. 在 linux-2.6.28/drivers/input/touchscreen/stmp3xxx_ts.c中input_report_abs(info-idev, ABS_X, info-x); input_report_abs(info-idev, ABS_Y, info-y); 改为:input_report_abs(info-idev, ABS_X,(-2139088-91*info-x+5901*info-y)16); input_report_abs(info-idev, ABS_Y,(-1682684+4302info-x+73*info-y)16); but,however,still not work.My heart is broken. 这个还没有做好,以后再慢慢研究下。九、运行apk 程序#cp VideoPlayer_Release3.apk /data/app/ #cd /data/app #chmod 644 VideoPlayer_Release3.apk #chown system.system VideoPlayer_Release3.apk #exit ok 可以程序 里面看到 VideoPlayer_Release3播放器了名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 5 页 - - - - - - - - -