分享一下 全志平台的SDK移植过程:

第 5 页 共 18 页
1. 概述
T3 平台快速移植文档,本文基于 T3 T3-P1 方案。
1.1. 名词解释
1. vendor-name
softwinner
2. device-name
T3-p1
3. product-name
T3_p1
第 6 页 共 18 页
2. 方案定制
方案目录 device/vendor-name/device-name/
2.1. overlay 说明
Android overlay 机制允许在不修改 apk 或者 framework 源代码的情况下,实现资源的定制。
以下几类能够通过 overlay 机制定义:
1. Configurations (string, bool, bool-array)
2. Localization (string, string-array)
3. UI Appearance (color, drawable, layout, style, theme, animation)
4. Raw resources (audio, video, xml)
更详细的资源文件可浏览 android 网站:
http://developer.android.com/guide/topics/resources/available-resources.html
2.1.1. 为产品添加 Overlay 目录
有两种不同的 overlay 目录定义:
1. PRODUCT_PACKAGE_OVERLAYS
用于指定产品
2. DEVICE_PACKAGE_OVERLAYS
用于同一设备模型的一系列产品
如果包含同一资源,那么 PRODUCT_PACKAGE_OVERLAYS 将覆盖
DEVICE_PACKAGE_OVERLAYS 。如果要定义多个 overlays 目录,需要用空格隔开,同一资源的
定义,将使用先定义的目录中的资源。
在方案目录下创建 overlay 和 product-name/overlay 目录, 分别用于 device 通用及 product 使用的
overlay 文件夹。
2.1.2. 改变 mk 文件来添加 overlays 的编译项
在文件 device/vendor-name/device-name/product-name.mk 中添加:
PRODUCT_PACKAGE_OVERLAYS := \
device/vendor-name/device-name/product-name/overlay \
$(PRODUCT_PACKAGE_OVERLAYS)
DEVICE_PACKAGE_OVERLAYS := \
device/vendor-name/device-name/overlay \
$(DEVICE_PACKAGE_OVERLAYS)
注:
必须加上 $(PRODUCT_PACKAGE_OVERLAYS) 变量否则将找不到默认资源。
第 7 页 共 18 页
2.1.3.overlay 目录下创建资源文件
在 overlay 目录下创建和要替换资源所在文件相同的路径的文件,此路径是相对于 android
platform 目录。如替换 framework-res 路径为: platform/framework/base/core/res/res/value/config.xml
中的某一项,则在 overlay 中创建对应的路径: overlay/framework/base/core/res/res/value/config.xml 并
添加要修改的一向配置,如:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<integer name="config_multiuserMaximumUsers">0</integer>
</resources>
2.2. 预装 APK
预装 apk 安装有两种方法,可以安装到 system/app 目录下,也可以安装到 system/preinstall 或
system/precopy 目录下。注: apk 名字不能含有中文、空格等特殊字符。
2.2.1. 默认预装 APK

APK 说明
FileExplore 文件管理器
Update OTA 升级
Gallery2D 视频播放器
M-ADAS ADAS 测试 APK

