您的位置:首页 > 移动开发 > Android开发

全志android平台下的SDK快速移植

2018-02-01 11:20 1266 查看

分享一下 全志平台的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 [/b]
目录下创建资源文件
在 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: