65.9K
CodeProject 正在变化。 阅读更多。
Home

IDF2015 实验室笔记: 从拆箱到性能和能耗分析的 Nexus Player

2016年1月14日

CPOL

20分钟阅读

viewsIcon

6942

IDF2015 实验室笔记: 从拆箱到性能和能耗分析的 Nexus Player

Intel® Developer Zone 提供用于跨平台应用开发、平台和技术信息、代码示例以及同行专业知识的工具和操作指南,以帮助开发者创新并取得成功。加入我们的 Android物联网Intel® RealSense™ 技术Windows 社区,下载工具、获取开发者套件、与志同道合的开发者分享想法,并参与黑客松、竞赛、路演和本地活动。

引言

最初在 2015 年 Intel Developer Forum 上作为一次动手实验室活动(标题为“SFTL002:动手实验室:基于 Intel® 架构的移动设备开发研讨会 – Android* TV 特辑”)进行展示,本次实验室的说明在此提供作为参考,希望能够惠及更广泛的开发者社区。演示者在实验室之前已经构建了启动映像和相应的数据捕获驱动程序,但说明中也包含了如何执行这两项任务的笔记,尽管细节不够详尽。无论如何,我希望以下信息对您有所帮助。所有任务都可以使用市售的 Nexus Player 设备、运行 Ubuntu 的主机 PC、已正确授权的 Intel System Studio 版本以及互联网连接(用于访问公开引用的网站)来完成。使用的版本如下:Nexus Player:Build LMY47V,但设备上的初始构建通常要早得多;Ubuntu 14.04 LTS;ISS 2016-Beta,附带 SoC Watch 2.0-Beta。

目录

  1. Nexus Player 基本熟悉
  2. 恢复到出厂映像
  3. Root 设备
  4. 运行性能分析
  5. 查看结果
  6. 安装附加驱动程序
  7. 重新运行分析并与先前结果进行比较
  8. 运行能耗剖析和电源分析
  9. 构建 Root 设备所需的 boot.img
  10. 构建附加驱动程序
  11. 设置主机 Ubuntu 的注意事项

 

启动您的 Nexus Player 并熟悉它

  • 遥控器中的电池

  • 将设备 USB 线缆插入 PC,将 HDMI 线缆连接到显示器,然后插入设备电源线。

  • 设备首先会请求与遥控器同步,这可以通过按住遥控器上的左箭头和圆圈键来完成,如设备显示屏所示。

  • 然后使用遥控器选择设备的语言和 WiFi 网络。

    • 播放器需要通过 WiFi 连接无代理访问 Internet 才能继续。支持一些基本的安全设置,但不支持用户名/密码组合系统。

  • 然后登录 Google 帐户,您可以使用自己的帐户登录,实验室中创建了一个虚拟 Gmail 帐户。

  • 您可以查看 Google 服务条款或选择继续。

  • 我建议不要共享位置,但这由您决定。

  • 在您的 PC 上打开命令提示符,并检查 lsusbadb devices。您会注意到设备未列出。

  • 选择“设置”->“关于”,然后向下滚动到“版本号”,连续点击直到收到“您现在是开发者”的消息。记下版本号。您需要构建您的 boot.img(在此 步骤中)以匹配您设备上的版本号,或者将设备刷写到匹配所需版本号的出厂默认映像(如在此 步骤中)。稍后将详细介绍。

  • 现在退出设置菜单并再次返回,您应该能够在“偏好设置”部分下选择“开发者选项”。

  • 在“调试”下将“USB 调试”设置为“开启”,这将导致出现一个提示,请求您的 PC 系统访问。勾选“始终允许此设备”,然后选择“确定”。

  • 在您的 PC 上重新运行 lsusbadb devices,您现在应该可以看到该设备。

  • 如果您愿意,现在可以侧载一些应用程序,或复制一些电影文件到设备上观看。在实验室中,我们使用了美国宇航局 (NASA) 的一些公共领域 视频,以及 VLC 播放器和 EC 文件管理器应用程序(其他应用程序可在 Google Play 商店找到)。

    • adb push <文件名>.mp4 /sdcard/Movies

    • adb install <文件名>.apk(设备会提示验证)

  • 请注意,您可能能够或可能无法看到复制视频文件的位置,因为设备尚未 root。

    • adb shell

      • ls /sdcard

      • ls /sdcard/Movies

  • 然而它们确实存在并且可以使用(您可能看不到 Movies 目录,但如果您知道目录存在,则可以看到您刚刚放入的文件)。

    • 在设备上使用文件管理器(刚刚安装)导航并查找文件。

    • 在设备上使用 VLC 播放器播放视频剪辑。

  • 现在我们已经熟悉了该设备,了解了非 root 设备的一些限制,以及在不 root 设备的情况下绕过这些限制的一些方法。