由于涉及版权问题,建议不安装 GAPP 应用, GMS 需安装 Google 提供的正版 GAPP 应用。
2.2.2. 预装到 system/app 目录
1. 将 apk 使用 winrar 打开,将 lib/armeabi 下的 so 库解压到 device/vendor-name/common/prebuild/lib/
目录中中,并在同目录的 Android.mk 文件中加入:
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_PREBUILT_LIBS := libjni1.so libjni2.so ( so 库的文件名,建议将同一 apk 的 so 库写在一起,
空格隔开;编译系统会根据文件名自动生成模块名,如对应的: libjni1 和 libjni2 )
include $(BUILD_MULTI_PREBUILT)
2. 将 apk 放入 device/vendor-name/common/prebuild/apk/ 目录中,并且在同目录的 Android.mk 文件中
加入:
include $(CLEAR_VARS)
LOCAL_MODULE := APK_MODULE_NAME (模块的唯一名字)
LOCAL_MODULE_TAGS := optional
LOCAL_OVERRIDES_PACKAGES := OVERRIDES_MODULE (要替代的模块)
第 8 页 共 18 页
LOCAL_SRC_FILES := name.apk (同目录下 apk 的文件名)
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_REQUIRED_MODULES := libjni1 libjni2 ( apk 包含的 so 库的模块名,多个可用空格隔开)
include $(BUILD_PREBUILT)
3. 在方案 mk 文件( device/vendor-name/device-name/product-name.mk )中 PRODUCT_PACKAGES
项中加入:
PRODUCT_PACKAGES += APK_MODULE_NAME ( apk 模块名字,预装多个 apk 用空格隔开)
2.3. 修改启动 LOGO
启动 LOGO 为初始引导阶段的 LOGO 。
将启动 logo 放入位置: lichee/tools/pack/chips/sunxi/configs/device-name/bootlogo.bmp
2.4. 修改启动动画
将动画放入: device/vendor-name/device-name/media/bootanimation.zip
bootanimation 格式: bootanimation.zip 包含 part0 part1 文件夹和 desc.txt 文件, part0 , part1 文
件夹里面放的是动画拆分的图片,格式为 png 或 jpg 。 desc.txt 文件内容如下:
800 480 15
p 1 0 part0
p 0 0 part1
说明:
第一行: 800 为宽度, 480 为高度, 15 为帧数。第二行开始 p 为标志符,接下来第二列为循环
次数(0为无限循环),第三项为两次循环之间间隔的帧数,第四项为对应的目录名。播放动画时会
按照图片文件名顺序自动播放。
打包格式要求:
windows 使用 winrar 打包,选择 ZIP 格式,压缩标准要选“储存”; linux 下, zip -0
-r ../bootanimation.zip ./* linux 命令使用 -0 指定压缩等级为最低等级 stored ,即只归档不压缩,否则可
能由于包格式问题引起动画显示为黑屏。打包完之后修改其权限值: chmod 777 bootanimation.zip
2.5. 定制 recovery 功能
Recovery 是 Android 的专用升级模式,用于对 android 自身进行更新;进入 recovery 模式的方法
是,在 android 系统开机时,按住一个特定按键,则会自动进入 android 的 recovery 模式。
2.5.1. 键值的查看
按键是通过 AD 转换的原理制成。当用户按下某个按键的时候,会得到这个按键对应的 AD 转
换的值。同时,所有的按键的键值都不相同,并且,键值之间都有一定的间隔,没有相邻。比如,
键值可能是 5,10,15,20 ,但是不可能是 5,11,12,13 。
为了方便用户查看不同按键的键值,这种方法要求连接上串口使用,因此适合于开发阶段使用。
具体步骤是:
第 9 页 共 18 页
把小机和 PC 通过串口线连接起来,设置屏幕焦点在串口调试软件上;用户开机之前,按住 PC
键盘上的数字键“ 3 ”;开机,等待, 1 秒后可以松开电脑键盘;经过这样的步骤,用户会看到屏幕
上有如下的打印信息出现:
welcome to key value test
press any key, and the value would be printed
press power key to exit
这表示系统已经进入了按键的键值测试模式,这种模式下将一直等待用户按下按键,并在串口
屏幕上把按键的键值打印出。这样,用户可以很方便地查看不同按键的键值。比如,当按下某一个
按键,用户可以看到如下的打印信息。
key value = 8
key value = 8
key value = 8
key value = 63
由于 AD 采用的速度非常快,所以同一个按键按下,屏幕上会出现多个值。用户可以看出,这
个按键的键值是 8 。最后出现的 63 是松开按键的时候的采用,是需要去掉的干扰数据。因此,用户
查看按键键值的时候只要关注前面打印出的数值,后面出现的应该忽略不计。
2.5.2. 按键选择
通常情况下,一块方案板上的按键个数不同,或者排列不同,这都导致了方案商在选择作为开
机阶段 recovery 功能的按键有所不同。因此,系统中提供了一种方法用于选择进入 recovery 模式的
按键:
在 efex\sys_config.fex 配置脚本中,提供了一项配置,用于选择按键的键值,如下所示:
[recovery_key]
key_max = 4
key_min = 6
它表示,所选择用于作为 recovery 功能的按键的键值范围落在 key_min 到 key_max 之间,即 4
到 6 之间。由于所有按键的选择都可以通过前面介绍的方法查看,因此,假设用户要选的按键是 a ,
用户这里选择配置的方法是:
按照前面介绍的方法,读出所有按键的键值;
读出 a 的键值 a1 ,同时取出两个相邻于 a 的键值,记为 b1 和 c1 , b1>c1 ;
计算出 (a1 + b1)/2 , (a1 + c1)/2 ,分别填写到 key_max 和 key_min 处;
如果 a1 刚好是所有按键的最小值,则取 key_min 为 0 ;如果 a1 刚好是所有按键的最大值,则取
key_max 为 63 ;
经过以上的步骤,就可以选择一个特定的按键进入 recovery 模式。取了一个平均值的原因是考
虑到长时间的使用,电阻的阻值可能会略有变化导致键值变化,取范围值就可以兼容这种阻值变化
带来的键值变化。
2.5.3. 功能使用
在 android 编译完毕之后,使用如下命令
$ get_uboot
$ make otapackage
第 10 页 共 18 页
就可以在 platform/out/target/product/device-name/ 目录下生成一个 product-name-ota-buildtime.zip
文件。在系统启动时,按住设定的特定按键进入 recovery 模式,进入该模式后,可以选择升级文件
升级。
第 11 页 共 18 页
3. 模块配置
3.1. 自定义按键配置
3.1.1. KEY 的硬件原理
目前 KEY 检测使用了 ADC 转换的原理实现的,由于该原理的限制,所以不能区分组合键(功
能键,不包括电源键);按照目前公版原理图, 0.2V 的电压变化可以区分一档,所以最多可以实现
10 个键,硬件原理如下:
3.1.2. 驱动与硬件对应的关系
Key 的驱动实现文件位置: linux-3.10/drivers/input/keyboard/sunxi-keyboard.c
实现原理:通过检测电压值的数字量来区分当前是第几个按键:
//0.2V mode
43 static unsigned char keypad_mapindex[64] = {

44 0,0,0,0,0,0,0,0,0, /* key 1, 0-8 */
45 1,1,1,1,1, /* key 2, 9-13 */
46 2,2,2,2,2,2, /* key 3, 14-19 */
47 3,3,3,3,3,3, /* key 4, 20-25 */
48 4,4,4,4,4,4,4,4,4,4,4, /* key 5, 26-36 */
49 5,5,5,5,5,5,5,5,5,5,5, /* key 6, 37-39 */
50 6,6,6,6,6,6,6,6,6, /* key 7, 40-49 */
51 7,7,7,7,7,7,7 /* key 8, 50-63 */

