【背景說明】:
(1)本文檔主要介紹,如何將AVS官方公版demo sampleapp跑在Android設備上。
(2)AVS SDK和SampleApp源碼是c++的,暫無其它語言版本的SDK和SampleApp。如果需要跑在Android設備上,需要通過編譯將SampleApp在Android設備上運行起來。
(3)本文檔主要基于Ubuntu 18.04版本的環(huán)境進行編譯調試。
(4)本文檔主要記錄根據官方文檔編譯過程中趟過的一些坑。
(5)文檔中的鏈接如果無法打開,請自行解決。
【編譯流程】:
- setup0:AVS賬號注冊和產品創(chuàng)建
這一步沒什么難度,按官方文檔介紹,一步一步操作即可。
官方文檔:https://developer.amazon.com/en-US/docs/alexa/alexa-voice-service/register-a-product-with-avs.html
- setup1:編譯環(huán)境搭建
(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環(huán)境變量:根據實際安裝目錄修改下面路徑
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指令不可用,請?zhí)崆鞍惭b指令包:sudo apt-get install -y wget
(2)坑1,https://raw.githubusercontent.com/域名已不可用,請修改為:wget https://raw.github.com/
(3)坑2,如果域名https://raw.github.com/連接不上,請在系統(tǒng)的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.實際按上述配置后,可以編譯成功。但是在設備中執(zhí)行啟動腳本后,sampleapp無法運行。會報SamleApp不存在,但是實際上目錄下面是有這個文件的。僅根據錯誤提示,完全不知道什么原因。這是個天坑,一般情況下,可能在這里就走不下去了。
解決辦法:執(zhí)行命令查詢設備cpu架構:adb shell getprop ro.product.cpu.abi,將查詢到的值armeabi-v7a寫到TARGET_SYSTEM字段。
(2)坑2:DEVICE_INSTALL_PATH字段,是指sampleapp在Android設備上的安裝目錄,要保證Android設備可root,且該目錄需要有讀寫權限和可執(zhí)行權限。這里有個坑,一般情況下,都會將該目錄指定到/sacrd/目錄下,且執(zhí)行了chmod 777,但是在實際運行過程中,還是會報沒有權限。這個是Android系統(tǒng)的一個坑,雖然sdcard目錄通過chmod修改目錄已經具體了執(zhí)行權限,但是實際還是不行。
解決辦法:將應用目錄修改到/data/目錄,如:/data/alexa/,然后執(zhí)行chmod 777 /data/alexa/
- setup4:執(zhí)行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。如果自己手動創(chuàng)建這個文件,且文件中簡單的按json格式寫入這兩個值,則在后續(xù)編譯過程中會報錯。因為實際腳本中使用的參數不僅僅只有這兩個,還有PCKS相關的參數。
解決辦法:
辦法1:通過分析腳本和AVS SDK源碼可以發(fā)現,在AVS SDK源碼中avs-device-sdk/Integration/目錄下有個AlexaClientSDKConfig.json文件,這個文件里面包含全部的參數。所以我們可以先手動將AVS SDK的源碼下載下來(按正常流程,執(zhí)行setup.sh腳本時,會自動下載avs sdk源碼),然后將AlexaClientSDKConfig.json文件copy出來,放在setup.sh同一級目錄下,然后將文件名修改為config.json
辦法2:將AlexaClientSDKConfig.json文件copy到setup.sh同一級目錄,可以不修改文件名,但是需要修改setup.sh和genconfig.sh腳本中的參數,將config.json的地方統(tǒng)一修改為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** Seeconfig.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相關參數的配置,在官方文檔的編譯流程中,沒有提起任何相關信息。但是通過仔細閱讀編譯腳本后發(fā)現,在編譯腳本中,是必須有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,填入終端控制臺上的授權碼進行授權(如果鏈接無法打開或無法授權,請檢查網絡狀態(tài))。這里有個坑,在config.json文件中配置的clientId,一般會選擇在AVS注冊頁面中產品頁的clientId,如果配置這個clientId,在授權時會授權失敗。在AVS注冊的產品頁面,有clientId的地方有很多,并且都不一樣。且在Security Profile標簽頁,有多個不同針對不同平臺的選項,且每個平臺都會生成不同的clientId。正常情況下,如果跑在Android平臺上,應該選擇Android/Kindle選項卡,并生成對應的參數。經過嘗試,在Android/Kindle選項卡中,要填的生成參數很多,包括包名,MD5值,SHA256值,但是這里會發(fā)現,amazon要求填寫的SHA256值的位數和Andoid應用實際的SHA256值的位數是不一樣的,并且這里生成的是APIKEY。但是config.json中需要填寫的是clientId。接著嘗試,選擇Web選項卡下的clientId進行授權,發(fā)現還是會授權失敗。最后選擇Other devices and plaforms選項卡,按官方文檔說明,該選項卡是針對樹莓派的硬件的,如果使用Android設備調試,怎么也不會選擇這個選項卡的參數。但是坑就在這里,實際在Android設備上授權的參數clientId必須要填這個選項卡下的參數,才會授權成功。

至此,sampleapp編譯成功,且可以在Android設備上運行起來了。通過指令可以正常語音交互。
【目前存在的問題】:
1.編譯完成的AVS Android sampleapp不是apk文件,而是Linux可執(zhí)行文件(ELF文件)。
2.官方AVS sampleapp自2021年9月份之后,demo中不再包括喚醒模塊。
3.目前sampleapp只能通過adb指令啟動和交互。暫不支持直接喚醒。
4.sampleapp目前支持的功能包括:天氣,日歷,計算器,鬧鐘,閑聊,百科,笑話,故事等。
5.音視頻等媒體資源需要對接海外第三方媒體,sampleapp暫不支持。
6.sampleapp暫無UI交互。
