简介:
在 2015 年英特尔信息技术峰会上,首次以动手实验室的形式演示了实验说明,比如 “SFTL002: 动手实验室: 基于英特尔架构的移动设备开发研讨会 - Android* TV 专题”。本文在此提供实验说明作为参考,希望为广大的开发人员社区提供一些帮助。 演示者在实验之前构建了启动映像和相应的数据捕获驱动程序,但还是包含了如何执行两项任务的注意事项,尽管不是很详细。 不管我如何希望以下信息会对您有所帮助,只要有商用 Nexus Player 设备、运行 Ubuntu 的主机 PC、许可版英特尔 System Studio,以及针对公用参考网站的互联网接入,所有任务就都可以完成。 所使用的版本如下所示: Nexus Player: Build LMY47V(在设备上进行初始构建通常更加容易)、Ubuntu 14.04 LTS、ISS 2016-Beta 和 SoC Watch 2.0-Beta。
目录:
- Nexus Player 简介
- 恢复出厂映像
- 启动设备
- 运行性能分析
- 评论结果
- 安装其他驱动程序
- 重新运行分析并与之前的结果进行对比
- 运行 Energy Profiler 和 Power Analysis
- 构建启动设备所需的 boot.img
- 构建其他驱动程序
- 在主机上设置 Ubuntu 注意事项
启动 Nexus Player 并熟悉其用法
遥控器电池
插入连接设备与 PC 的 USB 线缆,以及连接设备与显示器的 HDMI 线缆,然后插入设备电源线。
首先,设备要求与远程同步,按照设备显示屏的指示按下遥控器上的左箭头和旋转键。
然后使用遥控器选择面向设备的语言和 Wi-Fi 网络
播放器需要通过 Wi-Fi 连接以无代理的形式访问互联网,才能继续。 支持一些基本的安全设置,但不是用户名/密码组合系统。
然后登录 Google 账户,您也可以登录自己的账户 — 为实验创建的虚拟 Gmail 帐户。
您可以查看 Google 服务条款或选择继续。
建议不要共享位置,但决定权在您。
在 PC 上打开命令提示窗口,查看 lsusb和 adb devices。 您会看到,设备尚未列出。
选择“设置”和“About”,然后向下滚动至 “Build” 并单击选择钮,直至收到消息 “You are now a Developer”,记下构建版本。 您需要构建 boot.img(在此步骤中)以匹配设备上的构建版本,或将设备闪存至与所需构建版本相匹配的出厂默认映像(按照此步骤)。 稍后提供更多相关内容。
现在退出设置菜单并再次返回,此时应该可以选择 “Preferences” 下方的 “Developer options”。
在 “Debugging” 下方将 “USB debugging” 设为 ON,这样会出现一个要求从 PC 系统访问的提示窗口。选中 “always allow this device” 并选择 OK。
在 PC 上重新运行 lsusb和 adb devices,现在您应该能够看到设备
如果需要,您可以旁加载部分应用,和/或拷贝一些影片,在设备上播放。 在实验室使用的是一些公共域 NASA 视频,另外 Google Play 商店还提供 VLC 播放器和 EC File Manager 应用。
adb push <filename>.mp4 /sdcard/Movies
adb install <filename>.apk(设备将提示需要进行验证)
请注意,由于设备没有 root,您可能看得到,也可能看不到视频文件的拷贝位置。
adb shell
ls /sdcard
ls /sdcard/Movies
但它们明确存在,并且可以使用(无法直接查看 Movies 目录,不过如果您知道目录,可以查看刚刚放在目录中的文件)
在设备上使用(刚安装的)文件管理器导航并查找文件
在设备上使用 VLC 播放器播放视频剪辑。
现在我们熟悉了设备、未 root 设备的局限性,以及如何应对这种未 root 设备
恢复出厂设置
访问以下网站,可直接通过 Google 获取面向 Nexus Player 的出厂恢复映像: https://developers.google.com/android/nexus/images
插入 Nexus Player(设备)以启动该设备,确保 HDMI 线缆连接显示器、USB 连接笔记本电脑、电源已通电
在主机上打开终端,导航至解压已下载映像的目录
运行 adb devices,确认设备已连接
通过 adb reboot bootloader启动至启动加载程序
也可以在初始启动期间按下设备底部的按钮。
禁用 oem lock,以借助 fastboot oem unlock 启用闪存。 如果失败,不必担心,再试一遍即可,有时需要尝试多次。
运行 ./flash-all.sh,将设备恢复至出厂映像 LMY47V
- 闪存启动程序后,设备将至少重启一次,之后闪存系统的其他部分。您可以在系统或设备显示屏上关注闪存进度。闪存完成时,设备将再次重启,并呈现出厂映像,就像是刚刚开箱的新设备!
启动设备
如果在启动设备之前尝试运行 VTune,尝试在设备上安装必要应用代码时,会收到一条错误消息。 尽管 VTune 通常在未 root 设备上也能运行并提供实用数据,但我在准备实验室时用过这种特殊设备,事实证明无法运行。 因此我们首先对设备进行 root。
在 PC 上导航至包含 boot.img (此处构建)的目录
运行adb reboot bootloader,等待设备重新启动至启动加载程序屏幕
运行fastboot oemunlock,如果成功,设备屏幕将更新 oem lock 状态。如果失败,无需担心,再试一次即可,有时需要尝试多次
我们为实验室准备的 boot.img 基于 lollipop 构建 LM47V,因此我们需要将设备更新至在该步骤中可行的构建版本。 如果其他构建需要 root,那么只需为相应的版本创建 boot.img 文件即可。 这是因为我们仅闪存了 boot.img 文件,它需要匹配构建版 system.img 以及此步骤中未更新的设备的其他组件。
运行fastboot flash boot boot.img,如果顺利完成,没有出现任何错误,那么继续,否则重试,只需花一到两秒。
这时,可以选择通过fastboot oem lock 重新锁定 oem lock,但没有必要。
运行fastboot continue,将设备重启至正常用户界面
大家会看到,启动屏幕上显示 “Google” 并有一个未锁定的小锁标识,之前屏幕上没有。 然后它将继续启动至正常 UI。
运行性能分析
运行adb root,确认启动已开始,并通过 adb 获取根访问
现在您可以adb shell至设备,并查看之前不可见的目录结构(比如 /data)
打开主机系统上的 VTune 放大器
运行/opt/intel/vtune_amplifier_for_system/bin64/amplxe-gui
在 “Welcome” 屏幕中选择 “New Project...”,或使用顶部菜单栏中的图标,或下拉菜单选择
输入项目名称,比如 “IDF_DemoLab”,将项目位置保留为缺省状态
在屏幕左侧(忽略 Project Navigator,如果愿意也可以关闭它)选择分析目标 “Android device (ADB)”
这时,设备会提示 “Verify apps?”,继续选择 Accept。
通过设备“######” 上 ADB,“Launch Application” 缺省值应可见(换言之,这时应自动检测 Nexus Player 是否存在)。将 “Launch Application” 改为 “Launch Android Package”
输入名称,或浏览之前安装的 VLC 播放器,选择 Package 名称。 “org.videolan.vlc”
为便于实验,我们限制数据捕获的长度
查看 “Automatically stop collection after (sec):” 并插入数值 30,这样 30 秒之后数据采集将自动停止。
让 “Automatically resume collection after (sec):” 复选框保持未选中状态和空白值。请注意,应用启动后,使用该选项将有助于您使用具体的秒数,在采集开始之前选择视频播放。就本实验室而言,继续保留空白值和未选中状态,以便我们分析用户行为和自动操作。
其他缺省选择应该可行,可尽情了解,熟悉更改选择后的状态。
选择 “Choose Analysis”,或选择 “Analysis Type” 选项卡,进入下一步。
注: "Choose Analysis"下方的 "Binary/Symbol Search"和 "Source Search"按钮用于为 VTune 提供符号和源代码信息,以在分析代码时生成更加实用的分析结果。 现在,您可以获取这些文件的目录信息,也可稍后通过访问项目属性或结果屏幕以及重新解析符号信息(另一按钮)来获取。
由于设备已完成 root,您将会看到,我们有针对不同分析(比如 “Basic Hotspots”、“Advanced Hotspots” 和 “General Exploration”)的选项
在本示例中我们选择 “Advanced Hotspots”
使用缺省值 1 作为 CPU 抽样间隔
选择 “Hotspots” 细节级别。请注意,尝试其他细节级别时,会出现一些告警消息,因为较高级别的驱动程序支持可启用较高级别的数据采集。
选中 “Analyze user tasks” 选项
取消选中 “Analyze GPU usage” ,因为本设备没有高清图形,并确保 “Analyze Processor Graphics hardware events:” 选项已设为 “None”
如果就绪,继续单击 “Start”
如果触发了设备屏保,单击遥控器回到主菜单,您会看到 “Waiting for debugger” 消息,然后 VLC 将启动。
在采集过程中,继续选择视频播放(推荐 “Earth Timelapse”)
30 秒后,VLC 将自动关闭,结果将从设备中提取至 VTune
这时您会看到采集日志屏幕中滚动大量告警,这是因为我们没有指定 VTune 在哪里为所有与在采集事件过程中运行的各代码片段相关的函数调用查找符号信息。
评论结果
在这部分我们将简单看一下 VTune 中显示的结果,从采集数据处理完成时弹出的汇总屏幕开始。
Hotspots Viewpoint(包括弹出窗口描述和撤销每次显示该弹出窗口的选项)
请注意,单击 “change” 将允许选择不同的观点。它仍然是同一个采集事件的相同数据,不过使用了稍微不同的指标展示分析。这有助于您选择最适合场景的观点。下面我们继续 Hotspots Viewpoint。
Summary 选项卡: 基本高级信息、采集时长,事件中最活跃的函数、CPU 利用率直方图、采集和平台信息。请注意,在 CPU 利用率直方图上,您可以使用滑块重新定义 “poor”、“ok” 和 “ideal”。
Bottom-up 选项卡: 可以轻松、快速地识别采集事件中耗时最长的函数,尤其有助于解决可能导致问题的代码瓶颈。
“Grouping” 中部分可用选项可以更改分组显示 CPU 时间帕累托数据的方式
同样,底部的图形也可以改成是否通过线程、进程等显示数据。
图形可以放大、突显,和选择具体的时间片段,甚至还能将其他数据过滤到具体的时间段,以便您查看上述帕累托图以了解具体时间过滤的信息。
- < >
自上而下树: 与自下而上图类似,不过是从上自下查看函数堆栈。值得注意的是,双击此处或自下而上视图中的特定函数名称,将打开一个新的选项卡,显示具体的代码片段。如果提供相应的符号和源数据,将带领您前往特定的源代码文件,否则将显示汇编代码。
平台:从基本上来说,全屏模式的时间曲线图显示在自下而上和自上而下屏幕的底部,有助于提高可见性。 请注意,将鼠标指针悬停在不同项目上,会出现包含部分其他信息(比如线程 ID、CPU 利用率等)的弹出式文本
安装其他驱动程序
这里我们来安装几种其他的驱动程序,以改进除内置于内核的缺省内容外的采集功能。在本案例中,我们添加模块驱动程序,它可在设备运行的过程中进行安装和移除。如果正在开发设备映像,您还可以直接构建这些驱动程序(通常针对 sep 和 pax 驱动程序)。
运行 adb root,以确保获得了针对设备的根访问
借助 adb shell 至设备
借助 mount –o rw,remount /将根文件系统重新安装成读写模式(在这之前,您可以通过尝试创建新目录,确认它是否是只读模式)
借助 mkdir /lib创建 /lib 目录,然后借助 mkdir /lib/modules创建模块子目录
请注意,目前有一个 /system/lib 目录,通常情况下,我们应该用模块子目录来放置驱动程序。遗憾的是,基于该设备的试验表明,该目录结构的磁盘空间不足,无法拷贝文件,因此我们前往其他位置 — /lib/modules。VTune 自动查找 /system/lib/modules 和 /lib/modules 中的驱动程序,因为它们的位置会因设备的不同而有所差别
退出 adb shell,然后从主机上的目录提取 ko 驱动程序文件
- < >
adb push pax.ko /lib/modules
adb push sep3_15.ko /lib/modules
adb push socperf1_2.ko /lib/modules
adb push socwatch2_0.ko /lib/modules
- < >
运行其他热点分析之前,继续在设备上加载 pax 和 sep 驱动程序。
adb shell
insmod /lib/modules/pax.ko
insmod /lib/modules/sep3_15.ko
- < >
现在,您可以查看 ~/intel/amplsys/projects/<your project name>/<collection run>/data.0/ 目录,验证它们是否已投入使用。 请注意,从部分文件名称可看出,您的首次运行(可能是 r000ah 运行目录)显示用于数据采集的 perf 驱动程序的利用率。下次运行应包含某个 sep######.tb6 文件。
执行步骤 3 中所述的其他事件采集,同时尝试做出一些不同的事情,比如使用遥控器在视频的不同点之间穿梭。
现在,您可以花点时间(如第 4 节所述)查看结果,注意除 “Welcome” 选项卡外,结果显示在靠近屏幕顶部的不同选项卡中,还显示了结果名称,比如 “r001hs” 和 “r002hs”。您可以在这些选项卡之间来回切换,并查看事件之间的不同,但这样会有一定的难度。
使用类似于圆圈(被直条分成两个半圆)的图标或快捷键 CTRL+ALT+O选择 “Compare Results”
通过 Result 1 和 Result 2 下拉菜单选择您感兴趣的两次运行,然后单击 “Compare”
这样可能要求关闭部分 VTune 版本(不是本版本)中有关特定结果的选项卡,并打开有类似 “r001hs-r002hs” 标记的新选项卡,其中包含两种结果中指标与指标的直接对比信息,以及它们之间的区别。
进行了解,想象这可能对特定应用带来的帮助
使用英特尔® Energy Profiler 执行功耗/能耗分析
构建 root boot.img 映像:
设置构建环境,并根据指令执行报告同步化:
http://source.android.com/source/building.html
执行报告初始化时,务必指定此处查询表所确定的相应分支: http://source.android.com/source/build-numbers.html#source-code-tags-and-builds
请注意,已通过面向构建 LMY47V 的分支 android-5.1.1_r1 完成 IDF 实验室,此时最新构建适用于 Nexus Player 设备
在初始 AOSP 报告同步完成之后,开始运行之前,执行:
Checkout kernel source:
git clone https://android.googlesource.com/kernel/x86_64.git
cd x86_64
git branch –a (see a list of branches available)
git checkout android-x86_64-fugu-3.10-lollipop-mr1
make fugu_defconfig
NOW EDIT THE .config – 如果尚未设置 CONFIG_MODULES,改成 CONFIG_MODULES=y
(会有其他一些需要答案的配置选项 — 我没有重新调用向其他提示窗口回答 YES,但内存可能容易出现变化。)
Make –j8
cd ..
下载所有专用材料(“Building for Devices” 下方 source.android.com 说明所述,位于此处:https://developers.google.com/android/nexus/drivers):
wget https://dl.google.com/dl/android/aosp/asus-fugu-lmy47v-f7524060.tgz
wget https://dl.google.com/dl/android/aosp/broadcom-fugu-lmy47v-8ce8ebda.tgz
wget https://dl.google.com/dl/android/aosp/google-fugu-lmy47v-c77f7094.tgz
wget https://dl.google.com/dl/android/aosp/intel-fugu-lmy47v-0bb60afb.tgz
wget https://dl.google.com/dl/android/aosp/widevine-fugu-lmy47v-ee5d30ed.tgz
现在,执行压缩包中的 ‘extract-*.sh’ 脚本
Build the bootimage:
source build/envsetup.sh
lunch aosp_fugu-userdebug
export TARGET_PREBUILT_KERNEL=<AOSP_PATH>/x86_64/arch/x86/boot/bzImage
make bootimage –j8
boot.img 应位于 <AOSP_PATH>/out/target/product/fugu/
构建 SEP 和 SoC Watch 驱动程序:
SoC Watch 驱动程序构建:
下载所需的可用 SoC Watch 版本(包含在英特尔 System Studio 分发版中:targets/system_studio_target.tgz zip file)。
按照用户指南文档 (pdf) 中的说明(通常是第 2.2 节 “Building the Kernel Modules”)。
GOTCHA#1: 构建 soc_perf_driver 时,务必在弹出窗口中准确指明 kernel-build-directory。 构建内核时,kernel-build-directory 将是您创建的 <AOSP_SRC>/x86_64/ 目录。
GOTCHA#2: 构建 socwatch_driver 时,务必将 –s 选项(包含前往 Module.symvers 文件的路径)纳入 soc_perf_driver 构建过程中创建的 soc_perf_driver/src/ 目录。
SEP 驱动程序构建:
类似于 SoC Watch 驱动程序构建。 必要文件均包含在 /opt/intel/vtune_amplifier_for_systems/sepdk 目录中英特尔 System Studio 的 VTune 放大器组件之中。 只需 cd 至该目录,运行 ./build-driver 脚本,务必提供前往 kernel-build-directory 的相应路径,以获取正确的安全签名。 这样能够创建全部所需的驱动程序,不过需要前往 pax 和 vtsspp 子目录,运行各自的 build-driver 脚本,以确保这些驱动程序得以构建。 第一个会创建 sepx_xx.ko,在该文件中,x 将替换成特定版本的驱动程序(比如实验室的 sep3_15.ko),pax 目录应创建 pax.ko 文件
基于 socwatch 采集器的能耗分析会涉及较多的手动流程,需要通过 adb shell 在设备上手动运行采集器,或使用专门设计的应用运行该采集器
将 socwatch 采集器从主机安装至设备。 导航至 SoC Watch 目录并运行安装脚本./socwatch_android_install.sh
注: 解压位于英特尔 System Studio 安装目录的 Targets 子目录中的 system_studio_target.tgz 文件,安装英特尔 System Studio,从而获取 SoCWatch 采集器。 解压后的目录包含参考安装脚本(面向 Windows 和 Linux)以及 pdf 格式的用户指南。
shell 至设备,设置运行环境并加载驱动程序模块
adb root
adb shell
cd /data/socwatch
. ./setup_socwatch_env.sh (您还可以运行 source ./setup_socwatch_env.sh,其目的是将所有脚本环境设置应用于当前 shell)
insmod /lib/modules/socperf1_2.ko
insmod /lib/modules/socwatch2_0.ko
现在准备好运行采集,根据您希望分析的内容,使用设备遥控器进行导航(准备好启动应用,如果正在分析闲置设备,也可以将其留在屏保中)
现在运行 socwatch 采集,您可以借助 socwatch –h command 查看几个可能的选项。例如,运行采集,持续 30 秒,并将结果保存在 /data/socwatch/results/ 目录中。
请注意,每次运行时,您希望使用不同的结果名称,以避免覆盖之前的结果,或混淆同一个文件中的多个结果。
socwatch –m –f cpu –f sys –t 30 –r vtune –o ./results/test1
现在,检查结果目录,会发现有 3 个文件:test1.csv、test1.sw2 和 test2.pwr。csv 文件是一个逗号分隔值文件,用于第三方分析器,pwr 文件是面向 VTune 的输入文件,sw2 是原始输出文件。
注: 如果您当时正在运行 socwatch 1.x,应该没有 pwr 文件,您可以直接将 sw1 文件导入至 VTune。
退出设备 shell,将结果拉至 SWResults 目录
- < >
cd ~/IDFLab/SWResults
adb pull /data/socwatch/results/test1.pwr
- < >
在 VTune 中加载结果。
在 VTune 中选择 Welcome 选项卡上的 “Import Results”,或 VTune 窗口顶部的相应图标,或使用快捷键 CTRL+ALT+N
在 “Import a directory” 下方选择浏览,并选择 ~/IDFLAB/SWResults/ 目录以及您刚从设备拉过来的文件,然后单击 Import。
- 注: 由于我们使用面向该实验室的特定预生产版软件,所以才必须这样。如果是任何包含 SoCWatch 副本的版本,都能够借助 “import a single file” 选项,然后选择特定的 sw1 或 pwr 文件,导入单个文件(sw1 从 SoCWatch 版本 1.x 导入,pwr 文件从 SoCWatch 2.0 导入)
结果处理和显示方式与性能分析大体相同。请注意,您仍然需要 Summary 选项卡,但现在您有 CPU C/P 状态、内核唤醒和关联指标,而且,您所选的观点是“平台功耗分析观点”,而非“热点观点”。汇总屏幕上的直方图信息现在显示 CPU 频率和内核睡眠状态,而非 CPU 利用率。
注: 根据采集过程中使用的特定 –f特性选项,将提供更多选项卡和数据。
面向实验室主机系统设置 Ubuntu 注意事项
创建文件: /lib/udev/rules.d/51-android.rules,有利于 adb 访问设备
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666"
apt-get install android-tools-adb android-tools-fastboot
否则,android-tools-fastboot 会出现问题。 使用 Android SDK 提供的 SDK/platform-tools/fastboot 和 adb 似乎可行,因此可以继续。
JDK:
Apt-get install openjdk-7-jdk
或
Apt-add-repository ppa:webupd8team/java
Apt-get update
Apt-get install oracle-jdk7-installer
Need ia32-libs
Apt-get install lib32z1
~/.bashrc edit
#AndroidDev PATH export PATH=$PATH:/home/username/sdk/tools
法律声明:
英特尔、VTune 和 Intel 标识是英特尔在美国和其他国家(地区)的商标。
*其他的名称和品牌可能是其他所有者的资产。
英特尔公司 © 2015 年版权所有。