52 };
按键对应的键值由 device tree 定义:
第 12 页 共 18 页
static unsigned int sw_scankeycodes[KEY_MAX_CNT] ;
keyboard0:keyboard{
compatible = "allwinner,keyboard_2000mv";
reg = <0x0 0x01c24400 0x0 0x400>;
interrupts = <GIC_SPI 31 IRQ_TYPE_NONE>;
status = "okay";
key_cnt = <5>;
key1 = <240 115>;
key2 = <500 114>;
key3 = <700 139>;
key4 = <890 28>;
key5 = <2000 102>;
};
当有按键事件时,通过以上两次映射将最终的键值上报:
scancode = keypad_mapindex[key_val&0x3f];
input_report_key(swkbd_dev, sw_scankeycodes[scancode], 1);
input_sync(swkbd_dev);
3.1.3. Android 按键功能的映射
映射文件为 device/vendor-name/device-name/configs/sunxi-keyboard.kl :
key 114 VOLUME_UP
key 139 VOLUME_DOWN
key 后面的数字为驱动中上报的键值,后面为对应的功能,自定义按键时仅需要将前面的映射
值和后面的功能对应起来即可。(附件列, WAKE_DROPPED : 唤醒屏幕,但是这个按键不会发给
当前应用程序, WAKE :唤醒屏幕,但是这个按键需要发送给应用程序,后面不加的代表没有唤醒
功能)
4. Settings 设置
4.1. 默认 LCD 关闭时间设置
platform/frameworks/base/packages/SettingsProvider/res/values/defaults.xml 中设置(单位为毫秒):
<integer name="def_screen_off_timeout">60000</integer>
注:可通过 overlay 方式修改,具体请参照 2.1overlay 说明。
4.2. 默认亮度设置
platform/frameworks/base/packages/SettingsProvider/res/values/defaults.xml 中设置,亮度值从 0~255 表
示 0%~100% ,如设置 102 则默认亮度为 40% ,示例如下:
<integer name="def_screen_brightness">102</integer>
第 13 页 共 18 页
注:可通过 overlay 方式修改,具体请参照 2.1overlay 说明。
4.3. 默认字体大小设置
系统字体由 fontScale 来控制缩放,设置菜单中的小,普通,大,超大分别对应的 fontScale 为 0.85 、
1.0 、 1.15 、 1.3 ,修改默认字体大小可在 device/vendor-name/device-name/product-name.mk 中设置
ro.font.scale 的值来设置默认的字体大小。如:
PRODUCT_PROPERTY_OVERRIDES += \
ro.font.scale=1.15
注:建议采用默认设置,即 ro.font.scale=1.0 ,过 CTS 默认必须是 1.0 。
4.4. 蓝牙选项设置
device/vendor-name/device-name/product-name.mk ,添加以下信息:
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.bluetooth.xml:system/etc/permis
sions/android.hardware.bluetooth.xml
即可打开蓝牙选项。
5. 代码编译
5.1. 建立环境 :
$ tar xvfz lichee.tar.gz
$ tar xvfz android.tar.gz
$ cp lichee/buildroot/script/top_build.sh ./build.sh
5.2.Lichee 编译:
$ ./build.sh config
Welcome to mkscript setup progress
All available chips:
0. sun50iw1p1
1. sun50iw2p1
2. sun8iw10p1
3. sun8iw11p1
4. sun8iw1p1
5. sun8iw3p1
6. sun8iw5p1
7. sun8iw6p1
8. sun8iw7p1
第 14 页 共 18 页
9. sun8iw8p1
10. sun8iw9p1
11. sun9iw1p1
Choice: 3
All available platforms:
0. android
1. dragonboard
2. linux
3. camdroid
Choice: 0
All available kernel:
0. linux-3.10
Choice: 0
All available boards:
0. t3-p3
Choice: 0
$ ./build.sh
5.3.Android 编译:
$ source build/envsetup.sh
$ lunch 17 (t3_p3)
$ extract-bsp
$ make -j32 && pack
5.4. 烧写:
6. 方案配置:
6.1. 配置组成:
配置方案主要由以下 3 个部分组成:
LINUX 内核编译配置: lichee/linux-3.10/arch/arm/configs/sun8iw11p1smp_android_defconfig
Android 方案配置包: android/device/softwinner/t3-xx
Tools 打包配置包: lichee/tools/pack/chips/sun8iw11p1/configs/android/t3-xx/sys_config.fex
6.2. 标案参考:
第 15 页 共 18 页
T3-p1: 标案 EVB 板的配置参考
T3-p2: 客户板方案配置
6.3.Android 新方案的配置
$ cd android/device/softwinner
$ cp -rf t3-p1 t3-xxx # 复制一份基础配置,如以 p1 方案为原型
$ cd t3-xxx
$ rm -rf .git modules kernel # 删除原有的 .git , modules 目录及 kernel 文件
$ mv t3_p1.mk t3_xxx.mk # 修改 makefile 文件名
$ git init # 创建本目录的 git 仓库
$ git add * -f # 添加当前目录的所有文件
$ find . -type f | xargs sed -i 's/t3-p1/t3-xxx/g' # 替换文件中的 p1 字符串
$ find . -type f | xargs sed -i 's/t3_p1/t3_xxx/g' # 替换文件中的 p1 字符串
$ git diff # 通过 git 来查看替换字符串后的执行效果
$ git add -u # update 所有 tracked 的文件
$ git commit -m "init version for project xxx" # 第一次提交,记录初始版本
6.4.tools 配置
$ cp -rf lichee/tools/pack/chips/sun8iw11p1/configs/android/t3-p1
lichee/tools/pack/chips/sun8iw11p1/configs/android/t3-xxx
注:生成的配置需要根据各自方案的实际情况进行更新
第 16 页 共 18 页
7. Launcher 及界面设置
7.1. 默认壁纸设置
替换文件 platform/frameworks/base/core/core/res/drawable-swxxxdp-nodpi/default_wallpaper.jpg ,
可通过 overlay 方式将文件放在 device/vendor-name/device-name/platform/frameworks/base/core/core/
res/drawable-swxxxdp-nodpi/default_wallpaper.jpg 。
7.2. 添加壁纸
准备壁纸及壁纸的缩略图放进壁纸存放目录
platform/packages/apps/Launcher2/res/drawable-swxxxdp-nodpi ,并按照文件夹内文件命名,分别为
wallpaper_xxx.jpg 与 wallpaper_xxx_small.jpg
在 platform/packages/apps/Launcher2/res/values-swxxxdp/wallpapers.xml 中添加该壁纸索引,如下:
<resources>
<string-array name="wallpapers" translatable="false">
<item>wallpaper_00</item>
<item>wallpaper_01</item>
……
<item>wallpaper_10</item>
<item> wallpaper_xxx </item>
</string-array>
</resources>
注:可通过 overlay 方式修改,具体请参照 2.1overlay 说明。
8. 系统调试
8.1. 生成 debug 固件
Android 编译时使用 pack -d 即可生成 debug 固件,该固件将串口引入卡口打印出来,配合配套
的工具即可实时查看 log 信息。
8.2. 使用 fastboot
8.2.1.
进入 fastboot 模式
系 统 SDK 中 默 认 方 式 是 无 法 进 入 fastboot 的 , 如 果 在 调 试 中 想 要 进 入 fastboot 可 以 修 改
lichee/tools/pack/chips/sunxi/configs/default/env.cfg 文件中的 bootdelay 的值为非零值即可,单位为秒,
该值影响启动内核前的等待时间,在该等待时间内从串口输入任意字符即可进入 uboot 命令环境。
按照如下步骤操作:
1. 修改 lichee/tools/pack/chips/sunxi/configs/default/env.cfg 中的 bootdelay=3
第 17 页 共 18 页
2. 启动倒计时输入任意字符进入 uboot ,然后输入 fastboot 命令即进入 fastboot 模式
3. 在 PC 端执行 fastboot 命令即可进行 fastboot 操作
4. 小机端 Ctrl+C 可退出 fastboot 模式
8.2.2. fastboot 常用命令
usage: fastboot [ <option> ] <command>
commands:
update <filename> reflash device from update.zip
flash <partition> [ <filename> ] write a file to a flash partition
erase <partition> erase a flash partition
format <partition> format a flash partition
help show this help message

