【背景说明】:
(1)本文档主要介绍,如何将AVS官方公版demo sampleapp跑在Android设备上。
(2)AVS SDK和SampleApp源码是c++的,暂无其它语言版本的SDK和SampleApp。如果需要跑在Android设备上,需要通过编译将SampleApp在Android设备上运行起来。
(3)本文档主要基于Ubuntu 18.04版本的环境进行编译调试。
(4)本文档主要记录根据官方文档编译过程中趟过的一些坑。
(5)文档中的链接如果无法打开,请自行解决。
【编译流程】:
- setup0:AVS账号注册和产品创建
这一步没什么难度,按官方文档介绍,一步一步操作即可。
官方文档:https://developer.amazon.com/en-US/docs/alexa/alexa-voice-service/register-a-product-with-avs.html
- setup1:编译环境搭建
(1)安装Android SDK,目前为止(2022/08/30),AVS支持的Android版本为:Android API level 23(Android 6.0) - Android API level 29(Android 10.0)
Android SDK官方链接:https://developer.android.com/studio#comand-tools
请选择对应版本下载安装,也可以通过Android studio 的SDK manager进行安装。
(2)安装NDK,版本:r16及以上版本
NDK官方链接:https://developer.android.com/ndk/downloads
请选择对应平台的版本下载安装。
(3)安装Android SDK Build-Tools
可以通过Android studio 的SDK manager进行安装
(4)设置Android环境变量:根据实际安装目录修改下面路径
export PATH=$PATH:/Android/sdk/platform-tools:/Android/sdk/tools:~/Android/sdk/tools/bin
(5)安装cmake:3.1版本以上
可以通过命令行安装sudo apt-get install cmake,也可以通过Android studio 的SDK manager进行安装。
(6)安装AVS依赖包autoconfig automake libtool pkg-config
sudo apt-get install autoconf automake libtool pkg-config
(7)安装adb调试工具
- setup2:下载AVS SDK配置脚本
wget https://raw.githubusercontent.com/alexa/avs-device-sdk/master/tools/Install/androidConfig.txt
wget https://raw.githubusercontent.com/alexa/avs-device-sdk/master/tools/Install/setup.sh
wget https://raw.githubusercontent.com/alexa/avs-device-sdk/master/tools/Install/genConfig.sh
wget https://raw.githubusercontent.com/alexa/avs-device-sdk/master/tools/Install/android.sh
【说明】:
(1)如果wget指令不可用,请提前安装指令包:sudo apt-get install -y wget
(2)坑1,https://raw.githubusercontent.com/域名已不可用,请修改为:wget https://raw.github.com/
(3)坑2,如果域名https://raw.github.com/连接不上,请在系统的host文件中添加该域名对应的ip地址。
查询域名对应的ip地址:https://www.ipaddress.com
然后将对应的ip地址和域名添加到/etc/hosts文件中
- setup3:修改配置文件:修改androidConfig.txt配置文件,请根据Android设备的实际参数填写
image.png
【说明】:
(1)坑1:官方文档上说TARGET_SYSTEM参数接收的值是:arm,x86,arm64,x86_64.实际按上述配置后,可以编译成功。但是在设备中执行启动脚本后,sampleapp无法运行。会报SamleApp不存在,但是实际上目录下面是有这个文件的。仅根据错误提示,完全不知道什么原因。这是个天坑,一般情况下,可能在这里就走不下去了。
解决办法:执行命令查询设备cpu架构:adb shell getprop ro.product.cpu.abi,将查询到的值armeabi-v7a写到TARGET_SYSTEM字段。
(2)坑2:DEVICE_INSTALL_PATH字段,是指sampleapp在Android设备上的安装目录,要保证Android设备可root,且该目录需要有读写权限和可执行权限。这里有个坑,一般情况下,都会将该目录指定到/sacrd/目录下,且执行了chmod 777,但是在实际运行过程中,还是会报没有权限。这个是Android系统的一个坑,虽然sdcard目录通过chmod修改目录已经具体了执行权限,但是实际还是不行。
解决办法:将应用目录修改到/data/目录,如:/data/alexa/,然后执行chmod 777 /data/alexa/
- setup4:执行setup.sh脚本,下载AVS SDK源码,并编译。
【说明】:脚本:bash setup.sh config.json -a androidConfig.txt -s 998987
(1)-s参数:DSN,设备序列号,数字字符串,可以随便写,默认123456
(2)坑1:config.json文件,查遍整个官方文档,也没找到config.json文件,也不清楚这个文件从哪里来。网上关于这个文件的信息也很少,只知道这个文件是个json文件,里面需要包括clientId和prductId。如果自己手动创建这个文件,且文件中简单的按json格式写入这两个值,则在后续编译过程中会报错。因为实际脚本中使用的参数不仅仅只有这两个,还有PCKS相关的参数。
解决办法:
办法1:通过分析脚本和AVS SDK源码可以发现,在AVS SDK源码中avs-device-sdk/Integration/目录下有个AlexaClientSDKConfig.json文件,这个文件里面包含全部的参数。所以我们可以先手动将AVS SDK的源码下载下来(按正常流程,执行setup.sh脚本时,会自动下载avs sdk源码),然后将AlexaClientSDKConfig.json文件copy出来,放在setup.sh同一级目录下,然后将文件名修改为config.json
办法2:将AlexaClientSDKConfig.json文件copy到setup.sh同一级目录,可以不修改文件名,但是需要修改setup.sh和genconfig.sh脚本中的参数,将config.json的地方统一修改为AlexaClientSDKConfig.json
推荐使用办法1。
(3)坑2:由于github协议的修改,setup.sh中CLONE_URL需要修改为https://github.com/alexa/avs-device-sdk.git
(4)坑3:在编译过程中,报错:
configure: error: in /Users/jdoe/dev/126_android/debug/android-30/arm64-v8a/libarchive': configure: error: **Missing xml2 library** See
config.log' for more details
解决办法:
进入到avs-device-sdk/tools/Install目录,打开android.sh文件。在文件中搜索Build libarchive。在第 626 行下方,即在文件中--prefix="${INSTALL_TARGET}" \添加该行--without-xml2 \。
(5)坑4,编译过程报错:PKCS11 parameters are not specified. Hardware security module integration is disabled. 关于PKCS相关参数的配置,在官方文档的编译流程中,没有提起任何相关信息。但是通过仔细阅读编译脚本后发现,在编译脚本中,是必须有PKCS11相关的参数的,且该参数也需要配置在config.json文件中。
关于PKCS11和SoftHSM加密认证,是AVS SDK 1.26版本以后新增加的对硬件设备的安全要求。但是从官方文档上看,该安全要求只是要求Ubuntu、Raspberry PI、macOS 或 Windows设备,没有提到Android设备。但是实际编译,Android设备也需要。
PKCS11和SoftHSM的安装及参数生成及验证调试,请参考文档:https://developer.amazon.com/ar-SA/docs/alexa/avs-device-sdk/hardware-security-module.html
按上述文档一步一步操作后,将参数配置到config.json文件中。
- setup5:运行SampleApp
【说明】:
(1)坑1,官方文档上写的通过运行startsample.bat文件来启动应用程序,.bat文件很明显是windows的脚本。不清楚是不是官方文档的疏忽。启动应用指令:bash startsample.sh
(6)坑2,脚本启动后,输入agree指令,在终端控制台上,会出现授权码,然后此时需要打开浏览器,输入授权URL,填入终端控制台上的授权码进行授权(如果链接无法打开或无法授权,请检查网络状态)。这里有个坑,在config.json文件中配置的clientId,一般会选择在AVS注册页面中产品页的clientId,如果配置这个clientId,在授权时会授权失败。在AVS注册的产品页面,有clientId的地方有很多,并且都不一样。且在Security Profile标签页,有多个不同针对不同平台的选项,且每个平台都会生成不同的clientId。正常情况下,如果跑在Android平台上,应该选择Android/Kindle选项卡,并生成对应的参数。经过尝试,在Android/Kindle选项卡中,要填的生成参数很多,包括包名,MD5值,SHA256值,但是这里会发现,amazon要求填写的SHA256值的位数和Andoid应用实际的SHA256值的位数是不一样的,并且这里生成的是APIKEY。但是config.json中需要填写的是clientId。接着尝试,选择Web选项卡下的clientId进行授权,发现还是会授权失败。最后选择Other devices and plaforms选项卡,按官方文档说明,该选项卡是针对树莓派的硬件的,如果使用Android设备调试,怎么也不会选择这个选项卡的参数。但是坑就在这里,实际在Android设备上授权的参数clientId必须要填这个选项卡下的参数,才会授权成功。
至此,sampleapp编译成功,且可以在Android设备上运行起来了。通过指令可以正常语音交互。
【目前存在的问题】:
1.编译完成的AVS Android sampleapp不是apk文件,而是Linux可执行文件(ELF文件)。
2.官方AVS sampleapp自2021年9月份之后,demo中不再包括唤醒模块。
3.目前sampleapp只能通过adb指令启动和交互。暂不支持直接唤醒。
4.sampleapp目前支持的功能包括:天气,日历,计算器,闹钟,闲聊,百科,笑话,故事等。
5.音视频等媒体资源需要对接海外第三方媒体,sampleapp暂不支持。
6.sampleapp暂无UI交互。