恢复到出厂设置

  • Nexus Player 的工厂恢复映像可直接从 Google 获取,网址为:https://developers.google.com/android/nexus/images

  • 通过插入电源来启动 Nexus Player(设备),确保 HDMI 线连接到显示器,USB 连接到笔记本电脑,电源连接到电源。

  • 在您的主机机上打开终端,并导航到您解压缩下载映像的目录。

  • 通过运行 adb devices 确认与设备的连接。

  • 通过 adb reboot bootloader 进入 bootloader。

    • 也可以通过在初始启动时按住设备底部的按钮来实现。

  • 禁用 oem 锁以允许使用 fastboot oem unlock 进行刷写。如果失败,请不要担心,再试一次,有时需要几次尝试。

  • 通过运行 ./flash-all.sh 将设备恢复到出厂映像 LMY47V。

    • 刷写 bootloader 本身后,设备至少会重启一次,然后才会刷写其余系统。您可以在您的系统和设备显示屏上跟踪进度。完成后,设备将再次重启,并应以全新出厂的映像启动!

Root 设备

  • 如果您在 root 设备之前尝试运行 VTune,当它尝试将必要的应用程序代码安装到设备本身时,您会收到一条错误消息。尽管 VTune 通常可以在未 root 的设备上运行并提供有用的数据,但我在准备本次实验室期间使用此特定设备的经验表明它不能。因此,我们先 root 设备。

  • 在 PC 上导航到包含您构建的 boot.img 的目录,此处

  • 运行 adb reboot bootloader 并等待您的设备重启到 bootloader 屏幕。

  • 运行 fastboot oem unlock,成功后,oem 锁状态应在设备屏幕上更新。如果失败,请不要担心,再试一次,有时需要几次尝试。

  • 本次实验室准备的 boot.img 基于 lollipop 构建 LM47V,这就是为什么我们需要将设备更新到该构建版本才能使此步骤正常工作。如果需要 root 不同的构建,那么您只需创建一个适合版本的 boot.img 文件。这是因为我们只刷写 boot.img 文件,它需要与 system.img 和设备的其他组件的构建版本匹配,而这些组件在此步骤中不被更新。

  • 运行 fastboot flash boot boot.img,如果完成而没有错误,则继续;否则,重试,这只需要一两秒钟。

  • 此时,您可以选择通过 fastboot oem lock 重新锁定 oem 锁,但这并非必需。

  • 运行 fastboot continue 将设备重新启动到正常用户界面。

  • 您应该注意到,启动屏幕现在显示“Google”和一个小的解锁锁符号,之前此屏幕上没有锁符号。然后它将继续启动到正常 UI。