全志android平台下的SDK快速移植相关推荐

  1. android平台下OpenGL ES 3.0绘制纯色背景

    OpenGL ES 3.0学习实践 android平台下OpenGL ES 3.0从零开始 android平台下OpenGL ES 3.0绘制纯色背景 android平台下OpenGL ES 3.0绘 ...

  2. Android平台下的StreamingAsset路径

    Android平台下的StreamingAsset路径 这两天给一个游戏做移植的时候,踩了一个巨大的坑(准确的说是被源码坑了):Android平台下不要通过FILE访问StreamAsset! 游戏刷 ...

  3. android平台下,淘宝客户端开发之——登陆

    android平台下,淘宝客户端开发之--登陆 本文来自:http://hi.baidu.com/lynn_wong/blog/item/da5322c31a4f962ee5dd3b29.html 1 ...

  4. ffmpeg实战教程(八)Android平台下AVfilter 实现水印,滤镜等特效功能

    ffmpeg实战教程(八)Android平台下AVfilter 实现水印,滤镜等特效功能 ffmpeg实战教程(七)Android CMake avi解码后SurfaceView显示 本篇我们在此基础 ...

  5. android平台下OpenGL ES 3.0给图片添加黑白滤镜

    OpenGL ES 3.0学习实践 android平台下OpenGL ES 3.0从零开始 android平台下OpenGL ES 3.0绘制纯色背景 android平台下OpenGL ES 3.0绘 ...

  6. android平台下OpenGL ES 3.0绘制圆点、直线和三角形

    OpenGL ES 3.0学习实践 android平台下OpenGL ES 3.0从零开始 android平台下OpenGL ES 3.0绘制纯色背景 android平台下OpenGL ES 3.0绘 ...

  7. android平台下OpenGL ES 3.0从零开始

    OpenGL ES 3.0学习实践 android平台下OpenGL ES 3.0从零开始 android平台下OpenGL ES 3.0绘制纯色背景 android平台下OpenGL ES 3.0绘 ...

  8. android平台下OpenGL ES 3.0使用GLSurfaceView对相机Camera预览实时处理

    OpenGL ES 3.0学习实践 android平台下OpenGL ES 3.0从零开始 android平台下OpenGL ES 3.0绘制纯色背景 android平台下OpenGL ES 3.0绘 ...

  9. android平台下OpenGL ES 3.0实例详解顶点属性、顶点数组

    OpenGL ES 3.0学习实践 android平台下OpenGL ES 3.0从零开始 android平台下OpenGL ES 3.0绘制纯色背景 android平台下OpenGL ES 3.0绘 ...

最新文章

  1. mybaties插件生成代码
  2. 通过yumdownloader下载rpm包
  3. vector机器人 WAYS TO INTERACT WITH VECTOR 与 VECTOR 的交互方式
  4. 关于Synchronized研伸扩展
  5. GitHub 宣布正式收购 npm | 云原生生态周报 Vol. 42
  6. idea 执行 java jar_idea打包java可执行jar包的实现步骤
  7. 数据库中存储过程和触发器有什么异同?
  8. Echo:新生好看的一言网站源码
  9. Magento用的哪个php框架,初识magento框架代码目录
  10. 使用window自带的截图工具
  11. linux手动注入网络数据_Linux网络 - 数据包的接收过程【转】
  12. iphone开发工程师面试真题(又像c的)
  13. Vegas2020注册机
  14. 数据结构与算法分析题库
  15. dell进入u盘启动模式_Dell戴尔笔记本bios设置u盘启动详细步骤
  16. 华硕台式计算机光盘怎么启动不了,华硕怎么设置光盘启动_华硕怎么设置开机启动光驱...
  17. vue3使用swiper+animate.css动效
  18. yocto编译linux,好实用!用 Yocto 在 Ubuntu 上创建最小化 Linux 发行版
  19. 绘制CAD图纸的过程中CAD快捷键失灵了怎么办?
  20. 3. css-loader

热门文章

  1. Stanford cs140 Pintos Project2实验目标
  2. 4Ps营销理论(The Marketing Theory of 4Ps)
  3. 深圳软件测试培训:DOM中元素节点、属性节点、文本节点的理解
  4. 嵌入式系统工程师知识面的宽度、深度、高度
  5. Day02 Jinja2模板引擎Bootstrap
  6. R语言学习——安装R语言,安装RStudio
  7. 如何系统学习MySQL数据库?
  8. PyMC3中常见连续概率分布
  9. Poc/Exp漏洞验证利用脚本编写
  10. Quarkus 1.3.0.Final修复了Kubernetes本机Java堆栈中的错误