运行性能分析

  • 运行 adb root 以确认 root 成功并通过 adb 获取 root 访问权限。

  • 您现在可以 adb shell 到设备,查看之前未显示的目录结构(例如 /data)。

  • 在主机系统上打开 VTune Amplifier。

    • /opt/intel/vtune_amplifier_for_system/bin64/amplxe-gui

    • 在“欢迎”屏幕中,选择“新建项目...”或使用顶部菜单栏中的图标或下拉菜单选择。

    • 输入项目名称,例如“IDF_DemoLab”,将项目位置保留为默认。

    • 在屏幕左侧(忽略项目导航器,如果需要可以关闭),选择分析目标“Android 设备 (ADB)”。

    • 此时,您可能会在设备上收到“验证应用?”的提示,请选择“接受”。

    • “通过 ADB 在设备上启动应用程序”的默认值“######”应可见(换句话说,此时它应该自动检测到 Nexus Player 的存在)。将“启动应用程序”更改为“启动 Android 包”。

    • 通过输入或浏览之前安装的 VLC 播放器来选择包名。“org.videolan.vlc”

    • 出于本次实验室的目的,我们将限制数据捕获的长度。

      • 勾选“自动停止收集(秒):”并输入 30。这将自动在 30 秒后停止数据收集。

      • 保持“自动恢复收集(秒):”框未勾选且值为空。请注意,使用此选项可以在应用程序启动后指定秒数,以便您选择一个视频播放,然后开始收集。本次实验室将其留空且未勾选,这样我们就可以确保分析用户活动和自动操作。

    • 所有其他默认选择都可以,但请随意探索并熟悉可以更改的内容。

    • 选择“选择分析”或选择“分析类型”选项卡以进入下一步。

      • 注意:“二进制/符号搜索”和“源搜索”按钮在“选择分析”下方,用于为 VTune 提供符号和源代码信息,以便在分析自己的代码时获得更有意义的分析结果。这些文件的目录信息可以现在或稍后提供,只需访问项目属性或结果屏幕并重新解析符号信息(另一个按钮)。

  • 现在设备已 root,您会注意到我们有多种分析类型可供选择,例如“基本热点”、“高级热点”和“通用探索”。

  • 在本示例中,我们将选择“高级热点”。

    • 使用默认值 1 作为 CPU 采样间隔。

    • 选择“热点”详细程度。注意在尝试其他详细程度时出现的一些警告消息,因为更高的驱动程序支持级别可以实现更高的数据收集级别。

    • 勾选“分析用户任务”复选框。

    • 取消勾选“分析 GPU 使用情况”,因为我们的设备上没有 Intel HD Graphics,并确保“分析处理器图形硬件事件:”设置为“无”。

    • 准备好后,点击“开始”。

  • 如果设备屏幕保护程序已触发,请按遥控器返回主菜单,您应该会看到“等待调试器”消息,然后 VLC 将启动。

  • 在收集期间,选择一个视频播放(推荐“地球延时摄影”)。

  • 30 秒后,VLC 将自动关闭,结果将被拉取到 VTune 中。

  • 此时,您将在收集日志屏幕中看到大量警告滚动。这是因为我们尚未指定 VTune 在何处查找与收集事件期间运行的每段代码相关联的所有函数调用的符号信息。

查看结果

  • 此时,我们将花一点时间查看 VTune 中显示的结果,首先是数据处理完成后立即弹出的摘要屏幕。

  • 热点视图(带有弹出描述和选项,可取消选中以每次都显示此弹出窗口)

    • 请注意,点击“更改”将允许选择不同的视图。这仍然是来自同一收集事件的相同数据,但分析使用略微不同的指标呈现。这允许您选择最适合您情况的视图。此处我们将继续使用热点视图。

  • 摘要选项卡:基本高级信息,收集花费的时间,事件期间最活跃的函数,CPU 使用率直方图,收集和平台信息。请注意,在 CPU 使用率直方图上,您可以使用滑块重新定义“差”、“一般”和“理想”的阈值。

  • 自底向上选项卡:一种快速识别在收集事件期间花费时间最多的特定函数的方法。如果您遇到导致问题的代码瓶颈,尤其有用。

    • “分组”中提供了几个选项,用于更改 CPU 时间 Pareto 数据如何显示。

    • 底部的图形同样可以更改,以显示按线程、进程等的数据。

    • 还可以使用图形进行缩放、突出显示和选择特定时间片段,甚至将其他数据筛选到特定时间段,然后您可以查看上面的 Pareto 图以获取感兴趣的特定时间段的信息。

  • < >

    自顶向下树:类似于自底向上显示,但从上往下查看函数堆栈。值得注意的是,双击此处或自底向上视图中的特定函数名称将在新选项卡中打开感兴趣的代码片段。如果提供了正确的符号和源数据,这将带您到特定的源代码文件,否则将显示汇编代码。

  • 平台:基本上是自底向上和自顶向下屏幕底部的时间图的全屏视图。提供了更好的可见性。请注意,将鼠标指针悬停在各种项目上会弹出一个文本框,其中包含一些额外信息,例如线程 ID、CPU 利用率等。

安装附加驱动程序

  • 在此,我们将安装一些附加驱动程序,以提高超出内核默认内置功能的收集能力。在这种情况下,我们正在添加模块化驱动程序,这些驱动程序可以在设备运行时安装和卸载。可选地,当您自己开发设备映像时,您可以直接构建这些驱动程序(通常为 sep 和 pax 驱动程序)。

  • 通过运行 adb root 确保您在设备上具有 root 访问权限。

  • 使用 adb shell 进入设备。

  • 将 root 文件系统重新挂载为读写(您可以在此之前通过尝试创建新目录来确认它是否为只读),命令为 mount –o rw,remount /

  • 使用 mkdir /lib 创建一个 /lib 目录,然后使用 mkdir /lib/modules 创建一个 modules 子目录。

  • 请注意,已经有一个 /system/lib 目录,通常我们在其中有一个 modules 子目录来放置我们的驱动程序。不幸的是,对该设备的实验表明该目录结构中的磁盘空间不足以复制文件,因此我们选择备用位置 /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

  • 在运行另一次 Hotspot 分析之前,先在设备上加载 pax 和 sep 驱动程序。

    • adb shell

    • insmod /lib/modules/pax.ko

    • insmod /lib/modules/sep3_15.ko

    • < >

      现在,您可以检查 ~/intel/amplsys/projects/<您的项目名称>/<收集运行>/data.0/ 目录来验证它们是否被使用。请注意,您的第一次运行(可能是 r000ah 运行目录)表明使用了 perf 驱动程序进行收集,从一些文件名可以看出。您的下一次运行应该会有一个 sep######.tb6 文件。

    • 再进行一次事件收集,就像步骤 3 中一样,但在收集过程中尝试做一些略有不同的事情,例如使用遥控器在视频的不同点之间跳转。

    • 现在您可以花一些时间,就像在第 4 节中一样,回顾结果。请注意,除了“欢迎”选项卡之外,您的结果还显示在屏幕顶部附近的各种选项卡中,名称为“r001hs”和“r002hs”。您可以来回切换这些选项卡并查看这些事件之间的差异,但这会变得很困难。

    • 选择“比较结果”,使用看起来像由垂直条分割成两个半圆的圆形的图标,或使用键盘快捷键 CTRL+ALT+O

    • 使用结果 1 和结果 2 的下拉菜单选择您感兴趣的两个运行,然后点击“比较”。

    • 在某些版本的 VTune 中(但在当前版本中不需要),这可能需要关闭特定结果的选项卡,然后会打开一个新选项卡,其名称可能类似于“r001hs-r002hs”,其中包含两个结果的直接逐项指标比较信息以及差异。

    • 随意探索,想象一下这可能对您的特定应用程序有多大帮助。

  • 使用 Intel Energy Profiler 进行功率/能耗分析

    构建 root boot.img 映像

    设置构建环境,并按照以下地址的说明执行 repo sync:

    https://aosp.org.cn/source/building.html

    在执行 repo init 时,请确保指定了适当的分支,具体取决于此处的查找表:https://aosp.org.cn/source/build-numbers.html#source-code-tags-and-builds

    注意:IDF 实验室使用的是分支 android-5.1.1_r1,构建版本为 LMY47V,当时是 Nexus Player 设备可用的最新构建版本。

    在初始 AOSP repo sync 完成后,但在运行 make 之前:

    检出内核源代码

    git clone https://android.googlesource.com/kernel/x86_64.git

    cd x86_64

    git branch –a(查看可用分支列表)

    git checkout android-x86_64-fugu-3.10-lollipop-mr1

    make fugu_defconfig

    现在编辑 .config – 其中 CONFIG_MODULES 未设置,将其更改为 CONFIG_MODULES=y。

    (将会有额外的配置选项需要回答 – 我不记得回答了任何额外的提示,但记忆可能不可靠。)

    Make –j8

    cd ..

    下载所有专有文件(在 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

    现在执行从 tarball 中获取的 ‘extract-*.sh’ 脚本。

    构建 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 的可用和所需版本(包含在 Intel System Studio 的 targets/system_studio_target.tgz 压缩文件中)。

    遵循包含的用户指南 pdf 文档中的说明(通常是第 2.2 节,“构建内核模块”)。

    陷阱#1:在构建 soc_perf_driver 时,请务必正确指定 kernel-build-directory。Kernel-build-directory 将是您在构建内核时创建的 <AOSP_SRC>/x86_64/ 目录。

    陷阱#2:在构建 socwatch_driver 时,请确保包含 –s 选项,并指向 soc_perf_driver/src/ 目录中在 soc_perf_driver 构建步骤中创建的 Module.symvers 文件。

    SEP 驱动程序构建

    与 SoC Watch 驱动程序构建非常相似。必要的文件包含在 Intel System Studio 的 VTune Amplifier 组件的 /opt/intel/vtune_amplifier_for_systems/sepdk 目录中。只需 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

      • 注意:SoCWatch 收集器可以从您的 Intel System Studio 安装中获取,方法是解压缩位于 Intel System Studio 安装目录 Target 子目录下的 system_studio_target.tgz 文件。解压后的目录将包含参考的安装脚本(适用于 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 命令查看一些可能的选项。这是一个示例,它将运行 30 秒的收集,并将结果保存在 /data/socwatch/results/ 目录中。

      • 请注意,每次运行时您都应该使用不同的结果名称,以避免覆盖之前的结果,并可能减少同一文件中多个结果的混淆。

      • socwatch –m –f cpu –f sys –t 30 –r vtune –o ./results/test1

      • 现在检查结果目录,您应该找到三个文件: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 中,在“欢迎”选项卡或 VTune 窗口顶部的相应图标上选择“导入结果”,或使用键盘快捷键 CTRL+ALT+N

      • 在“导入目录”下,选择浏览并选择您刚刚从设备拉取的文件的 ~/IDFLAB/SWResults/ 目录。然后点击导入。

        • 注意:这仅是由于我们为本次实验室使用特定的预生产软件版本而必需的。对于任何包含 SoCWatch 副本的版本,您都可以使用“导入单个文件”选项导入单个文件,然后选择感兴趣的特定 sw1 或 pwr 文件(sw1 文件从 SoCWatch 版本 1.x 导入,pwr 文件从 SoC Watch 2.0 导入)。
    • 结果将像性能分析一样被处理并显示。请注意,您仍然有“摘要”选项卡,但现在有了“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

    需要 ia32-libs

    Apt-get install lib32z1

    ~/.bashrc 编辑

    #AndroidDev PATH 
    
    export PATH=$PATH:/home/username/sdk/tools

    法律事宜

    Intel、VTune 和 Intel 标志是 Intel Corporation 在美国和其他国家/地区的商标。

    *其他名称和品牌可能被声明为他人的财产。

    © 2015 Intel Corporation

© . All rights reserved.