aboutsummaryrefslogtreecommitdiff
path: root/zh-cn
diff options
context:
space:
mode:
authorAndroid Partner Docs <noreply@android.com>2017-05-31 17:05:57 -0700
committerClay Murphy <claym@google.com>2017-05-31 17:52:58 -0700
commitdb839ff8e0b66ac9f10c895bd6385453c533d18a (patch)
treee63cceb49a20a567a2cf48ca2f4ca446768481b1 /zh-cn
parent493114bd93d9bde315c7b2f55ee67a814ca53c70 (diff)
downloadsource.android.com-db839ff8e0b66ac9f10c895bd6385453c533d18a.tar.gz
Docs: Changes to source.android.com
- 157655846 Devsite localized content from translation request 6e6527... by Android Partner Docs <noreply@android.com> - 157653127 Update Security bulletin index page with localized files by daroberts <daroberts@google.com> - 157652951 Update hikey960 Mali binary path by Android Partner Docs <noreply@android.com> - 157652539 Devsite localized content from translation request 247907... by Android Partner Docs <noreply@android.com> - 157652360 Devsite localized content from translation request ab08b7... by Android Partner Docs <noreply@android.com> - 157608266 Docs: adding pixels to chart, minor edits by hvm <hvm@google.com> - 157510199 Remove use for LinkSprite Display - it is not working rel... by Android Partner Docs <noreply@android.com> - 157492224 Bug: 35095538 by Android Partner Docs <noreply@android.com> - 157160176 Remove period from code tag for /dev/null reference by claym <claym@google.com> - 157135952 Devsite localized content from translation request 658510... by Android Partner Docs <noreply@android.com> - 157123310 Devsite localized content from translation request 06c6fc... by Android Partner Docs <noreply@android.com> - 156918142 Update 620 Hikey tgz file by daroberts <daroberts@google.com> - 156914394 Fix tag errors by claym <claym@google.com> - 156909651 Add revised version of CDD for 7.1, pdf and html. by gdimino <gdimino@google.com> - 156909571 Update First API level build property description. by gdimino <gdimino@google.com> - 156903965 Rewrite last paragraph to be more clear, fix line length,... by claym <claym@google.com> - 156804736 Add IEEE 1394 by Android Partner Docs <noreply@android.com> - 156776922 Add path to vold by daroberts <daroberts@google.com> - 156775687 Link to application sandbox by daroberts <daroberts@google.com> PiperOrigin-RevId: 157655846 Change-Id: Ib3717634953f239842b55869edf5715f52645749
Diffstat (limited to 'zh-cn')
-rw-r--r--zh-cn/_book.yaml753
-rw-r--r--zh-cn/_index.yaml69
-rw-r--r--zh-cn/devices/audio/terminology.html593
-rw-r--r--zh-cn/legal.html48
-rw-r--r--zh-cn/license.html132
-rw-r--r--zh-cn/security/bulletin/2017-05-01.html2403
-rw-r--r--zh-cn/security/encryption/file-based.html224
-rw-r--r--zh-cn/security/keystore/implementer-ref.html706
-rw-r--r--zh-cn/security/overview/acknowledgements.html864
-rw-r--r--zh-cn/security/trusty/trusty-ref.html962
-rw-r--r--zh-cn/source/64-bit-builds.html155
-rw-r--r--zh-cn/source/add-device.html290
-rw-r--r--zh-cn/source/brands.html104
-rw-r--r--zh-cn/source/build-numbers.html1737
-rw-r--r--zh-cn/source/building-kernels.html243
-rw-r--r--zh-cn/source/building.html164
-rw-r--r--zh-cn/source/code-lines.html109
-rw-r--r--zh-cn/source/code-style.html461
-rw-r--r--zh-cn/source/community.html235
-rw-r--r--zh-cn/source/contributing.html39
-rw-r--r--zh-cn/source/developing.html153
-rw-r--r--zh-cn/source/devices.html113
-rw-r--r--zh-cn/source/downloading.html187
-rw-r--r--zh-cn/source/faqs.html126
-rw-r--r--zh-cn/source/git-resources.html42
-rw-r--r--zh-cn/source/index.html44
-rw-r--r--zh-cn/source/initializing.html364
-rw-r--r--zh-cn/source/jack.html303
-rw-r--r--zh-cn/source/known-issues.html119
-rw-r--r--zh-cn/source/licenses.html47
-rw-r--r--zh-cn/source/life-of-a-bug.html128
-rw-r--r--zh-cn/source/life-of-a-patch.html29
-rw-r--r--zh-cn/source/read-bug-reports.html863
-rw-r--r--zh-cn/source/report-bugs.html53
-rw-r--r--zh-cn/source/requirements.html95
-rw-r--r--zh-cn/source/roles.html63
-rw-r--r--zh-cn/source/running.html391
-rw-r--r--zh-cn/source/site-updates.html57
-rw-r--r--zh-cn/source/submit-patches.html179
-rw-r--r--zh-cn/source/using-repo.html258
40 files changed, 13905 insertions, 0 deletions
diff --git a/zh-cn/_book.yaml b/zh-cn/_book.yaml
new file mode 100644
index 00000000..30063d93
--- /dev/null
+++ b/zh-cn/_book.yaml
@@ -0,0 +1,753 @@
+upper_tabs:
+- lower_tabs:
+ other:
+ - contents:
+ - section:
+ - path: /source/
+ title: 概览
+ - path: /source/code-lines
+ title: 代码行、分支和版本
+ - path: /source/build-numbers
+ title: 代号、标签和版本号
+ - path: /source/roles
+ title: 项目角色
+ - path: /source/brands
+ title: 品牌使用准则
+ - path: /source/licenses
+ title: 许可
+ - path: /source/faqs
+ title: 常见问题解答
+ - path: /source/site-updates
+ title: 网站动态
+ title: 开始使用
+ - section:
+ - path: /source/requirements
+ title: 概览
+ - path: /source/initializing
+ title: 搭建编译环境
+ - path: /source/downloading
+ title: 下载源代码
+ - path: /source/building
+ title: 准备构建
+ - path: /source/jack
+ title: 使用 Jack 编译
+ - path: /source/devices
+ title: 选择设备
+ - path: /source/running
+ title: 运行版本
+ - path: /source/building-kernels
+ title: 构建内核
+ - path: /source/known-issues
+ title: 已知问题
+ title: 下载和构建
+ - section:
+ - path: /source/developing
+ title: 概览
+ - path: /source/using-repo
+ title: 使用 Repo
+ - path: /source/git-resources
+ title: 了解 Git
+ - path: /source/add-device
+ title: 添加新设备
+ - path: /source/64-bit-builds
+ title: 了解 64 位版本
+ title: 开发
+ - section:
+ - path: /source/contributing
+ title: 概览
+ - path: /source/life-of-a-patch
+ title: 补丁程序的生命周期
+ - path: /source/submit-patches
+ title: 提交补丁程序
+ - path: http://android-review.googlesource.com
+ title: 查看补丁程序
+ - path: /source/life-of-a-bug
+ title: 错误的生命周期
+ - path: /source/report-bugs
+ title: 报告错误
+ - path: /source/read-bug-reports
+ title: 阅读错误报告
+ - path: /source/code-style
+ title: 代码样式规则
+ title: 做出贡献
+ - path: /source/community
+ title: 社区
+ name: 源代码
+ name: 源代码
+- lower_tabs:
+ other:
+ - contents:
+ - path: /security/
+ title: 概览
+ - path: /security/overview/kernel-security
+ title: 内核安全性
+ - path: /security/overview/app-security
+ title: 应用安全性
+ - path: /security/overview/implement
+ title: 实现安全性
+ - path: /security/overview/updates-resources
+ title: 更新和资源
+ - section:
+ - path: /security/enhancements/
+ title: 概览
+ - path: /security/enhancements/enhancements70
+ title: Android 7.0
+ - path: /security/enhancements/enhancements60
+ title: Android 6.0
+ - path: /security/enhancements/enhancements50
+ title: Android 5.0
+ - path: /security/enhancements/enhancements44
+ title: Android 4.4
+ - path: /security/enhancements/enhancements43
+ title: Android 4.3
+ - path: /security/enhancements/enhancements42
+ title: Android 4.2
+ - path: /security/enhancements/enhancements41
+ title: Android 4.1
+ title: 增强功能
+ - path: /security/overview/acknowledgements
+ title: 致谢
+ - section:
+ - path: /security/bulletin/
+ title: 概览
+ - path: /security/advisory/
+ title: 公告
+ - section:
+ - path: /security/bulletin/2017-04-01
+ title: 4 月
+ - path: /security/bulletin/2017-03-01
+ title: 3 月
+ - path: /security/bulletin/2017-02-01
+ title: 2 月
+ - path: /security/bulletin/2017-01-01
+ title: 1 月
+ - path: /security/bulletin/2017
+ title: 索引
+ title: 2017 年公告
+ - section:
+ - path: /security/bulletin/2016-12-01
+ title: 12 月
+ - path: /security/bulletin/2016-11-01
+ title: 11 月
+ - path: /security/bulletin/2016-10-01
+ title: 10 月
+ - path: /security/bulletin/2016-09-01
+ title: 9 月
+ - path: /security/bulletin/2016-08-01
+ title: 8 月
+ - path: /security/bulletin/2016-07-01
+ title: 7 月
+ - path: /security/bulletin/2016-06-01
+ title: 6 月
+ - path: /security/bulletin/2016-05-01
+ title: 5 月
+ - path: /security/bulletin/2016-04-02
+ title: 4 月
+ - path: /security/bulletin/2016-03-01
+ title: 3 月
+ - path: /security/bulletin/2016-02-01
+ title: 2 月
+ - path: /security/bulletin/2016-01-01
+ title: 1 月
+ - path: /security/bulletin/2016
+ title: 索引
+ title: 2016 年公告
+ - section:
+ - path: /security/bulletin/2015-12-01
+ title: 12 月
+ - path: /security/bulletin/2015-11-01
+ title: 11 月
+ - path: /security/bulletin/2015-10-01
+ title: 10 月
+ - path: /security/bulletin/2015-09-01
+ title: 9 月
+ - path: /security/bulletin/2015-08-01
+ title: 8 月
+ - path: /security/bulletin/2015
+ title: 索引
+ title: 2015 年公告
+ title: 公告
+ - section:
+ - path: /security/apksigning/
+ title: 概览
+ - path: /security/apksigning/v2
+ title: APK 签名架构 v2
+ title: 应用签名
+ - section:
+ - path: /security/authentication/
+ title: 概览
+ - path: /security/authentication/fingerprint-hal
+ title: 指纹 HAL
+ - path: /security/authentication/gatekeeper
+ title: Gatekeeper
+ title: 身份验证
+ - section:
+ - path: /security/keystore/
+ title: 概览
+ - path: /security/keystore/features
+ title: 功能
+ - path: /security/keystore/implementer-ref
+ title: 面向实现人员的参考资料
+ title: 密钥存储区
+ - section:
+ - path: /security/trusty/
+ title: 概览
+ - path: /security/trusty/trusty-ref
+ title: Trusty API 参考
+ title: Trusty TEE
+ - section:
+ - path: /security/encryption/
+ title: 概览
+ - path: /security/encryption/file-based
+ title: 文件级加密
+ - path: /security/encryption/full-disk
+ title: 全盘加密
+ title: 加密
+ - section:
+ - path: /security/selinux/
+ title: 概览
+ - path: /security/selinux/concepts
+ title: 概念
+ - path: /security/selinux/implement
+ title: 实现
+ - path: /security/selinux/customize
+ title: 自定义
+ - path: /security/selinux/validate
+ title: 验证
+ - path: /security/selinux/device-policy
+ title: 撰写策略
+ title: SELinux
+ - section:
+ - path: /security/verifiedboot/
+ title: 概览
+ - path: /security/verifiedboot/verified-boot
+ title: 验证启动
+ - path: /security/verifiedboot/dm-verity
+ title: 实现 dm-verity
+ title: 验证启动
+ name: 安全性
+ name: 安全性
+- lower_tabs:
+ other:
+ - contents:
+ - path: /devices/
+ title: 概览
+ - section:
+ - section:
+ - path: /devices/accessories/audio
+ title: 概览
+ - section:
+ - path: /devices/accessories/headset/
+ title: 概览
+ - path: /devices/accessories/headset/plug-headset-spec
+ title: 3.5 毫米耳机规格
+ - path: /devices/accessories/headset/jack-headset-spec
+ title: 3.5 毫米插孔规格
+ - path: /devices/accessories/headset/usb-headset-spec
+ title: USB 耳机规格
+ - path: /devices/accessories/headset/expected-behavior
+ title: 预期行为
+ - path: /devices/accessories/headset/testing
+ title: 测试
+ title: 耳机
+ title: 音频配件
+ - section:
+ - path: /devices/accessories/custom
+ title: 概览
+ - section:
+ - path: /devices/accessories/protocol
+ title: 概览
+ - path: /devices/accessories/aoa2
+ title: AOA 2.0
+ - path: /devices/accessories/aoa
+ title: AOA 1.0
+ title: AOA
+ - path: /devices/accessories/stylus
+ title: 触控笔
+ title: 自定义配件
+ title: 配件
+ - section:
+ - path: /devices/audio/
+ title: 概览
+ - path: /devices/audio/terminology
+ title: 术语
+ - section:
+ - path: /devices/audio/implement
+ title: 概览
+ - path: /devices/audio/implement-policy
+ title: 策略配置
+ - path: /devices/audio/implement-shared-library
+ title: 共享库
+ - path: /devices/audio/implement-pre-processing
+ title: 预处理效果
+ title: 实现
+ - path: /devices/audio/data_formats
+ title: 数据格式
+ - path: /devices/audio/attributes
+ title: 属性
+ - path: /devices/audio/warmup
+ title: 预热
+ - section:
+ - path: /devices/audio/latency
+ title: 概览
+ - path: /devices/audio/latency_contrib
+ title: 影响因素
+ - path: /devices/audio/latency_design
+ title: 设计
+ - path: /devices/audio/latency_measure
+ title: 衡量
+ - path: /devices/audio/testing_circuit
+ title: 灯光测试电路
+ - path: /devices/audio/loopback
+ title: 音频环回软件狗
+ - path: /devices/audio/latency_measurements
+ title: 衡量
+ - path: /devices/audio/latency_app
+ title: 应用
+ title: 延迟
+ - path: /devices/audio/avoiding_pi
+ title: 优先级倒置
+ - path: /devices/audio/src
+ title: 采样率转换
+ - path: /devices/audio/debugging
+ title: 调试
+ - section:
+ - path: /devices/audio/midi
+ title: 概览
+ - path: /devices/audio/midi_arch
+ title: MIDI 架构
+ - path: /devices/audio/midi_test
+ title: MIDI 测试程序
+ title: MIDI
+ - path: /devices/audio/usb
+ title: USB 数字音频
+ - path: /devices/audio/tv
+ title: 电视音频
+ title: 音频
+ - path: /devices/automotive
+ title: 汽车
+ - path: /devices/bluetooth
+ title: 蓝牙
+ - section:
+ - path: /devices/camera/
+ title: 概览
+ - path: /devices/camera/camera3
+ title: Camera3
+ - path: /devices/camera/camera3_requests_hal
+ title: HAL 子系统
+ - path: /devices/camera/camera3_metadata
+ title: 元数据和控件
+ - path: /devices/camera/camera3_3Amodes
+ title: 3A 模式和状态
+ - path: /devices/camera/camera3_crop_reprocess
+ title: 输出和剪裁
+ - path: /devices/camera/camera3_error_stream
+ title: 错误和信息流
+ - path: /devices/camera/camera3_requests_methods
+ title: 创建请求
+ - path: /devices/camera/versioning
+ title: 版本支持
+ title: 相机
+ - path: /devices/drm
+ title: DRM
+ - section:
+ - path: /devices/graphics/
+ title: 概览
+ - section:
+ - path: /devices/graphics/architecture
+ title: 概览
+ - path: /devices/graphics/arch-bq-gralloc
+ title: BufferQueue
+ - path: /devices/graphics/arch-sf-hwc
+ title: SurfaceFlinger 和 HWC
+ - path: /devices/graphics/arch-sh
+ title: Surface 和 SurfaceHolder
+ - path: /devices/graphics/arch-egl-opengl
+ title: OpenGL ES
+ - path: /devices/graphics/arch-vulkan
+ title: Vulkan
+ - path: /devices/graphics/arch-sv-glsv
+ title: SurfaceView
+ - path: /devices/graphics/arch-st
+ title: SurfaceTexture
+ - path: /devices/graphics/arch-tv
+ title: TextureView
+ - path: /devices/graphics/arch-gameloops
+ title: 游戏循环
+ title: 架构
+ - section:
+ - path: /devices/graphics/implement
+ title: 概览
+ - path: /devices/graphics/implement-hwc
+ title: 硬件混合渲染器 HAL
+ - path: /devices/graphics/implement-vsync
+ title: VSYNC
+ - path: /devices/graphics/implement-vulkan
+ title: Vulkan
+ - path: /devices/graphics/implement-vdisplays
+ title: 虚拟显示屏
+ title: 实现
+ - section:
+ - path: /devices/graphics/testing
+ title: 概览
+ - path: /devices/graphics/build-tests
+ title: 构建测试程序
+ - path: /devices/graphics/port-tests
+ title: 移植测试框架
+ - path: /devices/graphics/run-tests
+ title: 运行测试
+ - path: /devices/graphics/automate-tests
+ title: 自动执行测试
+ - path: /devices/graphics/test-groups
+ title: 使用特殊测试组
+ - path: /devices/graphics/cts-integration
+ title: 与 Android CTS 集成
+ title: OpenGL ES 测试
+ title: 图形
+ - section:
+ - path: /devices/input/overview
+ title: 概览
+ - path: /devices/input/key-layout-files
+ title: 按键布局文件
+ - path: /devices/input/key-character-map-files
+ title: 按键字符映射文件
+ - path: /devices/input/input-device-configuration-files
+ title: 输入设备配置文件
+ - path: /devices/input/migration-guide
+ title: 迁移指南
+ - path: /devices/input/keyboard-devices
+ title: 键盘设备
+ - path: /devices/input/touch-devices
+ title: 触摸设备
+ - path: /devices/input/diagnostics
+ title: 诊断
+ - path: /devices/input/getevent
+ title: Getevent
+ - path: /devices/input/validate-keymaps
+ title: 验证按键映射
+ title: 输入
+ - section:
+ - path: /devices/media/
+ title: 概览
+ - path: /devices/media/framework-hardening
+ title: 框架安全强化
+ - path: /devices/media/soc
+ title: SoC 依赖项
+ - path: /devices/media/oem
+ title: OEM 依赖项
+ title: 媒体
+ - section:
+ - path: /devices/sensors/
+ title: 概览
+ - path: /devices/sensors/sensor-stack
+ title: 传感器堆栈
+ - path: /devices/sensors/report-modes
+ title: 报告模式
+ - path: /devices/sensors/suspend-mode
+ title: 暂停模式
+ - path: /devices/sensors/power-use
+ title: 耗电量
+ - path: /devices/sensors/interaction
+ title: 互动
+ - path: /devices/sensors/hal-interface
+ title: HAL 接口
+ - path: /devices/sensors/batching
+ title: 批处理
+ - path: /devices/sensors/sensor-types
+ title: 传感器类型
+ - path: /devices/sensors/versioning
+ title: 版本弃用
+ title: 传感器
+ - section:
+ - path: /devices/storage/
+ title: 概览
+ - path: /devices/storage/traditional
+ title: 传统存储设备
+ - path: /devices/storage/adoptable
+ title: 可合并的存储设备
+ - path: /devices/storage/config
+ title: 设备配置
+ - path: /devices/storage/config-example
+ title: 配置示例
+ title: 存储设备
+ - section:
+ - path: /devices/tv
+ title: 概览
+ - path: /devices/tv/hdmi-cec
+ title: HDMI-CEC 控制服务
+ - path: /devices/tv/reference-tv-app
+ title: 参考电视应用
+ title: 电视
+ name: 移植
+ name: 移植
+- lower_tabs:
+ other:
+ - contents:
+ - path: /devices/tech/
+ title: 概览
+ - section:
+ - path: /devices/tech/dalvik
+ title: 概览
+ - path: /devices/tech/dalvik/dalvik-bytecode
+ title: 字节码格式
+ - path: /devices/tech/dalvik/dex-format
+ title: Dex 格式
+ - path: /devices/tech/dalvik/instruction-formats
+ title: 说明格式
+ - path: /devices/tech/dalvik/constraints
+ title: 限制
+ - path: /devices/tech/dalvik/configure
+ title: 配置
+ - path: /devices/tech/dalvik/gc-debug
+ title: 垃圾回收
+ - path: /devices/tech/dalvik/jit-compiler
+ title: JIT 编译
+ title: ART 和 Dalvik
+ - section:
+ - path: /devices/tech/config/
+ title: 概览
+ - path: /devices/tech/config/carrier
+ title: 运营商定制
+ - path: /devices/tech/config/connect_tests
+ title: 网络连接测试
+ - path: /devices/tech/config/filesystem
+ title: 文件系统
+ - path: /devices/tech/config/kernel
+ title: 内核配置
+ - path: /devices/tech/config/kernel_network_tests
+ title: 内核网络测试
+ - path: /devices/tech/config/low-ram
+ title: 低内存
+ - path: /devices/tech/config/namespaces_libraries
+ title: 库的命名空间
+ - path: /devices/tech/config/renderer
+ title: OpenGLRenderer
+ - path: /devices/tech/config/runtime_perms
+ title: 运行时权限
+ - path: /devices/tech/config/uicc
+ title: UICC
+ - path: /devices/tech/config/voicemail
+ title: 可视化语音信箱
+ title: 配置
+ - section:
+ - path: /devices/tech/connect/
+ title: 概览
+ - path: /devices/tech/connect/block-numbers
+ title: 屏蔽电话号码
+ - path: /devices/tech/connect/call-notification
+ title: 来电通知
+ - path: /devices/tech/connect/data-saver
+ title: 流量节省模式
+ - path: /devices/tech/connect/emergency-affordance
+ title: 提供紧急呼叫
+ - path: /devices/tech/connect/felica
+ title: FeliCa 的主机卡模拟
+ - path: /devices/tech/connect/ril
+ title: 无线界面层 (RIL)
+ title: 网络连接
+ - section:
+ - path: /devices/tech/datausage/
+ title: 概览
+ - path: /devices/tech/datausage/iface-overview
+ title: 网络接口统计信息概览
+ - path: /devices/tech/datausage/excluding-network-types
+ title: 从流量使用情况中排除特定网络类型
+ - path: /devices/tech/datausage/tethering-data
+ title: 网络共享流量
+ - path: /devices/tech/datausage/usage-cycle-resets-dates
+ title: 流量统计周期重置日期
+ - path: /devices/tech/datausage/kernel-overview
+ title: 内核概览
+ - path: /devices/tech/datausage/tags-explained
+ title: 已说明的流量使用情况标签
+ - path: /devices/tech/datausage/kernel-changes
+ title: 内核变化
+ title: 流量使用情况
+ - section:
+ - path: /devices/tech/debug/
+ title: 概览
+ - path: /devices/tech/debug/native-crash
+ title: 诊断原生代码崩溃问题
+ - path: /devices/tech/debug/asan
+ title: AddressSanitizer
+ - path: /devices/tech/debug/dumpsys
+ title: Dumpsys
+ - path: /devices/tech/debug/native-memory
+ title: 本地内存使用情况
+ - path: /devices/tech/debug/netstats
+ title: 网络使用情况
+ - path: /devices/tech/debug/procstats
+ title: 内存使用情况
+ title: 调试
+ - section:
+ - path: /devices/tech/admin/
+ title: 概览
+ - path: /devices/tech/admin/implement
+ title: 实现
+ - path: /devices/tech/admin/multi-user
+ title: 多用户
+ - path: /devices/tech/admin/managed-profiles
+ title: 受管理的资料
+ - path: /devices/tech/admin/provision
+ title: 配置
+ - path: /devices/tech/admin/multiuser-apps
+ title: 多用户应用
+ - path: /devices/tech/admin/enterprise-telephony
+ title: 企业电话
+ - path: /devices/tech/admin/testing-provision
+ title: 测试设备配置
+ - path: /devices/tech/admin/testing-setup
+ title: 测试设备管理
+ title: 设备管理
+ - section:
+ - path: /devices/tech/display/
+ title: 概览
+ - path: /devices/tech/display/app-shortcuts
+ title: 应用快捷方式
+ - path: /devices/tech/display/circular-icons
+ title: 圆形图标
+ - path: /devices/tech/display/dnd
+ title: 勿扰模式
+ - path: /devices/tech/display/hdr
+ title: HDR 视频
+ - path: /devices/tech/display/multi-window
+ title: 多窗口模式
+ - path: /devices/tech/display/night-light
+ title: 夜间模式
+ - path: /devices/tech/display/retail-mode
+ title: 零售演示模式
+ title: 显示设置
+ - path: /reference/hal/
+ title: HAL 文件参考
+ - section:
+ - path: /devices/tech/ota/
+ title: 概览
+ - path: /devices/tech/ota/tools
+ title: OTA 工具
+ - path: /devices/tech/ota/block
+ title: 基于块的 OTA
+ - path: /devices/tech/ota/inside_packages
+ title: OTA 软件包内部
+ - path: /devices/tech/ota/device_code
+ title: 设备专属代码
+ - path: /devices/tech/ota/reduce_size
+ title: 减小 OTA 大小
+ - path: /devices/tech/ota/sign_builds
+ title: 签名版本以供发布
+ - path: /devices/tech/ota/ab_updates
+ title: A/B 系统更新
+ title: OTA 更新
+ - section:
+ - path: /devices/tech/power/
+ title: 概览
+ - path: /devices/tech/power/mgmt
+ title: 电源管理
+ - path: /devices/tech/power/performance
+ title: 性能管理
+ - path: /devices/tech/power/component
+ title: 组件电量消耗
+ - path: /devices/tech/power/device
+ title: 设备电源
+ - path: /devices/tech/power/values
+ title: 功率值
+ - path: /devices/tech/power/batterystats
+ title: 电池使用情况
+ title: 电源
+ - section:
+ - path: /devices/tech/test_infra/tradefed/
+ title: 概览
+ - path: /devices/tech/test_infra/tradefed/fundamentals
+ title: 开始使用
+ - path: /devices/tech/test_infra/tradefed/fundamentals/machine_setup
+ title: 机器设置
+ - path: /devices/tech/test_infra/tradefed/fundamentals/devices
+ title: 使用设备
+ - path: /devices/tech/test_infra/tradefed/fundamentals/lifecycle
+ title: 测试生命周期
+ - path: /devices/tech/test_infra/tradefed/fundamentals/options
+ title: 选项处理
+ - path: /devices/tech/test_infra/tradefed/full_example
+ title: 端到端示例
+ - path: /devices/tech/test_infra/tradefed/fundamentals/vts
+ title: 使用 VTS 进行系统测试
+ - path: /reference/tradefed/
+ title: 软件包索引
+ title: 测试基础架构
+ name: 微调
+ name: 微调
+- lower_tabs:
+ other:
+ - contents:
+ - path: /compatibility/
+ title: 简介
+ - path: /compatibility/overview
+ title: 计划概览
+ - section:
+ - path: /compatibility/cdd/
+ title: 概览
+ - path: /compatibility/android-cdd
+ title: 兼容性定义文档(HTML 格式)
+ - path: /compatibility/android-cdd.pdf
+ title: 兼容性定义文档(PDF 格式)
+ title: 兼容性定义
+ - section:
+ - path: /compatibility/cts/
+ title: 概览
+ - path: /compatibility/cts/setup
+ title: 设置 CTS
+ - path: /compatibility/cts/run
+ title: 运行 CTS
+ - section:
+ - path: /compatibility/cts/verifier
+ title: 概览
+ - path: /compatibility/cts/audio-framework
+ title: 音频框架
+ - path: /compatibility/cts/camera-hal
+ title: 相机 HAL 测试
+ - path: /compatibility/cts/near-ultrasound
+ title: 近超声测试
+ - path: /compatibility/cts/rotation-vector
+ title: 旋转矢量交叉检验
+ title: 运行 CTS 验证程序
+ - path: /compatibility/cts/interpret
+ title: 解读结果
+ - path: /compatibility/cts/development
+ title: CTS 开发
+ - path: /compatibility/cts/downloads
+ title: 下载内容
+ title: 兼容性测试套件
+ - path: /compatibility/contact-us
+ title: 与我们联系
+ name: 兼容性
+ name: 兼容性
+- lower_tabs:
+ other:
+ - contents:
+ - path: /reference/
+ title: API 参考
+ - section:
+ - path: /reference/hal/
+ title: 概览
+ - path: /reference/hal/annotated
+ title: 数据结构
+ - path: /reference/hal/classes
+ title: 数据结构索引
+ - path: /reference/hal/functions
+ title: 数据字段
+ - path: /reference/hal/files
+ title: 文件列表
+ - path: /reference/hal/globals
+ title: 全局类型
+ - path: /reference/hal/deprecated
+ title: 已弃用
+ style: accordion
+ title: 硬件抽象层
+ - section:
+ - path: /reference/tradefed/classes
+ title: 类索引
+ - path: /reference/tradefed/packages
+ title: 软件包索引
+ style: accordion
+ title: Trade Federation
+ name: 参考
+ name: 参考
diff --git a/zh-cn/_index.yaml b/zh-cn/_index.yaml
new file mode 100644
index 00000000..f5bd1b06
--- /dev/null
+++ b/zh-cn/_index.yaml
@@ -0,0 +1,69 @@
+project_path: /_project.yaml
+book_path: /_book.yaml
+landing_page:
+ header:
+ buttons:
+ - label: 获取源代码
+ path: /source/downloading
+ rows:
+ - items:
+ - heading: Android 7.1 更新!
+ description: >
+ 移植到最新的 Android 平台,打造深受用户青睐的设备。<style>.devsite-feedback-button {
+ display: none;
+ }
+
+ </style>
+ buttons:
+ - label: 立即更新
+ path: /devices/
+ image_path: /images/landing_icon-porting.png
+ - heading: 保障 Android 安全至关重要
+ description: >
+ 了解 Android 安全计划的运作方式,并了解如何实现最新功能。
+ image_path: /images/landing_icon-security.png
+ buttons:
+ - label: 了解详情
+ path: /security/
+ - heading: 确保兼容性,支持各类应用
+ description: >-
+ 提供与其他 Android 设备一致的体验,并能安装更多应用。
+ image_path: /images/landing_icon-compatibility.png
+ buttons:
+ - label: 测试设备
+ path: /compatibility/
+ - classname: devsite-landing-row-large-headings devsite-landing-row-colored devsite-landing-row-grey
+ devsite-landing-row-no-image-background tf-about-row devsite-landing-row-75
+ items:
+ - heading: Android 开放源代码项目简介
+ description: |
+ Android 是一个支持多种移动设备的开放源代码软件堆栈以及对应的由 Google 领导的开放源代码项目。此网站和 Android 开放源代码项目 (AOSP) 代码库可为您提供所需信息和源代码,供您创建定制的 Android 堆栈版本,将设备和配件移植到 Android 平台,同时确保您的设备符合兼容性要求。
+
+ 此外,我们还希望确保 Android 中不存在一个集中瓶颈(意即没有任何行业参与者可一手限制或控制其他参与者的创新)。这样,我们就可以针对消费类商品打造一个完整的高品质操作系统,并支持对源代码进行定制和移植。
+ image_path: /images/android_stack.png
+ - heading: 新闻
+ items:
+ - heading: 网站改头换面
+ description: >
+ 本网站全新改版,可让您更轻松地浏览、搜索和阅读日益增多的信息。您还可以看看新的标签、页脚和参考资料等。
+ buttons:
+ - label: 2017 年 4 月
+ path: /source/site-updates
+ - heading: 年度安全回顾
+ description: >
+ Android 安全团队已发布其 2016 年年度回顾报告。这份内容全面的报告介绍了 Android 和 Google 为保障用户安全所采取的措施。
+ buttons:
+ - label: 2017 年 3 月 21 日
+ path: http://static.googleusercontent.com/media/source.android.com/en//security/reports/Google_Android_Security_2016_Report_Final.pdf
+ - heading: 3 月 Android 安全公告
+ description: >
+ 2017 年 3 月的 Android 安全公告已经发布,一同发布的还有相关修正程序的链接以及用于 3 月 Android 安全更新补丁的新版本号。
+ buttons:
+ - label: 2017 年 3 月 7 日
+ path: /security/bulletin/2017-03-01
+ - classname: devsite-landing-row-100 tf-row-centered
+ items:
+ - buttons:
+ - classname: button button-primary
+ label: 更多动态
+ path: https://android.googlesource.com/platform/docs/source.android.com/+log/master?no-merges
diff --git a/zh-cn/devices/audio/terminology.html b/zh-cn/devices/audio/terminology.html
new file mode 100644
index 00000000..18640bdb
--- /dev/null
+++ b/zh-cn/devices/audio/terminology.html
@@ -0,0 +1,593 @@
+<html devsite><head>
+ <title>音频术语</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>
+本词汇表收录了与音频相关的术语,其中包括广泛使用的通用术语和 Android 专用术语。
+</p>
+
+<h2 id="genericTerm">通用术语</h2>
+
+<p>
+与音频相关的通用术语的含义都采用其约定俗成的解释。
+</p>
+
+<h3 id="digitalAudioTerms">数字音频</h3>
+<p>
+数字音频术语涉及使用以数字格式编码的音频信号处理声音。如需了解详情,请参阅<a href="http://en.wikipedia.org/wiki/Digital_audio">数字音频</a>。
+</p>
+
+<dl>
+
+<dt>声学</dt>
+<dd>
+对声音的机械属性的研究,例如换能器(音响设备、麦克风等)在设备中的物理位置如何影响听者感知到的音频质量。
+</dd>
+
+<dt>衰减</dt>
+<dd>
+小于或等于 1.0 的乘法因数,应用于音频信号以降低信号电平。与“增益”对应。<em></em>
+</dd>
+
+<dt>音响发烧友</dt>
+<dd>
+追求极致音乐欣赏体验的人,尤其是愿意为音质而在其他方面(花费、组件大小和房间设计等)做出巨大让步的人。如需了解详情,请参阅<a href="http://en.wikipedia.org/wiki/Audiophile">音响发烧友</a>。
+</dd>
+
+<dt>每样本位数或位深</dt>
+<dd>
+每个样本的信息位数。
+</dd>
+
+<dt>声道</dt>
+<dd>
+单个音频信息流,通常与一个录音位置或播放位置相对应。
+</dd>
+
+<dt>缩混</dt>
+<dd>
+减少声道的数量,例如从立体声到单声道或从 5.1 到立体声。缩混通过减少声道、混合声道或更高级的信号处理技术来实现。如果简单地混合声道而不进行衰减或加以限制,则可能会出现溢出或削波的情况。与“扩混”对应。<em></em>
+</dd>
+
+<dt>DSD</dt>
+<dd>
+直接数字流。基于<a href="http://en.wikipedia.org/wiki/Pulse-density_modulation">脉冲密度调制</a>的专有音频编码技术。脉冲编码调制 (PCM) 可将波形编码为多位的个体音频样本序列,而 DSD 可以非常高的采样率将波形编码为位数序列(不涉及样本这一概念)。PCM 和 DSD 均代表按独立序列划分的多个声道。由于我们很难将传统的数字信号处理 (DSP) 算法应用于 DSD,因此 DSD 更适用于内容分发,而不是作为内在体现对象进行处理。DSD 可用于<a href="http://en.wikipedia.org/wiki/Super_Audio_CD">超音频 CD (SACD)</a>,以及针对 USB 的 DoP (DSD over PCM)。如需了解详情,请参阅<a href="http://en.wikipedia.org/wiki/Direct_Stream_Digital">直接数字流</a>。
+</dd>
+
+<dt>闪避</dt>
+<dd>
+当另一个音频流变得活跃时,暂时降低音频流的音量。例如,如果播放音乐时收到一条通知,则音乐会在通知播放时闪避。与“静音”对应。<em></em>
+</dd>
+
+<dt>FIFO</dt>
+<dd>
+先进先出。用于实现数据队列<a href="http://en.wikipedia.org/wiki/FIFO">先进先出</a>的硬件模块或软件数据结构。谈到音频时,存储在队列中的数据通常是音频帧。FIFO 可通过<a href="http://en.wikipedia.org/wiki/Circular_buffer">环形缓冲区</a>来实现。
+</dd>
+
+<dt>帧</dt>
+<dd>
+某个时间点上的样本集,每个声道对应一个样本。
+</dd>
+
+<dt>每缓冲区帧数</dt>
+<dd>
+同时从一个模块传递到另一个模块的帧数。音频 HAL 接口会使用每缓冲区帧数这一概念。
+</dd>
+
+<dt>增益</dt>
+<dd>
+大于或等于 1.0 的乘法因数,应用于音频信号以提高信号电平。与“衰减”对应。<em></em>
+</dd>
+
+<dt>HD 音频</dt>
+<dd>
+高清晰度音频。高解析度音频的同义词(但与 Intel 高清晰度音频不同)。
+</dd>
+
+<dt>Hz</dt>
+<dd>
+采样率或帧率的单位。
+</dd>
+
+<dt>高解析度音频</dt>
+<dd>
+与 CD(立体声 16 位 PCM,44.1 kHz)相比,代表更高的位深和采样率,且支持无损数据压缩。相当于 HD 音频。如需了解详情,请参阅<a href="http://en.wikipedia.org/wiki/High-resolution_audio">高解析度音频</a>。
+</dd>
+
+<dt>延时</dt>
+<dd>
+信号通过系统时的延迟时间。
+</dd>
+
+<dt>无损</dt>
+<dd>
+可在编码和解码的过程中保持位精度的<a href="http://en.wikipedia.org/wiki/Lossless_compression">无损数据压缩算法</a>;使用这种算法时,如果对之前编码的数据进行解码,得到的结果与原始数据相当。无损音频内容分发格式包括 <a href="http://en.wikipedia.org/wiki/Compact_disc">CD</a>、<a href="http://en.wikipedia.org/wiki/WAV">WAV</a> 中的 PCM,以及 <a href="http://en.wikipedia.org/wiki/FLAC">FLAC</a> 等。创作过程可能会导致位深或采样率相较于<a href="http://en.wikipedia.org/wiki/Audio_mastering">母版</a>有所下降;可保持母版的解析度和位精确度的分发格式是高解析度音频的载体。
+</dd>
+
+<dt>有损</dt>
+<dd>
+尝试在编码和解码的过程中保留最重要媒体特征的<a href="http://en.wikipedia.org/wiki/Lossy_compression">有损数据压缩算法</a>;使用这种算法时,如果对之前编码的数据进行解码,得到的结果与原始数据看似相似,但并不完全相同。使用有损音频压缩算法的格式包括 MP3 和 AAC 等。由于模拟值来自连续的域,而数字值是离散的,因此就振幅而言,ADC 和 DAC 属于有损转换。另请参阅“透明度”。<em></em>
+</dd>
+
+<dt>单声道</dt>
+<dd>
+一个声道。
+</dd>
+
+<dt>多声道</dt>
+<dd>
+请参阅环绕声。<em></em>严格来讲,立体声指多个声道,可以视为多声道;不过,由于这种用法会令人感到困惑,因此请避免使用。<em></em>
+</dd>
+
+<dt>静音</dt>
+<dd>
+暂时强制将音量降为 0;独立于通常使用的音量控件。
+</dd>
+
+<dt>溢出</dt>
+<dd>
+未能在一定的时间内接受提供的数据而导致的听得到的<a href="http://en.wikipedia.org/wiki/Glitch">短时脉冲波干扰</a>。如需了解详情,请参阅<a href="http://en.wikipedia.org/wiki/Buffer_underrun">缓冲区欠载</a>。与“欠载”对应。<em></em>
+</dd>
+
+<dt>平移</dt>
+<dd>
+将一个信号移至立体声或多声道音场中的相应位置。
+</dd>
+
+<dt>PCM</dt>
+<dd>
+脉冲编码调制。最常见的低级别数字音频编码形式。以有规律的间隔对音频信号取样(称为采样率),然后根据位深对特定范围内的离散值进行量化。例如,对于 16 位 PCM,样本值是介于 -32768 到 +32767 之间的整数值。
+</dd>
+
+<dt>斜坡</dt>
+<dd>
+逐渐提高或降低特定音频参数(如音量或某种音效的强度)的级别。音量斜坡一般用于暂停和继续播放音乐,以免出现听得到的生硬过渡。
+</dd>
+
+<dt>样本</dt>
+<dd>
+代表某个时间点上一个声道的音频值的数字。
+</dd>
+
+<dt>采样率或帧率</dt>
+<dd>
+每秒帧数。“帧率”这一用法更为准确,但业内习惯使用“采样率”来表示帧率。<em></em><em></em>
+</dd>
+
+<dt>可听化</dt>
+<dd>
+使用声音表达反馈或信息,例如触摸音效和键盘音效。
+</dd>
+
+<dt>立体声</dt>
+<dd>
+两个声道。
+</dd>
+
+<dt>立体声展宽</dt>
+<dd>
+应用于立体声信号的一种音效,能使可听得到的另一立体声信号更饱满丰富。该音效也可应用于单声道信号;在单声道信号中,它属于扩混。
+</dd>
+
+<dt>环绕声</dt>
+<dd>
+增强听众感知声音位置(不仅仅是立体声的左右声道)的能力的技术。
+</dd>
+
+<dt>透明度</dt>
+<dd>
+有损数据压缩的理想效果。如果人类主体从感觉上无法区分原始音频和压缩结果,则表示有损数据转换是透明的。如需了解详情,请参阅<a href="http://en.wikipedia.org/wiki/Transparency_%28data_compression%29">透明度</a>。
+
+</dd>
+
+<dt>欠载</dt>
+<dd>
+未能在一定的时间内提供所需数据而导致的听得到的<a href="http://en.wikipedia.org/wiki/Glitch">短时脉冲波干扰</a>。如需了解详情,请参阅<a href="http://en.wikipedia.org/wiki/Buffer_underrun">缓冲区欠载</a>。与“溢出”对应。<em></em>
+</dd>
+
+<dt>扩混</dt>
+<dd>
+增加声道的数量,例如从单声道到立体声或从立体声到环绕声。扩混通过复制、平移或更高级的信号处理技术来实现。与“缩混”对应。<em></em>
+</dd>
+
+<dt>虚拟音效</dt>
+<dd>
+尝试使音频声道空间化的音效,例如,尝试模拟更多扬声器,或给人一种声音来自某个位置的错觉。
+</dd>
+
+<dt>音量</dt>
+<dd>
+响度,音频信号的主观强度。
+</dd>
+
+</dl>
+
+<h3 id="interDeviceTerms">设备间互连</h3>
+
+<p>
+设备间互连技术用于将各设备的音频和视频组件连接起来,用户可通过外部连接器从视觉上直观感受到这些技术。HAL 实现人员和最终用户应了解以下术语。
+</p>
+
+<dl>
+
+<dt>蓝牙</dt>
+<dd>
+近距离无线技术。要详细了解与音频相关的<a href="http://en.wikipedia.org/wiki/Bluetooth_profile">蓝牙规范</a>和<a href="http://en.wikipedia.org/wiki/Bluetooth_protocols">蓝牙协议</a>,请参阅 <a href="http://en.wikipedia.org/wiki/Bluetooth_profile#Advanced_Audio_Distribution_Profile_.28A2DP.29">A2DP</a> 了解音乐方面的信息、参阅 <a href="http://en.wikipedia.org/wiki/Bluetooth_protocols#Synchronous_connection-oriented_.28SCO.29_link">SCO</a> 了解电话方面的信息,以及<a href="http://en.wikipedia.org/wiki/List_of_Bluetooth_profiles#Audio.2FVideo_Remote_Control_Profile_.28AVRCP.29">音频/视频远程控制规范 (AVRCP)</a>。
+</dd>
+
+<dt>DisplayPort</dt>
+<dd>
+视频电子标准协会 (VESA) 制订的数字显示接口。
+</dd>
+
+<dt>外接小配件</dt>
+<dd>
+<a href="https://en.wikipedia.org/wiki/Dongle">外接小配件</a>是一种小工具,特指可直接插入到其他设备上的小工具。
+</dd>
+
+<dt>HDMI</dt>
+<dd>
+高清晰度多媒体接口,用于传输音频和视频数据。移动设备上会使用微型 HDMI(D 型)或 MHL 连接器。
+</dd>
+
+<dt>Intel HDA</dt>
+<dd>
+Intel 高清晰度音频(请不要与泛指的“高清晰度音频”或“高解析度音频”混淆);<em></em><em></em>一种前面板连接器规范。如需了解详情,请参阅 <a href="http://en.wikipedia.org/wiki/Intel_High_Definition_Audio">Intel 高清晰度音频</a>。
+</dd>
+
+<dt>接口</dt>
+<dd>
+<a href="https://en.wikipedia.org/wiki/Interface_(computing)">接口</a>可将信号从一种表现形式转换为另一种。常见的接口包括 USB 音频接口和 MIDI 接口。
+</dd>
+
+<dt>线缆电平</dt>
+<dd>
+<a href="http://en.wikipedia.org/wiki/Line_level">线路电平</a>是指在不同音频组件(而非换能器)之间传输的模拟音频信号的强度。
+</dd>
+
+<dt>MHL</dt>
+<dd>
+移动高清连接技术。一种移动音频/视频接口,通常通过 micro-USB 连接器进行数据传输。
+</dd>
+
+<dt>手机连接器</dt>
+<dd>
+连接设备和有线头戴式耳机、耳麦或线路电平放大器的小型或超小型组件。
+</dd>
+
+<dt>SlimPort</dt>
+<dd>
+micro-USB 转 HDMI 的适配器。
+</dd>
+
+<dt>S/PDIF</dt>
+<dd>
+Sony/Philips 数字接口格式,用于未压缩的 PCM 音频的互连。如需了解详情,请参阅 <a href="http://en.wikipedia.org/wiki/S/PDIF">S/PDIF</a>。S/PDIF 是 <a href="https://en.wikipedia.org/wiki/AES3">AES3</a> 的消费级版本。
+</dd>
+
+<dt>Thunderbolt</dt>
+<dd>
+与 USB 和 HDMI 竞争的一种多媒体接口,用于连接高端外围设备。如需了解详情,请参阅 <a href="http://en.wikipedia.org/wiki/Thunderbolt_%28interface%29">Thunderbolt</a>。
+</dd>
+
+<dt>TOSLINK</dt>
+<dd>
+<a href="https://en.wikipedia.org/wiki/TOSLINK">TOSLINK</a> 是一种配合 S/PDIF 使用的光纤音频数据线。<em></em></dd>
+
+<dt>USB</dt>
+<dd>
+通用串行总线。如需了解详情,请参阅 <a href="http://en.wikipedia.org/wiki/USB">USB</a>。
+</dd>
+
+</dl>
+
+<h3 id="intraDeviceTerms">设备内互连</h3>
+
+<p>
+设备内互连技术用于将一台设备内的不同音频组件连接起来,如果不拆开设备,则无法从视觉上直观感受到这些技术。HAL 实现人员可能需要了解以下术语,但最终用户不需要。要详细了解设备内互连,请参阅下列文章:
+</p>
+<ul>
+<li><a href="http://en.wikipedia.org/wiki/General-purpose_input/output">GPIO</a></li>
+<li><a href="http://en.wikipedia.org/wiki/I%C2%B2C">I²C</a>,用于控制声道</li>
+<li><a href="http://en.wikipedia.org/wiki/I%C2%B2S">I²S</a>,用于音频数据,比 SLIMbus 简单</li>
+<li><a href="http://en.wikipedia.org/wiki/McASP">McASP</a></li>
+<li><a href="http://en.wikipedia.org/wiki/SLIMbus">SLIMbus</a></li>
+<li><a href="http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus">SPI</a></li>
+<li><a href="http://en.wikipedia.org/wiki/AC%2797">AC'97</a></li>
+<li><a href="http://en.wikipedia.org/wiki/Intel_High_Definition_Audio">Intel HDA</a></li>
+<li><a href="http://mipi.org/specifications/soundwire">SoundWire</a></li>
+</ul>
+
+<p>
+在 <a href="http://www.alsa-project.org/main/index.php/ASoC">ALSA 系统芯片 (ASoC)</a> 中,以上统称为<a href="https://www.kernel.org/doc/Documentation/sound/alsa/soc/DAI.txt">数字音频接口</a> (DAI)。
+</p>
+
+<h3 id="signalTerms">音频信号路径</h3>
+
+<p>
+音频信号路径术语涉及音频数据从应用传输到换能器(反之亦然)的信号路径。
+</p>
+
+<dl>
+
+<dt>ADC</dt>
+<dd>
+模拟转数字转换器。用于将模拟信号(在时间和振幅上保持连续的信号)转换为数字信号(在时间和振幅上离散的信号)的模块。从概念上讲,一个 ADC 包含一个周期性采样保持器,后跟一个量化器(尽管并不一定需要采用这种方式)。ADC 前面通常有一个低通滤波器,用来滤除通过目标采样率无法呈现的所有高频分量。如需了解详情,请参阅<a href="http://en.wikipedia.org/wiki/Analog-to-digital_converter">模拟转数字转换器</a>。
+</dd>
+
+<dt>AP</dt>
+<dd>
+应用处理器。移动设备上的主要通用计算系统。
+</dd>
+
+<dt>编解码器</dt>
+<dd>
+编码器和解码器,用于将音频信号从一种表现形式编码和/或解码成另一种表现形式(通常是从模拟信号到 PCM 或从 PCM 到模拟信号)。严格来讲,“编解码器”同时指编码和解码模块,但也可仅泛指其中一个。<em></em>如需了解详情,请参阅<a href="http://en.wikipedia.org/wiki/Audio_codec">音频编解码器</a>。
+</dd>
+
+<dt>DAC</dt>
+<dd>
+数字转模拟转换器,用于将数字信号(在时间和振幅上离散的信号)转换为模拟信号(在时间和振幅上保持连续的信号)的模块。DAC 后面通常有一个低通滤波器,用来滤除由数字量化引入的高频分量。如需了解详情,请参阅<a href="http://en.wikipedia.org/wiki/Digital-to-analog_converter">数字转模拟转换器</a>。
+</dd>
+
+<dt>DSP</dt>
+<dd>
+数字信号处理器。可选组件,通常位于应用处理器之后(用于输出)或之前(用于输入)。主要用途是减轻应用处理器的负担,并以较低的功耗提供信号处理功能。
+</dd>
+
+<dt>PDM</dt>
+<dd>
+脉冲密度调制。用于按数字信号表示模拟信号的调制形式,其中相对密度 1s 和 0s 表示信号电平。通常用于数字转模拟转换器。如需了解详情,请参阅<a href="http://en.wikipedia.org/wiki/Pulse-density_modulation">脉冲密度调制</a>。
+</dd>
+
+<dt>PWM</dt>
+<dd>
+脉冲宽度调制。用于按数字信号表示模拟信号的调制形式,其中数字脉冲的相对宽度表示信号电平。通常用于模拟转数字转换器。如需了解详情,请参阅<a href="http://en.wikipedia.org/wiki/Pulse-width_modulation">脉冲宽度调制</a>。
+</dd>
+
+<dt>换能器</dt>
+<dd>
+将现实世界物理量中的变量转换为电信号。在音频中,物理量是声压,而换能器是扬声器和麦克风。如需了解详情,请参阅<a href="http://en.wikipedia.org/wiki/Transducer">换能器</a>。
+</dd>
+
+</dl>
+
+<h3 id="srcTerms">采样率转换</h3>
+<p>
+采样率转换术语涉及从一种采样率转换为另一种采样率的过程。
+</p>
+
+<dl>
+
+<dt>降采样</dt>
+<dd>重新采样,其中接收器采样率 &lt; 信号源采样率。</dd>
+
+<dt>奈奎斯特频率</dt>
+<dd>
+可由离散信号以指定采样率的一半表示的最大频率分量。例如,由于人类的听力范围可达到近 20 kHz,因此数字音频信号的采样率必须至少有 40 kHz 才能代表该范围。在实践中,44.1 kHz 和 48 kHz 的采样率比较常用,而比较常用的奈奎斯特频率则为 22.05 kHz 和 24 kHz。如需了解详情,请参阅<a href="http://en.wikipedia.org/wiki/Nyquist_frequency">奈奎斯特频率</a>和<a href="http://en.wikipedia.org/wiki/Hearing_range">听力范围</a>。
+</dd>
+
+<dt>重采样器</dt>
+<dd>采样率转换器的同义词。</dd>
+
+<dt>重新采样</dt>
+<dd>转换采样率的过程。</dd>
+
+<dt>采样率转换器</dt>
+<dd>执行重新采样的模块。</dd>
+
+<dt>接收器</dt>
+<dd>重采样器的输出。</dd>
+
+<dt>信源</dt>
+<dd>重采样器的输入。</dd>
+
+<dt>升采样</dt>
+<dd>重新采样,其中接收器采样率 &gt; 信源采样率。</dd>
+
+</dl>
+
+<h2 id="androidSpecificTerms">Android 专用术语</h2>
+
+<p>
+Android 专用术语包括仅在 Android 音频框架中使用的术语,以及在 Android 中具有特殊意义的通用术语。
+</p>
+
+<dl>
+
+<dt>ALSA</dt>
+<dd>
+高级 Linux 声音体系。Linux 的音频框架,对其他系统也有影响。要了解通用定义,请参阅 <a href="http://en.wikipedia.org/wiki/Advanced_Linux_Sound_Architecture">ALSA</a>。在 Android 中,ALSA 指的是内核音频框架和驱动程序,而不是用户模式 API。另请参阅“tinyalsa”。<em></em>
+</dd>
+
+<dt>音频设备</dt>
+<dd>
+以 HAL 为基础的音频 I/O 端点。
+</dd>
+
+<dt>AudioEffect</dt>
+<dd>
+用于输出(处理后)音效与输入(处理前)音效的 API 和实现框架。该 API 在 <a href="http://developer.android.com/reference/android/media/audiofx/AudioEffect.html">android.media.audiofxAudioEffect</a> 中进行了定义。
+</dd>
+
+<dt>AudioFlinger</dt>
+<dd>
+Android 声音服务器实现用例。AudioFlinger 在 mediaserver 进程中运行。要了解通用定义,请参阅<a href="http://en.wikipedia.org/wiki/Sound_server">声音服务器</a>。
+</dd>
+
+<dt>音频焦点</dt>
+<dd>
+跨多个独立应用管理音频互动的 API 集。如需了解详情,请参阅<a href="http://developer.android.com/training/managing-audio/audio-focus.html">管理音频焦点</a>以及与焦点相关的方法和 <a href="http://developer.android.com/reference/android/media/AudioManager.html">android.media.AudioManager</a> 的常量。
+</dd>
+
+<dt>AudioMixer</dt>
+<dd>
+AudioFlinger 中的模块,负责合并多个音轨以及应用衰减(音量)和音效。要了解通用定义,请参阅<a href="http://en.wikipedia.org/wiki/Audio_mixing_(recorded_music)">混音(录制的音乐)</a>(将混合器作为一个硬件设备或软件应用而非系统中的软件模块)。
+</dd>
+
+<dt>音频政策</dt>
+<dd>
+负责所有需要先做出政策决策的操作的服务,例如打开新的 I/O 音频流、更改后重新路由,以及音频流音量管理。
+</dd>
+
+<dt>AudioRecord</dt>
+<dd>
+用于从麦克风等音频输入设备接收数据的主要低级别客户端 API。相应数据通常为 PCM 格式。该 API 在 <a href="http://developer.android.com/reference/android/media/AudioRecord.html">android.media.AudioRecord</a> 中进行了定义。
+</dd>
+
+<dt>AudioResampler</dt>
+<dd>
+AudioFlinger 中的模块,负责<a href="src.html">采样率转换</a>。
+</dd>
+
+<dt>音频来源</dt>
+<dd>
+常量的一种枚举,用于为捕获音频输入指明目标使用情形。如需了解详情,请参阅<a href="http://developer.android.com/reference/android/media/MediaRecorder.AudioSource.html">音频来源</a>。对于 21 级及以上级别的 API,建议使用<a href="attributes.html">音频属性</a>。
+</dd>
+
+<dt>AudioTrack</dt>
+<dd>
+用于向音响设备等音频输出设备发送数据的主要低级别客户端 API。相应数据通常为 PCM 格式。该 API 在 <a href="http://developer.android.com/reference/android/media/AudioTrack.html">android.media.AudioTrack</a> 中进行了定义。
+</dd>
+
+<dt>audio_utils</dt>
+<dd>
+PCM 格式转换、WAV 文件 I/O 以及<a href="avoiding_pi.html#nonBlockingAlgorithms">非阻塞 FIFO</a> 等功能的音频实用程序库,很大程度上独立于 Android 平台。
+</dd>
+
+<dt>客户端</dt>
+<dd>
+通常指一个应用或应用客户端。不过,AudioFlinger 客户端可以是一个在 mediaserver 系统进程中运行的线程,例如,播放由 MediaPlayer 对象解码的媒体内容时。
+</dd>
+
+<dt>HAL</dt>
+<dd>
+硬件抽象层。HAL 在 Android 中是通用术语;涉及音频时,它是介于 AudioFlinger 和内核设备驱动程序之间的一个层,具有一个 C 语言编写的 API(取代了 C++ libaudio)。
+</dd>
+
+<dt>FastCapture</dt>
+<dd>
+AudioFlinger 中的线程。经配置,它会向延迟时间较短的 fast track 发送音频数据,并驱动输入设备的运行,以缩短延迟时间。
+</dd>
+
+<dt>FastMixer</dt>
+<dd>
+AudioFlinger 中的线程。经配置,它会从延迟时间较短的 fast track 接收并混合音频数据,同时驱动主要输出设备的运行,以缩短延迟时间。
+</dd>
+
+<dt>fast track</dt>
+<dd>
+部分设备和路由中具有较短延迟时间但功能较少的 AudioTrack 或 AudioRecord 客户端。
+</dd>
+
+<dt>MediaPlayer</dt>
+<dd>
+比 AudioTrack 级别更高的客户端 API。播放已编码的内容或包含多媒体音频和视频音轨的内容。
+</dd>
+
+<dt>media.log</dt>
+<dd>
+仅在定制版本中提供的 AudioFlinger 调试功能。用于在环形缓冲区中记录音频事件,然后可以根据需要倒回去撤消这些活动。
+</dd>
+
+<dt>mediaserver</dt>
+<dd>
+Android 系统进程,包含 AudioFlinger 等与媒体相关的服务。
+</dd>
+
+<dt>NBAIO</dt>
+<dd>
+非阻塞音频输入/输出,AudioFlinger 端口的抽象表示。此术语有一定的歧义,因为部分 NBAIO API 实现用例支持阻塞。NBAIO 的主要实现用例适用于不同的管道类型。
+</dd>
+
+<dt>常规混合器</dt>
+<dd>
+AudioFlinger 中的线程,可用于大部分功能完善的 AudioTrack 客户端。它能直接驱动输出设备的运行,或通过管道将其子混音输入 FastMixer。
+</dd>
+
+<dt>OpenSL ES</dt>
+<dd>
+<a href="http://www.khronos.org/">Khronos 集团</a>推行的音频 API 标准。API 级别为 9 或更高级别的 Android 版本都支持原生音频 API(基于 <a href="http://www.khronos.org/opensles/">OpenSL ES 1.0.1</a> 的部分标准)。
+</dd>
+
+<dt>静音模式</dt>
+<dd>
+可由用户设置、用于将手机振铃器和通知设为静音而不会影响媒体内容播放(音乐、视频和游戏)或闹钟的功能。
+</dd>
+
+<dt>SoundPool</dt>
+<dd>
+比 AudioTrack 级别更高的客户端 API,用于播放通过采样得到的音频片段。适用于触发界面反馈、游戏音效等。该 API 在 <a href="http://developer.android.com/reference/android/media/SoundPool.html">android.media.SoundPool</a> 中进行了定义。
+</dd>
+
+<dt>Stagefright</dt>
+<dd>
+请参阅<a href="/devices/media.html">媒体</a>。
+</dd>
+
+<dt>StateQueue</dt>
+<dd>
+AudioFlinger 中的模块,负责同步线程之间的状态。NBAIO 用于传递数据,而 StateQueue 用于传递控制信息。
+</dd>
+
+<dt>策略</dt>
+<dd>
+具有类似行为的音频流类型构成的组,用于音频政策服务。
+</dd>
+
+<dt>音频流类型</dt>
+<dd>
+表示音频输出使用情形的枚举。音频政策的实现使用音频流类型以及其他参数来确定音量和路由决策。要查看音频流类型的列表,请参阅 <a href="http://developer.android.com/reference/android/media/AudioManager.html">android.media.AudioManager</a>。
+</dd>
+
+<dt>tee sink</dt>
+<dd>
+请参阅<a href="debugging.html#teeSink">音频调试</a>。
+</dd>
+
+<dt>tinyalsa</dt>
+<dd>
+ALSA 内核之上具有 BSD 许可的小型用户模式 API。建议用于实现 HAL。
+</dd>
+
+<dt>ToneGenerator</dt>
+<dd>
+比 AudioTrack 级别更高的客户端 API,用于播放双音多频 (DTMF) 信号。如需了解详情,请参阅<a href="http://en.wikipedia.org/wiki/Dual-tone_multi-frequency_signaling">双音多频信号</a>和 <a href="http://developer.android.com/reference/android/media/ToneGenerator.html">android.media.ToneGenerator</a> 中的 API 定义。
+</dd>
+
+<dt>音轨</dt>
+<dd>
+音频流。由 AudioTrack 或 AudioRecord API 控制。
+</dd>
+
+<dt>音量衰减曲线</dt>
+<dd>
+对于给定输出,音量衰减曲线指从通用音量指数到特定衰减因数的设备专属映射。
+</dd>
+
+<dt>音量指数</dt>
+<dd>
+表示某个音频流的目标相对音量的整数(没有单位)。<a href="http://developer.android.com/reference/android/media/AudioManager.html">android.media.AudioManager</a> 的与音量相关的 API 在运行时会采用音量指数(而非绝对的衰减因数)。
+</dd>
+
+</dl>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/legal.html b/zh-cn/legal.html
new file mode 100644
index 00000000..268378c5
--- /dev/null
+++ b/zh-cn/legal.html
@@ -0,0 +1,48 @@
+<html devsite><head>
+ <title>法律声明</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<div class="wrap">
+
+ <div class="landing-banner">
+
+ <p>Android 由 Google Inc. 和<a href="http://www.openhandsetalliance.com/">开放手机联盟</a> (Open Handset Alliance) 联合开发。为了履行打造开放、自由和创新的移动环境的承诺,我们将其作为开发平台提供给您。</p>
+
+ </div>
+
+<h2 id="Brands">Android 品牌</h2>
+
+<p>“Android”名称、<img src="/source/assets/images/sac_logo.png" alt="Android" style="margin:0;padding:0 2px;vertical-align:baseline"/> 徽标和<a href="http://www.google.com/permissions/">其他商标</a>均为 Google Inc. 的财产。</p>
+
+<p>要了解更多详情,请参阅<a href="/source/brands.html">品牌指南</a>。</p>
+
+<h2 id="WebSite">网站内容</h2>
+
+<p>我们非常乐意根据相应条款授权您使用本网站上的 Android 文档和示例代码,这些条款鼓励您根据需要采用、修改、重复使用、改编和混编内容。本网站上的文档内容作为 <a href="https://android.googlesource.com/">Android 开放源代码项目</a>的一部分向您提供。我们根据 <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache 2.0 许可</a>授权您使用本文档(包括其中显示的所有代码),另根据 <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0</a> 许可授权您使用本网站上除许可文档本身以外的所有其他内容,另有说明的情况除外。
+</p>
+
+<p>要详细了解本网站内容的许可方式以及关于重复使用的限制,请参阅完整的<a href="license.html">内容许可</a>。</p>
+
+<p>使用本网站时,您需要遵循 <a href="http://www.google.com/policies/">Google 的隐私权政策和服务条款</a>。</p>
+
+<div>
+
+</div></div></body></html> \ No newline at end of file
diff --git a/zh-cn/license.html b/zh-cn/license.html
new file mode 100644
index 00000000..7e9204e7
--- /dev/null
+++ b/zh-cn/license.html
@@ -0,0 +1,132 @@
+<html devsite><head>
+ <title>内容许可</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>为了方便授予许可,本网站的内容分为以下两类:</p>
+<ul>
+ <li>文档内容,包括静态文档和从源代码模块中提取的内容,以及示例代码</li>
+<li>网站上的所有其他内容</li>
+</ul>
+
+<p>本网站上的文档内容作为 <a href="https://android.googlesource.com/">Android 开放源代码项目</a>的一部分向您提供。我们根据 <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache 2.0 许可</a>(Android 开放源代码项目所有组成部分的首选许可)授权您使用本文档(包括其中显示的所有代码)。</p>
+
+<p>Apache 2.0 是适用于开放源代码的商业软件许可。大多数 Android 平台和文档都是根据 Apache 2.0 许可授权用户使用。尽管该项目会尽可能遵循此首选许可,但也可能存在例外情况,例如,如果文档(代码注释)的提取来源是根据 GPLv2 或其他许可授权的源代码模块。在这些情况下,源代码模块所遵循的许可将适用于从源代码模块中提取的文档。要了解用于生成文档并需要根据许可注明出处的源代码模块,请查看下文的<a href="#doclicenses">“文档许可”部分</a>。</p>
+
+<p>本网站的第三方组件(例如 JavaScript 库)已根据其作者指定的许可纳入 Android 开放源代码项目。要了解这些许可,请参阅 Android 开放源代码项目中的源代码文件。</p>
+
+<p>对于本网站上的所有其他内容(许可文档本身除外),我们均根据 <a href="https://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0</a> 许可授权您使用,另有说明的情况除外。</p>
+
+<p>只要符合相应内容的特定许可(如上所述),您就可以以任何方式使用本网站的内容。对于根据 Creative Commons Attribution 3.0 许可授权您使用的内容,我们会要求您注明相应的<a href="#attribution">出处</a>。</p>
+
+<h2 id="terms">使用条款</h2>
+
+<p>我们非常乐意根据相应条款授权您使用 Android 文档和示例代码,这些条款鼓励您根据需要采用、修改、重复使用、改编或混编此类内容。您可以在自己的作品中随意使用文档内容,除非下文的<a href="#restrictions">限制</a>部分另有说明。例如,您可以在一本书中引用相应的文字,将某些部分的内容剪切并粘贴到您的博客中,将相应内容录制成有声读物供视障人士收听,甚至还可以将相应内容翻译成其他语言。</p>
+
+<h2 id="restrictions">限制</h2>
+
+<ul>
+<li>尽管我们根据 Apache 2.0 许可向您提供文档本身,但请注意,该许可并未涵盖专有商标和品牌特征。</li>
+
+<li>该许可未涵盖 Google 的商标和其他品牌特征(包括 <img src="https://developer.android.com/images/android-logo.png" alt="Android" style="margin:0;padding:0 2px;vertical-align:baseline"/> 这种特殊样式的字体徽标)。要了解具体使用情况的相关信息,请参阅<a href="https://developer.android.com/distribute/marketing-tools/brand-guidelines.html">品牌指南</a>。</li>
+
+<li>在某些情况下,网页中可能会包含该许可未涵盖的内容(例如图片)。在这种情况下,我们会为未许可的内容添加标签。</li>
+
+<li>此外,除非特别说明,该许可一律不适用于该网站上网页中的链接所指向的内容。例如,网页上的链接可能会指向不适用于该许可的视频或幻灯片。</li>
+
+<li>使用 SDK 中提供(或本文档中显示)的示例源代码时,需遵循 <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache 2.0 许可</a>中详述的条件。</li>
+</ul>
+
+<h2 id="attribution">注明出处</h2>
+<p>当您重复使用网页上显示的根据 Creative Commons Attribution 许可条款提供的内容或创建其修改版本时,需注明相应的出处。在该网站上,需注明出处的要求仅适用于非文档内容(如上文所述)。要了解关于注明出处的完整要求,请参阅 <a href="https://creativecommons.org/licenses/by/3.0/legalcode">Creative Commons 法律规定</a>的 4b 部分。
+</p>
+<p>在实际使用情形中,我们要求您根据创作作品所用媒介的特点,尽一切可能注明出处来自 Android 开放源代码项目。此要求可能适用于以下几种典型方式:</p>
+<h3>原样复制</h3>
+<p>
+如果您的在线作品原样复制本网站中的全部或部分文字或图片,请在网页底部附上以下这段内容:<em></em>
+</p>
+<p style="margin-left:20px;font-style:italic">
+ 本网页的部分内容是从 <a href="https://code.google.com/p/android/">Android 开放源代码项目</a>原创及共享作品中复制的,须遵照 <a href="https://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 许可</a>所述条款付诸应用。
+
+</p>
+<p>此外,请提供指向原始来源网页的链接,以便用户可以参阅相应网页,了解更多信息。
+</p>
+<h3>经过修改的版本</h3>
+<p>如果您的在线作品会显示在本网站内容的基础上修改的文字或图片,请在您的网页底部附上以下这段内容:<em></em></p>
+<p style="margin-left:20px;font-style:italic">本网页的部分内容是在 <a href="https://code.google.com/p/android/">Android 开放源代码项目</a>原创及共享作品的基础上修改而成的,须遵照 <a href="https://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 许可</a>所述条款付诸应用。
+</p>
+<p>再次提醒,请提供指向原始来源网页的链接,以便用户可以参阅相应网页,了解更多信息。在对相应内容完成修改后,尤其要谨记这一点。
+</p>
+<h3>其他媒体</h3>
+<p>如果您要制作非超文本作品(如图书、音频或视频),我们要求您本着上述精神尽可能提供语音或文字形式的出处说明。
+</p>
+
+<h2 id="doclicenses">文档许可</h2>
+<h3 id="icu">ICU 许可</h3>
+<p>Android 公共 API 文档中包含来自下列源代码库的内容(根据 ICU 许可授权):</p>
+<ul>
+<li><a href="https://developer.android.com/reference/android/icu/lang/package-summary.html">android.icu.lang</a></li>
+<li><a href="https://developer.android.com/reference/android/icu/math/package-summary.html">android.icu.math</a></li>
+<li><a href="https://developer.android.com/reference/android/icu/text/package-summary.html">android.icu.text</a></li>
+<li><a href="https://developer.android.com/reference/android/icu/util/package-summary.html">android.icu.util</a></li>
+</ul>
+
+<div class="aside" style="overflow:scroll; height:250px;">
+<p>版权和权限声明</p>
+
+<p>版权所有 (c) 1995-2015 国际商业机器股份有限公司 (IBM) 及其他</p>
+<p>保留所有权利。
+</p>
+<p>特此向获得本软件的副本及相关文档文件(以下简称“本软件”)的所有人员免费授予不受限制地处理本软件的权限(包括但不限于使用、复制、修改、合并、发布、分发和/或销售本软件的副本的权利)以及允许获装本软件的人员进行上述处理的权限,但前提是本软件的所有副本和支持文档中均包含上述版权声明和本权限声明。
+</p>
+<p>本软件按“原样”提供,不提供任何形式(明示或暗示)的保证,包括但不限于针对适销性、特定用途适合性以及不对第三方构成侵权的保证。在任何情况下,对于因使用本软件或本软件的性能造成的以及与使用本软件或本软件的性能相关的任何索赔、任何特殊的间接或继发损失,或任何因本软件无法使用、数据丢失或利润损失(无论是否已提起合同诉讼)、疏忽或其他侵权行为造成的损失,本声明中提到的版权持有者均不承担任何责任。</p>
+<p>除非本声明中另有规定,否则在未事先征得版权持有者书面授权的情况下,不得在广告中使用版权持有者的名称,也不得将版权持有者的名称用于宣传本软件的销售、使用或其他处理事宜。
+</p>
+</div>
+
+<h3 id="w3c_license">W3C 软件和文档声明及许可</h3>
+<p>Android 公共 API 文档中包含来自以下源代码库的内容(根据 W3C 软件和文档声明及许可授权):</p>
+<ul>
+<li><a href="https://developer.android.com/reference/org/w3c/dom/package-summary.html">org.w3c.dom</a></li>
+<li><a href="https://developer.android.com/reference/org/w3c/dom/ls/package-summary.html">org.w3c.dom.ls</a></li>
+</ul>
+
+<div class="aside" style="overflow:scroll; height:250px;">
+<p>本作品目前是由版权持有者根据以下许可提供。</p>
+<h5>许可</h5>
+<p>获取和/或复制本作品,即表示您(被许可人)承认您已阅读、了解并同意遵守以下条款及条件。
+</p>
+<p>只要您在此作品的所有副本或部分内容(包括修改内容)中满足以下要求,即授予您出于任何目的复制、修改和分发本作品的权限(无论是否修改,均免一切费用或税费):</p>
+<ul>
+<li>在再发行作品或衍生作品的用户可见的位置附上此声明的全文内容。
+</li>
+<li>附上任何现有的知识产权免责声明、声明或条款及条件。如果没有这类内容,则应附上 W3C 软件和文档简短声明。
+</li>
+<li>在针对新代码或文档的版权声明中注明所做的任何更改或修改,例如“本软件或文档中包含从 [title and URI of the W3C document] 复制的内容或根据 [title and URI of the W3C document] 得出的内容。版权所有 © [YEAR] W3C®(MIT、ERCIM、Keio、Beihang)”。
+</li>
+</ul>
+<h5>免责声明</h5>
+<p>本作品按“原样”提供,且版权持有者不提供任何明示或暗示的声明或保证,包括但不限于针对适销性、任何特定用途适合性或使用本软件或文档不会对任何第三方专利、版权、商标或其他权利构成侵权的保证。</p>
+<p>对于因使用本软件或文档造成的任何直接、间接、特殊或继发损失,版权持有者均不承担任何责任。</p>
+<p>在未事先征得特定书面许可的情况下,不得在与本作品相关的广告或公共宣传内容中使用版权持有者的名称和商标。本作品包含的版权始终归版权持有者所有。
+</p>
+</div>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/security/bulletin/2017-05-01.html b/zh-cn/security/bulletin/2017-05-01.html
new file mode 100644
index 00000000..53582f84
--- /dev/null
+++ b/zh-cn/security/bulletin/2017-05-01.html
@@ -0,0 +1,2403 @@
+<html devsite><head>
+ <title>Android 安全公告 - 2017 年 5 月</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p><em>发布时间:2017 年 5 月 1 日 | 更新时间:2017 年 5 月 2 日</em></p>
+
+<p>Android 安全公告详细介绍了会影响 Android 设备的安全漏洞。除了公告之外,我们还通过无线下载 (OTA) 更新的方式发布了针对 Nexus 设备的安全更新。我们还在 <a href="https://developers.google.com/android/nexus/images">Google Developers 网站</a>上发布了 Google 设备固件映像。2017 年 5 月 5 日(或之后)的安全补丁程序级别均已解决所有这些问题。请参阅 <a href="https://support.google.com/pixelphone/answer/4457705#pixel_phones&nexus_devices">Pixel 和 Nexus 更新时间表</a>,了解如何检查设备的安全补丁程序级别。</p>
+
+<p>我们的合作伙伴在 2017 年 4 月 3 日(或之前)就已收到本公告中说明的这些问题的相关通知。我们已在 Android 开放源代码项目 (AOSP) 代码库中发布了针对相关问题的源代码补丁程序,并在本公告中提供了相应链接。本公告还提供了 AOSP 之外的补丁程序的链接。</p>
+
+<p>这些问题中危险性最高的是一个严重程度为“严重”的安全漏洞,它可能会导致在处理媒体文件的过程中,可通过电子邮件、网页和彩信等多种方式在受影响的设备上执行远程代码。<a href="/security/overview/updates-resources.html#severity">严重程度评估</a>的依据是漏洞被利用后可能会对受影响设备造成的影响大小(假设相关平台和服务缓解措施被成功规避或出于开发目的而被停用)。</p>
+
+<p>我们尚未收到用户因这些新报告的问题而遭到主动攻击或这些问题遭到滥用的报告。请参阅 <a href="#mitigations">Android 和 Google 服务缓解措施</a>部分,详细了解 <a href="/security/enhancements/index.html">Android 安全平台防护</a>和服务防护功能(如 <a href="https://developer.android.com/training/safetynet/index.html">SafetyNet</a>);这些功能可提高 Android 平台的安全性。</p>
+
+<p>我们建议所有用户都在自己的设备上接受这些更新。</p>
+<h2 id="announcements">公告</h2>
+<ul>
+<li>本公告有两个安全补丁程序级别字符串,目的是让 Android 合作伙伴能够灵活地、更快速地修复所有 Android 设备上类似的一系列漏洞。如需了解详情,请参阅<a href="#common-questions-and-answers">常见问题和解答</a>:
+ <ul>
+ <li><strong>2017-05-01</strong>:部分安全补丁程序级别字符串。此安全补丁程序级别字符串表明与 2017-05-01(以及之前的所有安全补丁程序级别字符串)相关的所有问题均已得到解决。</li>
+ <li><strong>2017-05-05</strong>:完整的安全补丁程序级别字符串。此安全补丁程序级别字符串表明与 2017-05-01 和 2017-05-05(以及之前的所有安全补丁程序级别字符串)相关的所有问题均已得到解决。</li>
+</ul>
+</li>
+<li>受支持的 Google 设备将收到一项安全补丁程序级别为 2017 年 5 月 5 日的 OTA 更新。</li>
+</ul>
+
+<h2 id="mitigations">Android 和 Google 服务缓解措施</h2>
+
+<p>本部分总结了 <a href="/security/enhancements/index.html">Android 安全平台</a>和服务防护功能(如 SafetyNet)提供的缓解措施。这些功能可降低 Android 上的安全漏洞被成功利用的可能性。</p>
+
+<ul>
+<li>新版 Android 平台中的增强功能让攻击者更加难以利用 Android 上存在的许多问题。我们建议所有用户都尽可能更新到最新版 Android。</li>
+<li>Android 安全团队会积极利用<a href="/security/reports/Google_Android_Security_2016_Report_Final.pdf">“验证应用”和 SafetyNet</a> 来监控滥用行为,这些功能会在发现<a href="/security/reports/Google_Android_Security_PHA_classifications.pdf">可能有害的应用</a>时向用户发出警告。在预装有 <a href="http://www.android.com/gms">Google 移动服务</a>的设备上,“验证应用”在默认情况下处于启用状态。对于安装来自 Google Play 以外的应用的用户来说,这项功能尤为重要。虽然 Google Play 中禁止提供设备 Root 应用,但用户可能会尝试安装 Root 应用,而“验证应用”会在检测到这类应用(无论应用来自何处)时向用户发出警告。另外,“验证应用”会尝试识别并阻止用户安装会利用提权漏洞的已知恶意应用。如果用户已安装此类应用,那么“验证应用”将会通知用户并尝试移除所检测到的应用。</li>
+<li>由于已做了适当更新,因此 Google 环聊和 Messenger 应用不会自动将媒体内容传递给 Mediaserver 这类进程。</li>
+</ul>
+
+<h2 id="acknowledgements">致谢</h2>
+
+<p>非常感谢以下研究人员做出的贡献:</p>
+<ul>
+<li>Venustech 的 ADlab:CVE-2017-0630</li>
+<li>腾讯科恩实验室 (<a href="https://twitter.com/keen_lab">@keen_lab</a>) 的 Di Shen (<a href="https://twitter.com/returnsme">@returnsme</a>):CVE-2016-10287</li>
+<li>趋势科技的徐健:CVE-2017-0599、CVE-2017-0635</li>
+<li><a href="http://www.ms509.com">MS509Team</a> 的 En He (<a href="https://twitter.com/heeeeen4x">@heeeeen4x</a>) 和 Bo Liu:CVE-2017-0601</li>
+<li><a href="https://twrp.me/">Team Win Recovery Project</a> 的 Ethan Yonker:CVE-2017-0493</li>
+<li>奇虎 360 科技有限公司 IceSword 实验室的 Gengjia Chen (<a href="https://twitter.com/chengjia4574">@chengjia4574</a>) 和 <a href="http://weibo.com/jfpan">pjf</a>:CVE-2016-10285、CVE-2016-10288、CVE-2016-10290、CVE-2017-0624、CVE-2017-0616、CVE-2017-0617、CVE-2016-10294、CVE-2016-10295、CVE-2016-10296</li>
+<li>腾讯电脑管家的郑文选 (<a href="https://twitter.com/virtualseekers">@VirtualSeekers</a>):CVE-2017-0602</li>
+<li><a href="http://tuncay2.web.engr.illinois.edu">伊利诺伊大学厄巴纳-尚佩恩分校</a>的 <a href="https://www.linkedin.com/in/g%C3%BCliz-seray-tuncay-952a1b9/">Güliz Seray Tuncay</a>:CVE-2017-0593</li>
+<li>奇虎 360 科技有限公司 Alpha 团队的 Hao Chen 和 Guang Gong:CVE-2016-10283</li>
+<li>小米公司的 Juhu Nie、Yang Cheng、Nan Li 和 Qiwu Huang:CVE-2016-10276</li>
+<li><a href="https://github.com/michalbednarski">Michał Bednarski</a>:CVE-2017-0598</li>
+<li>特斯拉产品安全团队的 Nathan Crandall (<a href="https://twitter.com/natecray">@natecray</a>):CVE-2017-0331、CVE-2017-0606</li>
+<li><a href="mailto:jiych.guru@gmail.com">Niky1235</a> (<a href="https://twitter.com/jiych_guru">@jiych_guru</a>):CVE-2017-0603</li>
+<li>阿里巴巴移动安全团队的 Peng Xiao、Chengming Yang、Ning You、Chao Yang 和 Yang Song:CVE-2016-10281、CVE-2016-10280</li>
+<li><a href="https://alephsecurity.com/">Aleph 研究团队</a>的 Roee Hay (<a href="https://twitter.com/roeehay">@roeehay</a>):CVE-2016-10277</li>
+<li><a href="mailto:sbauer@plzdonthack.me">Scott Bauer</a> (<a href="https://twitter.com/ScottyBauer1">@ScottyBauer1</a>):CVE-2016-10274</li>
+<li><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:segfault5514@gmail.com">Tong Lin</a>、<a href="mailto:computernik@gmail.com">Yuan-Tsung Lo</a> 和 Xuxian Jiang:CVE-2016-10291</li>
+<li>Vasily Vasiliev:CVE-2017-0589</li>
+<li><a href="http://www.trendmicro.com">趋势科技</a><a href="http://blog.trendmicro.com/trendlabs-security-intelligence/category/mobile">移动威胁响应团队</a>的 V.E.O (<a href="https://twitter.com/vysea">@VYSEa</a>):CVE-2017-0590、CVE-2017-0587、CVE-2017-0600</li>
+<li>腾讯安全平台部门的 Xiling Gong:CVE-2017-0597</li>
+<li>360 Marvel 团队的 Xingyuan Lin:CVE-2017-0627</li>
+<li>阿里巴巴的王勇 (<a href="https://twitter.com/ThomasKing2014">@ThomasKing2014</a>):CVE-2017-0588</li>
+<li>奇虎 360 科技有限公司 IceSword 实验室的 Yonggang Guo (<a href="https://twitter.com/guoygang">@guoygang</a>):CVE-2016-10289、CVE-2017-0465</li>
+<li>奇虎 360 科技有限公司 Vulpecker 团队的 Yu Pan:CVE-2016-10282、CVE-2017-0615</li>
+<li>奇虎 360 科技有限公司 Vulpecker 团队的 Yu Pan 和 Peide Zhang:CVE-2017-0618、CVE-2017-0625</li>
+</ul>
+
+<h2 id="2017-05-01-details">2017-05-01 安全补丁程序级别 - 漏洞详情</h2>
+
+<p>我们在下面提供了 2017-05-01 补丁程序级别涵盖的每个安全漏洞的详细信息,其中包括问题描述、严重程度阐述以及一个包含 CVE、相关参考信息、严重程度、已更新的 Google 设备、已更新的 AOSP 版本(如果适用)及报告日期的表格。在适用的情况下,我们会将 Bug ID 链接到解决相应问题的公开更改记录(如 AOSP 代码更改列表)。如果某个 Bug 有多条相关的更改记录,我们还将通过 Bug ID 后面的数字链接到更多参考信息。</p>
+
+<h3 id="rce-in-mediaserver">Mediaserver 中的远程代码执行漏洞</h3>
+
+<p>系统在处理媒体文件和数据时,Mediaserver 中的远程代码执行漏洞可让攻击者使用特制文件破坏内存。由于该漏洞可用于通过 Mediaserver 进程执行远程代码,因此我们将其严重程度评为“严重”。</p>
+
+<table>
+ <colgroup><col width="18%" />
+ <col width="17%" />
+ <col width="10%" />
+ <col width="19%" />
+ <col width="18%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>已更新的 AOSP 版本</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0587</td>
+ <td><a href="https://android.googlesource.com/platform/external/libmpeg2/+/a86eb798d077b9b25c8f8c77e3c02c2f287c1ce7">A-35219737</a></td>
+ <td>严重</td>
+ <td>所有</td>
+ <td>6.0、6.0.1、7.0、7.1.1、7.1.2</td>
+ <td>2017 年 1 月 4 日</td>
+ </tr>
+ <tr>
+ <td>CVE-2017-0588</td>
+ <td><a href="https://android.googlesource.com/platform/frameworks/av/+/6f1d990ce0f116a205f467d9eb2082795e33872b">A-34618607</a></td>
+ <td>严重</td>
+ <td>所有</td>
+ <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2</td>
+ <td>2017 年 1 月 21 日</td>
+ </tr>
+ <tr>
+ <td>CVE-2017-0589</td>
+ <td><a href="https://android.googlesource.com/platform/external/libhevc/+/bcfc7124f6ef9f1ec128fb2e90de774a5b33d199">A-34897036</a></td>
+ <td>严重</td>
+ <td>所有</td>
+ <td>5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2</td>
+ <td>2017 年 2 月 1 日</td>
+ </tr>
+ <tr>
+ <td>CVE-2017-0590</td>
+ <td><a href="https://android.googlesource.com/platform/external/libhevc/+/45c97f878bee15cd97262fe7f57ecea71990fed7">A-35039946</a></td>
+ <td>严重</td>
+ <td>所有</td>
+ <td>5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2</td>
+ <td>2017 年 2 月 6 日</td>
+ </tr>
+ <tr>
+ <td>CVE-2017-0591</td>
+ <td><a href="https://android.googlesource.com/platform/external/libavc/+/5c3fd5d93a268abb20ff22f26009535b40db3c7d">A-34097672</a></td>
+ <td>严重</td>
+ <td>所有</td>
+ <td>6.0、6.0.1、7.0、7.1.1、7.1.2</td>
+ <td>Google 内部</td>
+ </tr>
+ <tr>
+ <td>CVE-2017-0592</td>
+ <td><a href="https://android.googlesource.com/platform/frameworks/av/+/acc192347665943ca674acf117e4f74a88436922">A-34970788</a></td>
+ <td>严重</td>
+ <td>所有</td>
+ <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2</td>
+ <td>Google 内部</td>
+ </tr>
+</tbody></table>
+
+<h3 id="eop-in-framework-apis">Framework API 中的提权漏洞</h3>
+
+<p>Framework API 中的提权漏洞可让本地恶意应用获取自定义权限。由于该漏洞允许全面深入地绕过将应用数据与其他应用分离开来的操作系统防护功能,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="18%" />
+ <col width="17%" />
+ <col width="10%" />
+ <col width="19%" />
+ <col width="18%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>已更新的 AOSP 版本</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0593</td>
+ <td><a href="https://android.googlesource.com/platform/frameworks/base/+/78efbc95412b8efa9a44d573f5767ae927927d48">A-34114230</a></td>
+ <td>高</td>
+ <td>所有</td>
+ <td>6.0、6.0.1、7.0、7.1.1、7.1.2</td>
+ <td>2017 年 1 月 5 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="eop-in-mediaserver">Mediaserver 中的提权漏洞</h3>
+
+<p>Mediaserver 中的提权漏洞可让本地恶意应用通过特许进程执行任意代码。由于该漏洞可用于获取第三方应用通常无法获取的本地特权,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="18%" />
+ <col width="17%" />
+ <col width="10%" />
+ <col width="19%" />
+ <col width="18%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>已更新的 AOSP 版本</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0594</td>
+ <td><a href="https://android.googlesource.com/platform/frameworks/av/+/594bf934384920618d2b6ce0bcda1f60144cb3eb">A-34617444</a></td>
+ <td>高</td>
+ <td>所有</td>
+ <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2</td>
+ <td>2017 年 1 月 22 日</td>
+ </tr>
+ <tr>
+ <td>CVE-2017-0595</td>
+ <td><a href="https://android.googlesource.com/platform/frameworks/av/+/5443b57cc54f2e46b35246637be26a69e9f493e1">A-34705519</a></td>
+ <td>高</td>
+ <td>所有</td>
+ <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1</td>
+ <td>2017 年 1 月 24 日</td>
+ </tr>
+ <tr>
+ <td>CVE-2017-0596</td>
+ <td><a href="https://android.googlesource.com/platform/frameworks/av/+/5443b57cc54f2e46b35246637be26a69e9f493e1">A-34749392</a></td>
+ <td>高</td>
+ <td>所有</td>
+ <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1</td>
+ <td>2017 年 1 月 24 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="eop-in-audioserver">Audioserver 中的提权漏洞</h3>
+
+<p>Audioserver 中的提权漏洞可让本地恶意应用通过特许进程执行任意代码。由于该漏洞可用于获取第三方应用通常无法获取的本地特权,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="18%" />
+ <col width="17%" />
+ <col width="10%" />
+ <col width="19%" />
+ <col width="18%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>已更新的 AOSP 版本</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0597</td>
+ <td><a href="https://android.googlesource.com/platform/frameworks/av/+/a9188f89179a7edd301abaf37d644adf5d647a04">A-34749571</a></td>
+ <td>高</td>
+ <td>所有</td>
+ <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2</td>
+ <td>2017 年 1 月 25 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="id-in-framework-apis">Framework API 中的信息披露漏洞</h3>
+
+<p>Framework API 中的信息披露漏洞可让本地恶意应用绕过将应用数据与其他应用分离开来的操作系统防护功能。由于该漏洞可用于获取相应应用无法获取的数据,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="18%" />
+ <col width="17%" />
+ <col width="10%" />
+ <col width="19%" />
+ <col width="18%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>已更新的 AOSP 版本</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0598</td>
+ <td><a href="https://android.googlesource.com/platform/frameworks/base/+/4e110ab20bb91e945a17c6e166e14e2da9608f08">A-34128677</a> [<a href="https://android.googlesource.com/platform/frameworks/base/+/d42e1204d5dddb78ec9d20d125951b59a8344f40">2</a>]</td>
+ <td>高</td>
+ <td>所有</td>
+ <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2</td>
+ <td>2017 年 1 月 6 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="dos-in-mediaserver">Mediaserver 中的拒绝服务漏洞</h3>
+
+<p>Mediaserver 中的远程拒绝服务漏洞可让攻击者使用特制文件挂起或重新启动设备。由于该漏洞可用于远程发起拒绝服务攻击,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="18%" />
+ <col width="17%" />
+ <col width="10%" />
+ <col width="19%" />
+ <col width="18%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>已更新的 AOSP 版本</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0599</td>
+ <td><a href="https://android.googlesource.com/platform/external/libhevc/+/a1424724a00d62ac5efa0e27953eed66850d662f">A-34672748</a></td>
+ <td>高</td>
+ <td>所有</td>
+ <td>6.0、6.0.1、7.0、7.1.1、7.1.2</td>
+ <td>2017 年 1 月 23 日</td>
+ </tr>
+ <tr>
+ <td>CVE-2017-0600</td>
+ <td><a href="https://android.googlesource.com/platform/frameworks/av/+/961e5ac5788b52304e64b9a509781beaf5201fb0">A-35269635</a></td>
+ <td>高</td>
+ <td>所有</td>
+ <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2</td>
+ <td>2017 年 2 月 10 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="eop-in-bluetooth">蓝牙中的提权漏洞</h3>
+
+<p>蓝牙中的提权漏洞可能会让本地恶意应用在未经用户许可的情况下接受通过蓝牙分享的有害文件。由于该漏洞允许在本地绕过用户互动要求,因此我们将其严重程度评为“中”。</p>
+
+<table>
+ <colgroup><col width="18%" />
+ <col width="17%" />
+ <col width="10%" />
+ <col width="19%" />
+ <col width="18%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>已更新的 AOSP 版本</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0601</td>
+ <td><a href="https://android.googlesource.com/platform/frameworks/base/+/667d2cbe3eb1450f273a4f6595ccef35e1f0fe4b">A-35258579</a></td>
+ <td>中</td>
+ <td>所有</td>
+ <td>7.0、7.1.1、7.1.2</td>
+ <td>2017 年 2 月 9 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="id-in-file-based-encryption">文件级加密中的信息披露漏洞</h3>
+
+<p>文件级加密中的信息披露漏洞可让本地恶意攻击者绕过用于锁定屏幕的操作系统防护功能。由于该漏洞可能会让有心人士绕过锁定屏幕,因此我们将其严重程度评为“中”。</p>
+
+<table>
+ <colgroup><col width="18%" />
+ <col width="17%" />
+ <col width="10%" />
+ <col width="19%" />
+ <col width="18%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>已更新的 AOSP 版本</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0493</td>
+ <td><a href="https://android.googlesource.com/platform/frameworks/base/+/e4cefbf4fce458489b5f1bebc79dfaf566bcc5d5">A-32793550</a> [<a href="https://android.googlesource.com/platform/frameworks/base/+/f806d65e615b942c268a5f68d44bde9d55634972">2</a>]</td>
+ <td>中</td>
+ <td>所有</td>
+ <td>7.0、7.1.1</td>
+ <td>2016 年 11 月 9 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="id-in-bluetooth">蓝牙中的信息披露漏洞</h3>
+
+<p>蓝牙中的信息披露漏洞可让本地恶意应用绕过将应用数据与其他应用分离开来的操作系统防护功能。根据该漏洞的具体细节,我们将其严重程度评为“中”。</p>
+
+<table>
+ <colgroup><col width="18%" />
+ <col width="17%" />
+ <col width="10%" />
+ <col width="19%" />
+ <col width="18%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>已更新的 AOSP 版本</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0602</td>
+ <td><a href="https://android.googlesource.com/platform/system/bt/+/a4875a49404c544134df37022ae587a4a3321647">A-34946955</a></td>
+ <td>中</td>
+ <td>所有</td>
+ <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2</td>
+ <td>2016 年 12 月 5 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="id-in-openssl-&-boringssl">OpenSSL 和 BoringSSL 中的信息披露漏洞</h3>
+
+<p>OpenSSL 和 BoringSSL 中的信息披露漏洞可让远程攻击者获取敏感信息。根据该漏洞的具体细节,我们将其严重程度评为“中”。</p>
+
+<table>
+ <colgroup><col width="18%" />
+ <col width="17%" />
+ <col width="10%" />
+ <col width="19%" />
+ <col width="18%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>已更新的 AOSP 版本</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2016-7056</td>
+ <td><a href="https://android.googlesource.com/platform/external/boringssl/+/13179a8e75fee98740b5ce728752aa7294b3e32d">A-33752052</a></td>
+ <td>中</td>
+ <td>所有</td>
+ <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2</td>
+ <td>2016 年 12 月 19 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="dos-in-mediaserver-2">Mediaserver 中的拒绝服务漏洞</h3>
+
+<p>Mediaserver 中的拒绝服务漏洞可让攻击者使用特制文件挂起或重新启动设备。由于该漏洞只能针对罕见的设备配置起作用,因此我们将其严重程度评为“中”。</p>
+
+<table>
+ <colgroup><col width="18%" />
+ <col width="17%" />
+ <col width="10%" />
+ <col width="19%" />
+ <col width="18%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>已更新的 AOSP 版本</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0603</td>
+ <td><a href="https://android.googlesource.com/platform/frameworks/av/+/36b04932bb93cc3269279282686b439a17a89920">A-35763994</a></td>
+ <td>中</td>
+ <td>所有</td>
+ <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2</td>
+ <td>2017 年 2 月 23 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="dos-in-mediaserver-3">Mediaserver 中的拒绝服务漏洞</h3>
+
+<p>Mediaserver 中的远程拒绝服务漏洞可让攻击者使用特制文件挂起或重新启动设备。根据该漏洞的具体细节,我们将其严重程度评为“低”。</p>
+
+<table>
+ <colgroup><col width="18%" />
+ <col width="17%" />
+ <col width="10%" />
+ <col width="19%" />
+ <col width="18%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>已更新的 AOSP 版本</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0635</td>
+ <td><a href="https://android.googlesource.com/platform/frameworks/av/+/523f6b49c1a2289161f40cf9fe80b92e592e9441">A-35467107</a></td>
+ <td>低</td>
+ <td>所有</td>
+ <td>7.0、7.1.1、7.1.2</td>
+ <td>2017 年 2 月 16 日</td>
+ </tr>
+</tbody></table>
+
+<h2 id="2017-05-05-details">2017-05-05 安全补丁程序级别 - 漏洞详情</h2>
+
+<p>我们在下面提供了 2017-05-05 补丁程序级别涵盖的每个安全漏洞的详细信息,其中包括问题描述、严重程度阐述以及一个包含 CVE、相关参考信息、严重程度、已更新的 Google 设备、已更新的 AOSP 版本(如果适用)及报告日期的表格。在适用的情况下,我们会将 Bug ID 链接到解决相应问题的公开更改记录(如 AOSP 代码更改列表)。如果某个 Bug 有多条相关的更改记录,我们还将通过 Bug ID 后面的数字链接到更多参考信息。</p>
+
+<h3 id="rce-in-giflib">GIFLIB 中的远程代码执行漏洞</h3>
+
+<p>系统在处理媒体文件和数据时,GIFLIB 中的远程代码执行漏洞可让攻击者使用特制文件破坏内存。由于该漏洞可用于通过 Mediaserver 进程执行远程代码,因此我们将其严重程度评为“严重”。</p>
+
+<table>
+ <colgroup><col width="18%" />
+ <col width="17%" />
+ <col width="10%" />
+ <col width="19%" />
+ <col width="18%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>已更新的 AOSP 版本</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2015-7555</td>
+ <td><a href="https://android.googlesource.com/platform/external/giflib/+/dc07290edccc2c3fc4062da835306f809cea1fdc">A-34697653</a></td>
+ <td>严重</td>
+ <td>所有</td>
+ <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2</td>
+ <td>2016 年 4 月 13 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="eop-in-mediatek-touchscreen-driver">MediaTek 触摸屏驱动程序中的提权漏洞</h3>
+
+<p>MediaTek 触摸屏驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞有可能会对本地设备造成永久性损害,而用户可能需要通过重写操作系统来修复设备,因此我们将其严重程度评为“严重”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2016-10274</td>
+ <td>A-30202412*<br />M-ALPS02897901</td>
+ <td>严重</td>
+ <td>无**</td>
+ <td>2016 年 7 月 16 日</td>
+ </tr>
+</tbody></table>
+
+<p>* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
+
+<p>** 搭载 Android 7.1.1(或更高版本)且已安装所有可用更新的受支持的 Google 设备不受此漏洞的影响。</p>
+
+<h3 id="eop-in-qualcomm-bootloader">Qualcomm 引导加载程序中的提权漏洞</h3>
+
+<p>Qualcomm 引导加载程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞有可能会对本地设备造成永久性损害,而用户可能需要通过重写操作系统来修复设备,因此我们将其严重程度评为“严重”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2016-10275</td>
+ <td>A-34514954<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/lk/commit/?id=1a0a15c380e11fc46f8d8706ea5ae22b752bdd0b">QC-CR#1009111</a></td>
+ <td>严重</td>
+ <td>Nexus 5X、Nexus 6、Pixel、Pixel XL、Android One</td>
+ <td>2016 年 9 月 13 日</td>
+ </tr>
+ <tr>
+ <td>CVE-2016-10276</td>
+ <td>A-32952839<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/lk/commit/?id=5dac431748027e8b50a5c4079967def4ea53ad64">QC-CR#1094105</a></td>
+ <td>严重</td>
+ <td>Nexus 5X、Nexus 6P、Pixel、Pixel XL</td>
+ <td>2016 年 11 月 16 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="eop-in-kernel-sound-subsystem">内核声音子系统中的提权漏洞</h3>
+
+<p>内核声音子系统中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞有可能会对本地设备造成永久性损害,而用户可能需要通过重写操作系统来修复设备,因此我们将其严重程度评为“严重”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2016-9794</td>
+ <td>A-34068036<br />
+ <a href="https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/commit/?id=a27178e05b7c332522df40904f27674e36ee3757">上游内核</a></td>
+ <td>严重</td>
+ <td>Nexus 5X、Nexus 6、Nexus 6P、Nexus 9、Pixel、Pixel XL、Pixel C、Android One、Nexus Player</td>
+ <td>2016 年 12 月 3 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="eop-in-motorola-bootloader">Motorola 引导加载程序中的提权漏洞</h3>
+
+<p>Motorola 引导加载程序中的提权漏洞可让本地恶意应用通过引导加载程序执行任意代码。由于该漏洞有可能会对本地设备造成永久性损害,而用户可能需要通过重写操作系统来修复设备,因此我们将其严重程度评为“严重”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2016-10277</td>
+ <td>A-33840490*<br />
+ </td>
+ <td>严重</td>
+ <td>Nexus 6</td>
+ <td>2016 年 12 月 21 日</td>
+ </tr>
+</tbody></table>
+
+<p>* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
+
+<h3 id="eop-in-nvidia-video-driver">NVIDIA 视频驱动程序中的提权漏洞</h3>
+
+<p>NVIDIA 视频驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞有可能会对本地设备造成永久性损害,而用户可能需要通过重写操作系统来修复设备,因此我们将其严重程度评为“严重”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0331</td>
+ <td>A-34113000*<br />N-CVE-2017-0331</td>
+ <td>严重</td>
+ <td>Nexus 9</td>
+ <td>2017 年 1 月 4 日</td>
+ </tr>
+</tbody></table>
+
+<p>* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
+
+<h3 id="eop-in-qualcomm-power-driver">Qualcomm 电源驱动程序中的提权漏洞</h3>
+
+<p>内核 Qualcomm 电源驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞有可能会对本地设备造成永久性损害,而用户可能需要通过重写操作系统来修复设备,因此我们将其严重程度评为“严重”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0604</td>
+ <td>A-35392981<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-3.18/commit/?id=6975e2dd5f37de965093ba3a8a08635a77a960f7">QC-CR#826589</a></td>
+ <td>严重</td>
+ <td>无*</td>
+ <td>2017 年 2 月 15 日</td>
+ </tr>
+</tbody></table>
+
+<p>* 搭载 Android 7.1.1(或更高版本)且已安装所有可用更新的受支持的 Google 设备不受此漏洞的影响。</p>
+
+<h3 id="eop-in-kernel-trace-subsystem">内核跟踪子系统中的提权漏洞</h3>
+
+<p>内核跟踪子系统中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞有可能会对本地设备造成永久性损害,而用户可能需要通过重写操作系统来修复设备,因此我们将其严重程度评为“严重”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0605</td>
+ <td>A-35399704<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-3.10/commit/?id=2161ae9a70b12cf18ac8e5952a20161ffbccb477">QC-CR#1048480</a></td>
+ <td>严重</td>
+ <td>Nexus 5X、Nexus 6、Nexus 6P、Nexus 9、Pixel、Pixel XL、Pixel C、Android One、Nexus Player</td>
+ <td>2017 年 2 月 15 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="vulnerabilities-in-qualcomm-components">Qualcomm 组件中的漏洞</h3>
+
+<p>下列漏洞会影响 Qualcomm 组件;此外,2016 年 8 月、9 月、10 月和 12 月的 Qualcomm AMSS 安全公告也对这些安全漏洞进行了详细说明。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2016-10240</td>
+ <td>A-32578446**<br />QC-CR#955710</td>
+ <td>严重</td>
+ <td>Nexus 6P</td>
+ <td>Qualcomm 内部</td>
+ </tr>
+ <tr>
+ <td>CVE-2016-10241</td>
+ <td>A-35436149**<br />QC-CR#1068577</td>
+ <td>严重</td>
+ <td>Nexus 5X、Nexus 6、Nexus 6P、Pixel、Pixel XL</td>
+ <td>Qualcomm 内部</td>
+ </tr>
+ <tr>
+ <td>CVE-2016-10278</td>
+ <td>A-31624008**<br />QC-CR#1043004</td>
+ <td>高</td>
+ <td>Pixel、Pixel XL</td>
+ <td>Qualcomm 内部</td>
+ </tr>
+ <tr>
+ <td>CVE-2016-10279</td>
+ <td>A-31624421**<br />QC-CR#1031821</td>
+ <td>高</td>
+ <td>Pixel、Pixel XL</td>
+ <td>Qualcomm 内部</td>
+ </tr>
+</tbody></table>
+
+<p>* 这些漏洞的严重程度评级由供应商决定。</p>
+
+<p>* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
+
+<p>*** 搭载 Android 7.1.1(或更高版本)且已安装所有可用更新的受支持的 Google 设备不受此漏洞的影响。</p>
+
+<h3 id="rce-in-libxml2">libxml2 中的远程代码执行漏洞</h3>
+
+<p>libxml2 中的远程代码执行漏洞可让攻击者使用特制文件通过非特许进程执行任意代码。由于该漏洞可用于在使用此库的应用中执行远程代码,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="18%" />
+ <col width="17%" />
+ <col width="10%" />
+ <col width="19%" />
+ <col width="18%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>已更新的 AOSP 版本</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2016-5131</td>
+ <td>A-32956747*</td>
+ <td>高</td>
+ <td>无**</td>
+ <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1、7.0</td>
+ <td>2016 年 7 月 23 日</td>
+ </tr>
+</tbody></table>
+
+<p>* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
+
+<p>** 搭载 Android 7.1.1(或更高版本)且已安装所有可用更新的受支持的 Google 设备不受此漏洞的影响。</p>
+
+<h3 id="eop-in-mediatek-thermal-driver">MediaTek 热驱动程序中的提权漏洞</h3>
+
+<p>MediaTek 热驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2016-10280</td>
+ <td>A-28175767*<br />M-ALPS02696445</td>
+ <td>高</td>
+ <td>无**</td>
+ <td>2016 年 4 月 11 日</td>
+ </tr>
+ <tr>
+ <td>CVE-2016-10281</td>
+ <td>A-28175647*<br />M-ALPS02696475</td>
+ <td>高</td>
+ <td>无**</td>
+ <td>2016 年 4 月 11 日</td>
+ </tr>
+ <tr>
+ <td>CVE-2016-10282</td>
+ <td>A-33939045*<br />M-ALPS03149189</td>
+ <td>高</td>
+ <td>无**</td>
+ <td>2016 年 12 月 27 日</td>
+ </tr>
+</tbody></table>
+
+<p>* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
+
+<p>** 搭载 Android 7.1.1(或更高版本)且已安装所有可用更新的受支持的 Google 设备不受此漏洞的影响。</p>
+
+<h3 id="eop-in-qualcomm-wi-fi-driver">Qualcomm WLAN 驱动程序中的提权漏洞</h3>
+
+<p>Qualcomm WLAN 驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2016-10283</td>
+ <td>A-32094986<br />
+ <a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-2.0/commit/?id=93863644b4547324309613361d70ad9dc91f8dfd">QC-CR#2002052</a></td>
+ <td>高</td>
+ <td>Nexus 5X、Pixel、Pixel XL、Android One</td>
+ <td>2016 年 10 月 11 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="eop-in-qualcomm-video-driver">Qualcomm 视频驱动程序中的提权漏洞</h3>
+
+<p>Qualcomm 视频驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2016-10284</td>
+ <td>A-32402303*<br />QC-CR#2000664</td>
+ <td>高</td>
+ <td>Nexus 5X、Nexus 6、Nexus 6P、Pixel、Pixel XL、Android One</td>
+ <td>2016 年 10 月 24 日</td>
+ </tr>
+ <tr>
+ <td>CVE-2016-10285</td>
+ <td>A-33752702<br />
+ <a href="https://source.codeaurora.org/quic/la/kernel/msm-3.18/commit/?id=67dfd3a65336e0b3f55ee83d6312321dc5f2a6f9">QC-CR#1104899</a></td>
+ <td>高</td>
+ <td>Pixel、Pixel XL</td>
+ <td>2016 年 12 月 19 日</td>
+ </tr>
+ <tr>
+ <td>CVE-2016-10286</td>
+ <td>A-35400904<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-4.4/commit/?id=5d30a3d0dc04916ddfb972bfc52f8e636642f999">QC-CR#1090237</a></td>
+ <td>高</td>
+ <td>Pixel、Pixel XL</td>
+ <td>2017 年 2 月 15 日</td>
+ </tr>
+</tbody></table>
+
+<p>* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
+
+<h3 id="eop-in-kernel-performance-subsystem">内核效能子系统中的提权漏洞</h3>
+
+<p>内核效能子系统中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2015-9004</td>
+ <td>A-34515362<br />
+ <a href="https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/commit/?id=c3c87e770458aa004bd7ed3f29945ff436fd6511">上游内核</a></td>
+ <td>高</td>
+ <td>Nexus 5X、Nexus 6、Nexus 6P、Nexus 9、Pixel、Pixel XL、Pixel C、Android One、Nexus Player</td>
+ <td>2016 年 11 月 23 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="eop-in-qualcomm-sound-driver">Qualcomm 声音驱动程序中的提权漏洞</h3>
+
+<p>Qualcomm 声音驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2016-10287</td>
+ <td>A-33784446<br />
+ <a href="https://www.codeaurora.org/gitweb/quic/la/?p=kernel/msm-4.4.git;a=commit;h=937bc9e644180e258c68662095861803f7ba4ded">QC-CR#1112751</a></td>
+ <td>高</td>
+ <td>Nexus 5X、Nexus 6P、Pixel、Pixel XL、Android One</td>
+ <td>2016 年 12 月 20 日</td>
+ </tr>
+ <tr>
+ <td>CVE-2017-0606</td>
+ <td>A-34088848<br />
+ <a href="https://www.codeaurora.org/gitweb/quic/la/?p=kernel/msm-4.4.git;a=commit;h=d3237316314c3d6f75a58192971f66e3822cd250">QC-CR#1116015</a></td>
+ <td>高</td>
+ <td>Nexus 5X、Nexus 6P、Pixel、Pixel XL、Android One</td>
+ <td>2017 年 1 月 3 日</td>
+ </tr>
+ <tr>
+ <td>CVE-2016-5860</td>
+ <td>A-34623424<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-4.4/commit/?id=9f91ae0d7203714fc39ae78e1f1c4fd71ed40498">QC-CR#1100682</a></td>
+ <td>高</td>
+ <td>Pixel、Pixel XL</td>
+ <td>2017 年 1 月 22 日</td>
+ </tr>
+ <tr>
+ <td>CVE-2016-5867</td>
+ <td>A-35400602<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-3.18/commit/?id=065360da7147003aed8f59782b7652d565f56be5">QC-CR#1095947</a></td>
+ <td>高</td>
+ <td>无*</td>
+ <td>2017 年 2 月 15 日</td>
+ </tr>
+ <tr>
+ <td>CVE-2017-0607</td>
+ <td>A-35400551<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-4.4/commit/?id=b003c8d5407773d3aa28a48c9841e4c124da453d">QC-CR#1085928</a></td>
+ <td>高</td>
+ <td>Pixel、Pixel XL</td>
+ <td>2017 年 2 月 15 日</td>
+ </tr>
+ <tr>
+ <td>CVE-2017-0608</td>
+ <td>A-35400458<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-4.4/commit/?id=b66f442dd97c781e873e8f7b248e197f86fd2980">QC-CR#1098363</a></td>
+ <td>高</td>
+ <td>Nexus 5X、Nexus 6、Nexus 6P、Pixel、Pixel XL、Android One</td>
+ <td>2017 年 2 月 15 日</td>
+ </tr>
+ <tr>
+ <td>CVE-2017-0609</td>
+ <td>A-35399801<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-4.4/commit/?id=38a83df036084c00e8c5a4599c8ee7880b4ee567">QC-CR#1090482</a></td>
+ <td>高</td>
+ <td>Nexus 5X、Nexus 6P、Pixel、Pixel XL、Android One</td>
+ <td>2017 年 2 月 15 日</td>
+ </tr>
+ <tr>
+ <td>CVE-2016-5859</td>
+ <td>A-35399758<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-3.18/commit/?id=97fdb441a9fb330a76245e473bc1a2155c809ebe">QC-CR#1096672</a></td>
+ <td>高</td>
+ <td>无*</td>
+ <td>2017 年 2 月 15 日</td>
+ </tr>
+ <tr>
+ <td>CVE-2017-0610</td>
+ <td>A-35399404<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-4.4/commit/?id=65009746a6e649779f73d665934561ea983892fe">QC-CR#1094852</a></td>
+ <td>高</td>
+ <td>Nexus 5X、Nexus 6、Nexus 6P、Pixel、Pixel XL、Android One</td>
+ <td>2017 年 2 月 15 日</td>
+ </tr>
+ <tr>
+ <td>CVE-2017-0611</td>
+ <td>A-35393841<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-4.4/commit/?id=1aa5df9246557a98181f03e98530ffd509b954c8">QC-CR#1084210</a></td>
+ <td>高</td>
+ <td>Nexus 5X、Nexus 6、Nexus 6P、Pixel、Pixel XL、Android One</td>
+ <td>2017 年 2 月 15 日</td>
+ </tr>
+ <tr>
+ <td>CVE-2016-5853</td>
+ <td>A-35392629<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-4.4/commit/?id=a8f3b894de319718aecfc2ce9c691514696805be">QC-CR#1102987</a></td>
+ <td>高</td>
+ <td>无*</td>
+ <td>2017 年 2 月 15 日</td>
+ </tr>
+</tbody></table>
+
+<p>* 搭载 Android 7.1.1(或更高版本)且已安装所有可用更新的受支持的 Google 设备不受此漏洞的影响。</p>
+
+<h3 id="eop-in-qualcomm-led-driver">Qualcomm LED 驱动程序中的提权漏洞</h3>
+
+<p>Qualcomm LED 驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2016-10288</td>
+ <td>A-33863909<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-3.18/commit/?id=db2cdc95204bc404f03613d5dd7002251fb33660">QC-CR#1109763</a></td>
+ <td>高</td>
+ <td>Pixel、Pixel XL</td>
+ <td>2016 年 12 月 23 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="eop-in-qualcomm-crypto-driver">Qualcomm 加密驱动程序中的提权漏洞</h3>
+
+<p>Qualcomm 加密驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2016-10289</td>
+ <td>A-33899710<br />
+ <a href="https://source.codeaurora.org/quic/la/kernel/msm-3.18/commit/?id=a604e6f3889ccc343857532b63dea27603381816">QC-CR#1116295</a></td>
+ <td>高</td>
+ <td>Nexus 5X、Nexus 6、Nexus 6P、Pixel、Pixel XL、Android One</td>
+ <td>2016 年 12 月 24 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="eop-in-qualcomm-shared-memory-driver">Qualcomm 共享内存驱动程序中的提权漏洞</h3>
+
+<p>Qualcomm 共享内存驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2016-10290</td>
+ <td>A-33898330<br />
+ <a href="https://source.codeaurora.org/quic/la/kernel/msm-3.18/commit/?id=a5e46d8635a2e28463b365aacdeab6750abd0d49">QC-CR#1109782</a></td>
+ <td>高</td>
+ <td>Nexus 5X、Nexus 6P、Pixel、Pixel XL</td>
+ <td>2016 年 12 月 24 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="eop-in-qualcomm-slimbus-driver">Qualcomm Slimbus 驱动程序中的提权漏洞</h3>
+
+<p>Qualcomm Slimbus 驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2016-10291</td>
+ <td>A-34030871<br />
+ <a href="https://source.codeaurora.org/quic/la/kernel/msm-3.18/commit/?id=a225074c0494ca8125ca0ac2f9ebc8a2bd3612de">QC-CR#986837</a></td>
+ <td>高</td>
+ <td>Nexus 5X、Nexus 6、Nexus 6P、Android One</td>
+ <td>2016 年 12 月 31 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="eop-in-qualcomm-adsprpc-driver">Qualcomm ADSPRPC 驱动程序中的提权漏洞</h3>
+
+<p>Qualcomm ADSPRPC 驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0465</td>
+ <td>A-34112914<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-4.4/commit/?id=3823f0f8d0bbbbd675a42a54691f4051b3c7e544">QC-CR#1110747</a></td>
+ <td>高</td>
+ <td>Nexus 5X、Nexus 6P、Pixel、Pixel XL、Android One</td>
+ <td>2017 年 1 月 5 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="eop-in-qualcomm-secure-execution-environment-communicator-driver">Qualcomm 安全执行环境通讯器驱动程序中的提权漏洞</h3>
+
+<p>Qualcomm 安全执行环境通讯器驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0612</td>
+ <td>A-34389303<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-3.18/commit/?id=05efafc998dc86c3b75af9803ca71255ddd7a8eb">QC-CR#1061845</a></td>
+ <td>高</td>
+ <td>Pixel、Pixel XL</td>
+ <td>2017 年 1 月 10 日</td>
+ </tr>
+ <tr>
+ <td>CVE-2017-0613</td>
+ <td>A-35400457<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-4.4/commit/?id=b108c651cae9913da1ab163cb4e5f7f2db87b747">QC-CR#1086140</a></td>
+ <td>高</td>
+ <td>Nexus 5X、Nexus 6、Nexus 6P、Pixel、Pixel XL、Android One</td>
+ <td>2017 年 2 月 15 日</td>
+ </tr>
+ <tr>
+ <td>CVE-2017-0614</td>
+ <td>A-35399405<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-3.18/commit/?id=fc2ae27eb9721a0ce050c2062734fec545cda604">QC-CR#1080290</a></td>
+ <td>高</td>
+ <td>Nexus 5X、Nexus 6、Nexus 6P、Pixel、Pixel XL、Android One</td>
+ <td>2017 年 2 月 15 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="eop-in-mediatek-power-driver">MediaTek 电源驱动程序中的提权漏洞</h3>
+
+<p>MediaTek 电源驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0615</td>
+ <td>A-34259126*<br />M-ALPS03150278</td>
+ <td>高</td>
+ <td>无**</td>
+ <td>2017 年 1 月 12 日</td>
+ </tr>
+</tbody></table>
+
+<p>* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
+
+<p>** 搭载 Android 7.1.1(或更高版本)且已安装所有可用更新的受支持的 Google 设备不受此漏洞的影响。</p>
+
+<h3 id="eop-in-mediatek-system-management-interrupt-driver">MediaTek 系统管理中断驱动程序中的提权漏洞</h3>
+
+<p>MediaTek 系统管理中断驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0616</td>
+ <td>A-34470286*<br />M-ALPS03149160</td>
+ <td>高</td>
+ <td>无**</td>
+ <td>2017 年 1 月 19 日</td>
+ </tr>
+</tbody></table>
+
+<p>* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
+
+<p>** 搭载 Android 7.1.1(或更高版本)且已安装所有可用更新的受支持的 Google 设备不受此漏洞的影响。</p>
+
+<h3 id="eop-in-mediatek-video-driver">MediaTek 视频驱动程序中的提权漏洞</h3>
+
+<p>MediaTek 视频驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0617</td>
+ <td>A-34471002*<br />M-ALPS03149173</td>
+ <td>高</td>
+ <td>无**</td>
+ <td>2017 年 1 月 19 日</td>
+ </tr>
+</tbody></table>
+
+<p>* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
+
+<p>** 搭载 Android 7.1.1(或更高版本)且已安装所有可用更新的受支持的 Google 设备不受此漏洞的影响。</p>
+
+<h3 id="eop-in-mediatek-command-queue-driver">MediaTek 命令队列驱动程序中的提权漏洞</h3>
+
+<p>MediaTek 命令队列驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0618</td>
+ <td>A-35100728*<br />M-ALPS03161536</td>
+ <td>高</td>
+ <td>无**</td>
+ <td>2017 年 2 月 7 日</td>
+ </tr>
+</tbody></table>
+
+<p>* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
+
+<p>** 搭载 Android 7.1.1(或更高版本)且已安装所有可用更新的受支持的 Google 设备不受此漏洞的影响。</p>
+
+<h3 id="eop-in-qualcomm-pin-controller-driver">Qualcomm PIN 码控制器驱动程序中的提权漏洞</h3>
+
+<p>Qualcomm PIN 码控制器驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0619</td>
+ <td>A-35401152<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-3.14/commit/?id=72f67b29a9c5e6e8d3c34751600c749c5f5e13e1">QC-CR#826566</a></td>
+ <td>高</td>
+ <td>Nexus 6、Android One</td>
+ <td>2017 年 2 月 15 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="eop-in-qualcomm-secure-channel-manager-driver">Qualcomm 安全通道管理器驱动程序中的提权漏洞</h3>
+
+<p>Qualcomm 安全通道管理器驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0620</td>
+ <td>A-35401052<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-4.4/commit/?id=01b2c9a5d728ff6f2f1f28a5d4e927aaeabf56ed">QC-CR#1081711</a></td>
+ <td>高</td>
+ <td>Nexus 5X、Nexus 6、Nexus 6P、Pixel、Pixel XL、Android One</td>
+ <td>2017 年 2 月 15 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="eop-in-qualcomm-sound-codec-driver">Qualcomm 声音编解码器驱动程序中的提权漏洞</h3>
+
+<p>Qualcomm 声音编解码器驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2016-5862</td>
+ <td>A-35399803<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-4.4/commit/?id=4199451e83729a3add781eeafaee32994ff65b04">QC-CR#1099607</a></td>
+ <td>高</td>
+ <td>Pixel、Pixel XL</td>
+ <td>2017 年 2 月 15 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="eop-in-kernel-voltage-regulator-driver">内核电压调节器驱动程序中的提权漏洞</h3>
+
+<p>内核电压调节器驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2014-9940</td>
+ <td>A-35399757<br />
+ <a href="https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/commit/?id=60a2362f769cf549dc466134efe71c8bf9fbaaba">上游内核</a></td>
+ <td>高</td>
+ <td>Nexus 6、Nexus 9、Pixel C、Android One、Nexus Player</td>
+ <td>2017 年 2 月 15 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="eop-in-qualcomm-camera-driver">Qualcomm 相机驱动程序中的提权漏洞</h3>
+
+<p>Qualcomm 相机驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0621</td>
+ <td>A-35399703<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-3.10/commit/?id=9656e2c2b3523af20502bf1e933e35a397f5e82f">QC-CR#831322</a></td>
+ <td>高</td>
+ <td>Android One</td>
+ <td>2017 年 2 月 15 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="eop-in-qualcomm-networking-driver">Qualcomm 网络驱动程序中的提权漏洞</h3>
+
+<p>Qualcomm 网络驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2016-5868</td>
+ <td>A-35392791<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-4.4/commit/?id=fbb765a3f813f5cc85ddab21487fd65f24bf6a8c">QC-CR#1104431</a></td>
+ <td>高</td>
+ <td>Nexus 5X、Pixel、Pixel XL</td>
+ <td>2017 年 2 月 15 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="eop-in-kernel-networking-subsystem">内核网络子系统中的提权漏洞</h3>
+
+<p>内核网络子系统中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-7184</td>
+ <td>A-36565222<br />
+ <a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=677e806da4d916052585301785d847c3b3e6186a">上游内核</a> <a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f843ee6dd019bcece3e74e76ad9df0155655d0df">[2]</a></td>
+ <td>高</td>
+ <td>Nexus 5X、Nexus 6、Nexus 6P、Nexus 9、Pixel、Pixel XL、Android One</td>
+ <td>2017 年 3 月 23 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="eop-in-goodix-touchscreen-driver">Goodix 触摸屏驱动程序中的提权漏洞</h3>
+
+<p>Goodix 触摸屏驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0622</td>
+ <td>A-32749036<br />
+ <a href="https://source.codeaurora.org/quic/la/kernel/msm-3.18/commit/?id=40efa25345003a96db34effbd23ed39530b3ac10">QC-CR#1098602</a></td>
+ <td>高</td>
+ <td>Android One</td>
+ <td>Google 内部</td>
+ </tr>
+</tbody></table>
+
+<h3 id="eop-in-htc-bootloader">HTC 引导加载程序中的提权漏洞</h3>
+
+<p>HTC 引导加载程序中的提权漏洞可让本地恶意应用通过引导加载程序执行任意代码。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0623</td>
+ <td>A-32512358*<br />
+ </td>
+ <td>高</td>
+ <td>Pixel、Pixel XL</td>
+ <td>Google 内部</td>
+ </tr>
+</tbody></table>
+
+<p>* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
+
+<h3 id="id-in-qualcomm-wi-fi-driver">Qualcomm WLAN 驱动程序中的信息披露漏洞</h3>
+
+<p>Qualcomm WLAN 驱动程序中的信息披露漏洞可让本地恶意应用获取超出其权限范围的数据。由于该漏洞可用于在未经用户明确许可的情况下获取敏感数据,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0624</td>
+ <td>A-34327795*<br />QC-CR#2005832</td>
+ <td>高</td>
+ <td>Nexus 5X、Pixel、Pixel XL</td>
+ <td>2017 年 1 月 16 日</td>
+ </tr>
+</tbody></table>
+
+<p>* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
+
+<h3 id="id-in-mediatek-command-queue-driver">MediaTek 命令队列驱动程序中的信息披露漏洞</h3>
+
+<p>MediaTek 命令队列驱动程序中的信息披露漏洞可让本地恶意应用获取超出其权限范围的数据。由于该漏洞可用于在未经用户明确许可的情况下获取敏感数据,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0625</td>
+ <td>A-35142799*<br />M-ALPS03161531</td>
+ <td>高</td>
+ <td>无**</td>
+ <td>2017 年 2 月 8 日</td>
+ </tr>
+</tbody></table>
+
+<p>* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
+
+<p>** 搭载 Android 7.1.1(或更高版本)且已安装所有可用更新的受支持的 Google 设备不受此漏洞的影响。</p>
+
+<h3 id="id-in-qualcomm-crypto-engine-driver">Qualcomm 加密引擎驱动程序中的信息披露漏洞</h3>
+
+<p>Qualcomm 加密引擎驱动程序中的信息披露漏洞可让本地恶意应用获取超出其权限范围的数据。由于该漏洞可用于在未经用户明确许可的情况下获取敏感数据,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0626</td>
+ <td>A-35393124<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-4.4/commit/?id=64551bccab9b5b933757f6256b58f9ca0544f004">QC-CR#1088050</a></td>
+ <td>高</td>
+ <td>Nexus 5X、Nexus 6、Nexus 6P、Pixel、Pixel XL、Android One</td>
+ <td>2017 年 2 月 15 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="dos-in-qualcomm-wi-fi-driver">Qualcomm WLAN 驱动程序中的拒绝服务漏洞</h3>
+
+<p>Qualcomm WLAN 驱动程序中的拒绝服务漏洞可让邻近区域内的攻击者通过 WLAN 子系统导致拒绝服务。由于该漏洞可用于远程发起拒绝服务攻击,因此我们将其严重程度评为“高”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2016-10292</td>
+ <td>A-34514463*<br />QC-CR#1065466</td>
+ <td>高</td>
+ <td>Nexus 5X、Pixel、Pixel XL</td>
+ <td>2016 年 12 月 16 日</td>
+ </tr>
+</tbody></table>
+
+<p>* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
+
+<h3 id="id-in-kernel-uvc-driver">内核 UVC 驱动程序中的信息披露漏洞</h3>
+
+<p>内核 UVC 驱动程序中的信息披露漏洞可让本地恶意应用获取超出其权限范围的数据。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“中”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0627</td>
+ <td>A-33300353*<br />
+ </td>
+ <td>中</td>
+ <td>Nexus 5X、Nexus 6P、Nexus 9、Pixel C、Nexus Player</td>
+ <td>2016 年 12 月 2 日</td>
+ </tr>
+</tbody></table>
+
+<p>* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
+
+<h3 id="id-in-qualcomm-video-driver">Qualcomm 视频驱动程序中的信息披露漏洞</h3>
+
+<p>Qualcomm 视频驱动程序中的信息披露漏洞可让本地恶意应用获取超出其权限范围的数据。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“中”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2016-10293</td>
+ <td>A-33352393<br />
+ <a href="https://source.codeaurora.org/quic/la/kernel/msm-3.10/commit/?id=2469d5374745a2228f774adbca6fb95a79b9047f">QC-CR#1101943</a></td>
+ <td>中</td>
+ <td>Nexus 5X、Nexus 6P、Android One</td>
+ <td>2016 年 12 月 4 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="id-in-qualcomm-power-driver-(device-specific)">Qualcomm 电源驱动程序中的信息披露漏洞(特定于设备)</h3>
+
+<p>Qualcomm 电源驱动程序中的信息披露漏洞可让本地恶意应用获取超出其权限范围的数据。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“中”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2016-10294</td>
+ <td>A-33621829<br />
+ <a href="https://source.codeaurora.org/quic/la/kernel/msm-3.18/commit/?id=9e9bc51ffb8a298f0be5befe346762cdb6e1d49c">QC-CR#1105481</a></td>
+ <td>中</td>
+ <td>Nexus 5X、Nexus 6P、Pixel、Pixel XL</td>
+ <td>2016 年 12 月 14 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="id-in-qualcomm-led-driver">Qualcomm LED 驱动程序中的信息披露漏洞</h3>
+
+<p>Qualcomm LED 驱动程序中的信息披露漏洞可让本地恶意应用获取超出其权限范围的数据。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“中”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2016-10295</td>
+ <td>A-33781694<br />
+ <a href="https://source.codeaurora.org/quic/la/kernel/msm-3.18/commit/?id=f11ae3df500bc2a093ddffee6ea40da859de0fa9">QC-CR#1109326</a></td>
+ <td>中</td>
+ <td>Pixel、Pixel XL</td>
+ <td>2016 年 12 月 20 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="id-in-qualcomm-shared-memory-driver">Qualcomm 共享内存驱动程序中的信息披露漏洞</h3>
+
+<p>Qualcomm 共享内存驱动程序中的信息披露漏洞可让本地恶意应用获取超出其权限范围的数据。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“中”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2016-10296</td>
+ <td>A-33845464<br />
+ <a href="https://source.codeaurora.org/quic/la/kernel/msm-3.18/commit/?id=a5e46d8635a2e28463b365aacdeab6750abd0d49">QC-CR#1109782</a></td>
+ <td>中</td>
+ <td>Nexus 5X、Nexus 6P、Pixel、Pixel XL、Android One</td>
+ <td>2016 年 12 月 22 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="id-in-qualcomm-camera-driver">Qualcomm 相机驱动程序中的信息披露漏洞</h3>
+
+<p>Qualcomm 相机驱动程序中的信息披露漏洞可让本地恶意应用获取超出其权限范围的数据。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“中”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0628</td>
+ <td>A-34230377<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-4.4/commit/?id=012e37bf91490c5b59ba2ab68a4d214b632b613f">QC-CR#1086833</a></td>
+ <td>中</td>
+ <td>Nexus 5X、Nexus 6、Pixel、Pixel XL</td>
+ <td>2017 年 1 月 10 日</td>
+ </tr>
+ <tr>
+ <td>CVE-2017-0629</td>
+ <td>A-35214296<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-4.4/commit/?id=012e37bf91490c5b59ba2ab68a4d214b632b613f">QC-CR#1086833</a></td>
+ <td>中</td>
+ <td>Nexus 5X、Nexus 6、Pixel、Pixel XL</td>
+ <td>2017 年 2 月 8 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="id-in-kernel-trace-subsystem">内核跟踪子系统中的信息披露漏洞</h3>
+
+<p>内核跟踪子系统中的信息披露漏洞可让本地恶意应用获取超出其权限范围的数据。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“中”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0630</td>
+ <td>A-34277115*<br />
+ </td>
+ <td>中</td>
+ <td>Nexus 5X、Nexus 6、Nexus 6P、Nexus 9、Pixel、Pixel XL、Pixel C、Android One、Nexus Player</td>
+ <td>2017 年 1 月 11 日</td>
+ </tr>
+</tbody></table>
+
+<p>* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
+
+<h3 id="id-in-qualcomm-sound-codec-driver">Qualcomm 声音编解码器驱动程序中的信息披露漏洞</h3>
+
+<p>Qualcomm 声音编解码器驱动程序中的信息披露漏洞可让本地恶意应用获取超出其权限范围的数据。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“中”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2016-5858</td>
+ <td>A-35400153<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-3.18/commit/?id=3154eb1d263b9c3eab2c9fa8ebe498390bf5d711">QC-CR#1096799</a> <a href="https://source.codeaurora.org/quic/la//kernel/msm-3.18/commit/?id=afc5bea71bc8f251dad1104568383019f4923af6">[2]</a></td>
+ <td>中</td>
+ <td>Nexus 5X、Nexus 6、Nexus 6P、Pixel、Pixel XL、Android One</td>
+ <td>2017 年 2 月 15 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="id-in-qualcomm-camera-driver-2">Qualcomm 相机驱动程序中的信息披露漏洞</h3>
+
+<p>Qualcomm 相机驱动程序中的信息披露漏洞可让本地恶意应用获取超出其权限范围的数据。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“中”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0631</td>
+ <td>A-35399756<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-4.4/commit/?id=8236d6ebc7e26361ca7078cbeba01509f10941d8">QC-CR#1093232</a></td>
+ <td>中</td>
+ <td>Nexus 5X、Nexus 6P、Pixel、Pixel XL、Android One</td>
+ <td>2017 年 2 月 15 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="id-in-qualcomm-sound-driver">Qualcomm 声音驱动程序中的信息披露漏洞</h3>
+
+<p>Qualcomm 声音驱动程序中的信息披露漏洞可让本地恶意应用获取超出其权限范围的数据。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“中”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2016-5347</td>
+ <td>A-35394329<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-4.4/commit/?id=f14390f13e62460fc6b05fc0acde0e825374fdb6">QC-CR#1100878</a></td>
+ <td>中</td>
+ <td>Nexus 5X、Nexus 6、Nexus 6P、Pixel、Pixel XL、Android One</td>
+ <td>2017 年 2 月 15 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="id-in-qualcomm-spcom-driver">Qualcomm SPCom 驱动程序中的信息披露漏洞</h3>
+
+<p>Qualcomm SPCom 驱动程序中的信息披露漏洞可让本地恶意应用获取超出其权限范围的数据。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“中”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2016-5854</td>
+ <td>A-35392792<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-4.4/commit/?id=28d23d4d7999f683b27b6e0c489635265b67a4c9">QC-CR#1092683</a></td>
+ <td>中</td>
+ <td>无*</td>
+ <td>2017 年 2 月 15 日</td>
+ </tr>
+ <tr>
+ <td>CVE-2016-5855</td>
+ <td>A-35393081<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-4.4/commit/?id=a5edb54e93ba85719091fe2bc426d75fa7059834">QC-CR#1094143</a></td>
+ <td>中</td>
+ <td>无*</td>
+ <td>2017 年 2 月 15 日</td>
+ </tr>
+</tbody></table>
+
+<p>* 搭载 Android 7.1.1(或更高版本)且已安装所有可用更新的受支持的 Google 设备不受此漏洞的影响。</p>
+
+<h3 id="id-in-qualcomm-sound-codec-driver-2">Qualcomm 声音编解码器驱动程序中的信息披露漏洞</h3>
+
+<p>Qualcomm 声音编解码器驱动程序中的信息披露漏洞可让本地恶意应用获取超出其权限范围的数据。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“中”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0632</td>
+ <td>A-35392586<br />
+ <a href="https://source.codeaurora.org/quic/la//kernel/msm-3.10/commit/?id=970d6933e53c1f7ca8c8b67f49147b18505c3b8f">QC-CR#832915</a></td>
+ <td>中</td>
+ <td>Android One</td>
+ <td>2017 年 2 月 15 日</td>
+ </tr>
+</tbody></table>
+
+<h3 id="id-in-broadcom-wi-fi-driver">Broadcom WLAN 驱动程序中的信息披露漏洞</h3>
+
+<p>Broadcom WLAN 驱动程序中的信息披露漏洞可让本地恶意组件获取超出其权限范围的数据。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“中”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0633</td>
+ <td>A-36000515*<br />B-RB#117131</td>
+ <td>中</td>
+ <td>Nexus 6、Nexus 6P、Nexus 9、Pixel C、Nexus Player</td>
+ <td>2017 年 2 月 23 日</td>
+ </tr>
+</tbody></table>
+
+<p>* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
+
+<h3 id="id-in-synaptics-touchscreen-driver">Synaptics 触摸屏驱动程序中的信息披露漏洞</h3>
+
+<p>Synaptics 触摸屏驱动程序中的信息披露漏洞可让本地恶意应用获取超出其权限范围的数据。由于该漏洞需要先破坏特许进程,因此我们将其严重程度评为“中”。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2017-0634</td>
+ <td>A-32511682*<br />
+ </td>
+ <td>中</td>
+ <td>Pixel、Pixel XL</td>
+ <td>Google 内部</td>
+ </tr>
+</tbody></table>
+
+<p>* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
+
+<h3 id="vulnerabilities-in-qualcomm-components-2">Qualcomm 组件中的漏洞</h3>
+
+<p>下列影响 Qualcomm 组件的漏洞已包含在 2014-2016 年发布的 Qualcomm AMSS 安全公告内容中。此 Android 安全公告中也包含这些漏洞,旨在将其修复方案与 Android 安全补丁程序级别建立关联。</p>
+
+<table>
+ <colgroup><col width="19%" />
+ <col width="20%" />
+ <col width="10%" />
+ <col width="23%" />
+ <col width="17%" />
+ </colgroup><tbody><tr>
+ <th>CVE</th>
+ <th>参考信息</th>
+ <th>严重程度</th>
+ <th>已更新的 Google 设备</th>
+ <th>报告日期</th>
+ </tr>
+ <tr>
+ <td>CVE-2014-9923</td>
+ <td>A-35434045**<br />QC-CR#403910</td>
+ <td>严重</td>
+ <td>无***</td>
+ <td>Qualcomm 内部</td>
+ </tr>
+ <tr>
+ <td>CVE-2014-9924</td>
+ <td>A-35434631**<br />QC-CR#596102</td>
+ <td>严重</td>
+ <td>无***</td>
+ <td>Qualcomm 内部</td>
+ </tr>
+ <tr>
+ <td>CVE-2014-9925</td>
+ <td>A-35444657**<br />QC-CR#638130</td>
+ <td>严重</td>
+ <td>无***</td>
+ <td>Qualcomm 内部</td>
+ </tr>
+ <tr>
+ <td>CVE-2014-9926</td>
+ <td>A-35433784**<br />QC-CR#631527</td>
+ <td>严重</td>
+ <td>无***</td>
+ <td>Qualcomm 内部</td>
+ </tr>
+ <tr>
+ <td>CVE-2014-9927</td>
+ <td>A-35433785**<br />QC-CR#661111</td>
+ <td>严重</td>
+ <td>无***</td>
+ <td>Qualcomm 内部</td>
+ </tr>
+ <tr>
+ <td>CVE-2014-9928</td>
+ <td>A-35438623**<br />QC-CR#696972</td>
+ <td>严重</td>
+ <td>无***</td>
+ <td>Qualcomm 内部</td>
+ </tr>
+ <tr>
+ <td>CVE-2014-9929</td>
+ <td>A-35443954**<br />QC-CR#644783</td>
+ <td>严重</td>
+ <td>无***</td>
+ <td>Qualcomm 内部</td>
+ </tr>
+ <tr>
+ <td>CVE-2014-9930</td>
+ <td>A-35432946**<br />QC-CR#634637</td>
+ <td>严重</td>
+ <td>无***</td>
+ <td>Qualcomm 内部</td>
+ </tr>
+ <tr>
+ <td>CVE-2015-9005</td>
+ <td>A-36393500**<br />QC-CR#741548</td>
+ <td>严重</td>
+ <td>无***</td>
+ <td>Qualcomm 内部</td>
+ </tr>
+ <tr>
+ <td>CVE-2015-9006</td>
+ <td>A-36393450**<br />QC-CR#750559</td>
+ <td>严重</td>
+ <td>无***</td>
+ <td>Qualcomm 内部</td>
+ </tr>
+ <tr>
+ <td>CVE-2015-9007</td>
+ <td>A-36393700**<br />QC-CR#807173</td>
+ <td>严重</td>
+ <td>无***</td>
+ <td>Qualcomm 内部</td>
+ </tr>
+ <tr>
+ <td>CVE-2016-10297</td>
+ <td>A-36393451**<br />QC-CR#1061123</td>
+ <td>严重</td>
+ <td>无***</td>
+ <td>Qualcomm 内部</td>
+ </tr>
+ <tr>
+ <td>CVE-2014-9941</td>
+ <td>A-36385125**<br />QC-CR#509915</td>
+ <td>高</td>
+ <td>无***</td>
+ <td>Qualcomm 内部</td>
+ </tr>
+ <tr>
+ <td>CVE-2014-9942</td>
+ <td>A-36385319**<br />QC-CR#533283</td>
+ <td>高</td>
+ <td>无***</td>
+ <td>Qualcomm 内部</td>
+ </tr>
+ <tr>
+ <td>CVE-2014-9943</td>
+ <td>A-36385219**<br />QC-CR#546527</td>
+ <td>高</td>
+ <td>无***</td>
+ <td>Qualcomm 内部</td>
+ </tr>
+ <tr>
+ <td>CVE-2014-9944</td>
+ <td>A-36384534**<br />QC-CR#613175</td>
+ <td>高</td>
+ <td>无***</td>
+ <td>Qualcomm 内部</td>
+ </tr>
+ <tr>
+ <td>CVE-2014-9945</td>
+ <td>A-36386912**<br />QC-CR#623452</td>
+ <td>高</td>
+ <td>无***</td>
+ <td>Qualcomm 内部</td>
+ </tr>
+ <tr>
+ <td>CVE-2014-9946</td>
+ <td>A-36385281**<br />QC-CR#520149</td>
+ <td>高</td>
+ <td>无***</td>
+ <td>Qualcomm 内部</td>
+ </tr>
+ <tr>
+ <td>CVE-2014-9947</td>
+ <td>A-36392400**<br />QC-CR#650540</td>
+ <td>高</td>
+ <td>无***</td>
+ <td>Qualcomm 内部</td>
+ </tr>
+ <tr>
+ <td>CVE-2014-9948</td>
+ <td>A-36385126**<br />QC-CR#650500</td>
+ <td>高</td>
+ <td>无***</td>
+ <td>Qualcomm 内部</td>
+ </tr>
+ <tr>
+ <td>CVE-2014-9949</td>
+ <td>A-36390608**<br />QC-CR#652426</td>
+ <td>高</td>
+ <td>无***</td>
+ <td>Qualcomm 内部</td>
+ </tr>
+ <tr>
+ <td>CVE-2014-9950</td>
+ <td>A-36385321**<br />QC-CR#655530</td>
+ <td>高</td>
+ <td>无***</td>
+ <td>Qualcomm 内部</td>
+ </tr>
+ <tr>
+ <td>CVE-2014-9951</td>
+ <td>A-36389161**<br />QC-CR#525043</td>
+ <td>高</td>
+ <td>无***</td>
+ <td>Qualcomm 内部</td>
+ </tr>
+ <tr>
+ <td>CVE-2014-9952</td>
+ <td>A-36387019**<br />QC-CR#674836</td>
+ <td>高</td>
+ <td>无***</td>
+ <td>Qualcomm 内部</td>
+ </tr>
+</tbody></table>
+
+<p>* 这些漏洞的严重程度评级由供应商决定。</p>
+
+<p>* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
+
+<p>*** 搭载 Android 7.1.1(或更高版本)且已安装所有可用更新的受支持的 Google 设备不受此漏洞的影响。</p>
+
+<h2 id="common-questions-and-answers">常见问题和解答</h2>
+<p>本部分针对阅读本公告后可能产生的常见问题提供了相应的解答。</p>
+
+<p><strong>1. 如何确定我的设备是否已更新到解决了这些问题的版本?
+</strong></p>
+
+<p>要了解如何检查设备的安全补丁程序级别,请阅读 <a href="https://support.google.com/pixelphone/answer/4457705#pixel_phones&nexus_devices">Pixel 和 Nexus 更新时间表</a>中的说明。</p>
+
+<ul>
+<li>2017-05-01(或之后)的安全补丁程序级别解决了与 2017-05-01 安全补丁程序级别相关的所有问题。</li>
+<li>2017-05-05(或之后)的安全补丁程序级别解决了与 2017-05-05 安全补丁程序级别以及之前的所有补丁程序级别相关的所有问题。
+</li>
+</ul>
+
+<p>提供这些更新的设备制造商应将补丁程序字符串级别设为:</p>
+<ul>
+<li>[ro.build.version.security_patch]:[2017-05-01]</li>
+<li>[ro.build.version.security_patch]:[2017-05-05]</li>
+</ul>
+
+<p><strong>2. 为何此公告有 2 个安全补丁程序级别?</strong></p>
+
+<p>本公告有 2 个安全补丁程序级别,目的是让 Android 合作伙伴能够灵活地、更快速地修复所有 Android 设备上类似的一系列漏洞。我们建议 Android 合作伙伴修复本公告中的所有问题并使用最新的安全补丁程序级别。</p>
+<ul>
+<li>使用 2017 年 5 月 1 日安全补丁程序级别的设备必须包含该安全补丁程序级别对应的所有问题的修复方案,以及针对之前的安全公告中报告的所有问题的修复方案。</li>
+<li>使用 2017 年 5 月 5 日或更新的安全补丁程序级别的设备必须包含此(以及之前的)安全公告中的所有适用补丁程序。</li>
+</ul>
+
+<p>我们建议合作伙伴在一次更新中汇总要解决的所有问题的修复方案。</p>
+
+<p><strong>3. 如何确定各个问题都会影响哪些 Google 设备?</strong></p>
+
+<p>在 <a href="#2017-05-01-details">2017-05-01</a> 和 <a href="#2017-05-05-details">2017-05-05</a> 安全漏洞详情部分,每个表均包含“已更新的 Google 设备”列,其中列出了已针对每个问题更新过的受影响的 Google 设备系列。<em></em>此列有以下几种情形:</p>
+<ul>
+<li><strong>所有 Google 设备</strong>:如果某个问题会影响所有 Nexus 和 Pixel 设备,则相应表的“已更新的 Google 设备”列中会显示“所有”。<em></em>“所有”包含下列<a href="https://support.google.com/pixelphone/answer/4457705#pixel_phones&nexus_devices">受支持的设备</a>:Nexus 5X、Nexus 6、Nexus 6P、Nexus 9、Android One、Nexus Player、Pixel C、Pixel 和 Pixel XL。</li>
+<li><strong>部分 Google 设备</strong>:如果某个问题仅会影响部分 Google 设备,则“已更新的 Google 设备”列中会列出受影响的 Google 设备。<em></em></li>
+<li><strong>无 Google 设备</strong>:如果某个问题不会影响任何运行 Android 7.0 的 Google 设备,则相应表的“已更新的 Google 设备”列中会显示“无”。<em></em></li>
+</ul>
+<p><strong>4.“参考信息”列中的条目对应的是什么内容?</strong></p>
+
+<p>漏洞详情表的“参考信息”列中的条目可能包含用于标识参考值所属组织的前缀。<em></em>这些前缀的含义如下:</p>
+
+<table>
+ <tbody><tr>
+ <th>前缀</th>
+ <th>参考信息</th>
+ </tr>
+ <tr>
+ <td>A-</td>
+ <td>Android Bug ID</td>
+ </tr>
+ <tr>
+ <td>QC-</td>
+ <td>Qualcomm 参考编号</td>
+ </tr>
+ <tr>
+ <td>M-</td>
+ <td>MediaTek 参考编号</td>
+ </tr>
+ <tr>
+ <td>N-</td>
+ <td>NVIDIA 参考编号</td>
+ </tr>
+ <tr>
+ <td>B-</td>
+ <td>Broadcom 参考编号</td>
+ </tr>
+</tbody></table>
+<h2 id="revisions">修订版本</h2>
+<ul>
+<li>2017 年 5 月 1 日:发布了本公告。</li>
+<li>2017 年 5 月 2 日:修订了本公告,添加了 AOSP 链接。</li>
+</ul>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/security/encryption/file-based.html b/zh-cn/security/encryption/file-based.html
new file mode 100644
index 00000000..ce93f0e5
--- /dev/null
+++ b/zh-cn/security/encryption/file-based.html
@@ -0,0 +1,224 @@
+<html devsite><head>
+ <title>文件级加密</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>Android 7.0 及更高版本支持文件级加密 (FBE)。采用文件级加密时,可以使用不同的密钥对不同的文件进行加密,并且可以对这些文件进行单独解密。
+</p>
+<p>本文介绍了如何在新设备上启用文件级加密,以及如何更新系统应用,以充分利用新的 Direct Boot API 并尽可能为用户提供最佳、最安全的体验。
+</p>
+<h2 id="direct-boot">直接启动</h2>
+<p>借助文件级加密,Android 7.0 中引入了一项称为<a href="https://developer.android.com/training/articles/direct-boot.html">直接启动</a>的新功能。该功能处于启用状态时,已加密设备在启动后将直接进入锁定屏幕。之前,在使用<a href="full-disk.html">全盘加密</a> (FDE) 的已加密设备上,用户在访问任何数据之前都需要先提供凭据,从而导致手机无法执行除最基本操作之外的所有其他操作。例如,闹钟无法运行,无障碍服务不可用,手机无法接电话,而只能进行基本的紧急拨号操作。
+</p>
+<p>引入文件级加密 (FBE) 和新 API 后,便可以将应用设为加密感知型应用,这样一来,它们将能够在受限环境中运行。这些应用将可以在用户提供凭据之前运行,同时系统仍能保护私密用户信息。
+</p>
+<p>在启用了 FBE 的设备上,每位用户均有两个可供应用使用的存储位置:</p>
+<ul>
+ <li>凭据加密 (CE) 存储空间:这是默认存储位置,只有在用户解锁设备后才可用。</li>
+ <li>设备加密 (DE) 存储空间:在直接启动模式期间以及用户解锁设备后均可用。</li>
+</ul>
+<p>这种区分能够使工作资料更加安全,因为这样一来,加密不再只基于启动时密码,从而能够同时保护多位用户。
+</p>
+<p>Direct Boot API 允许加密感知型应用访问上述每个区域。应用生命周期会发生一些变化,以便在用户的 CE 存储空间因用户在锁定屏幕上首次输入凭据而解锁时,或者在工作资料提供<a href="https://developer.android.com/about/versions/nougat/android-7.0.html#android_for_work">工作挑战</a>时,通知应用。<em></em>无论是否实现了 FBE,运行 Android 7.0 的设备都必须要支持这些新的 API 和生命周期。不过,如果没有 FBE,DE 和 CE 存储空间将始终处于解锁状态。
+</p>
+<p>Android 开放源代码项目 (AOSP) 中提供了 EXT4 文件系统中的文件级加密的完整实现。在满足相关要求的设备上,只需启用该实现即可使用该功能。选择使用 FBE 的制造商可能想要了解根据所用系统芯片 (SoC) 优化该功能的方法。
+</p>
+<p>AOSP 中的所有必要程序包均已更新为直接启动感知型程序包。不过,如果设备制造商使用的是这些应用的定制版本,则需要确保至少存在能够提供以下服务的直接启动感知型程序包:</p>
+
+<ul>
+<li>电话服务和拨号器</li><li>用于在锁定屏幕中输入密码的输入法</li></ul>
+
+<h2 id="examples-and-source">示例和源代码</h2>
+
+<p>Android 提供了文件级加密的参考实现,其中 vold (system/vold) 负责提供用于管理 Android 上的存储设备和存储卷的功能。添加 PDE 会为 vold 提供一些新命令,以便支持对多位用户的 CE 密钥和 DE 密钥进行密钥管理。除了为使用内核中的 <a href="#kernel-support">EXT4 加密</a>功能而进行的核心更改外,许多系统程序包(包括锁定屏幕和 SystemUI)也经过了修改,以支持 FBE 和“直接启动”功能。其中包括:</p>
+
+<ul>
+<li>AOSP 拨号器 (packages/apps/Dialer)</li><li>桌面时钟 (packages/apps/DeskClock)</li><li>LatinIME (packages/inputmethods/LatinIME)*</li><li>“设置”应用 (packages/apps/Settings)*</li><li>SystemUI (frameworks/base/packages/SystemUI)*</li></ul>
+<p>
+<em>*使用 <code><a href="#supporting-direct-boot-in-system-applications">defaultToDeviceProtectedStorage</a></code> 清单属性的系统应用</em>
+</p>
+<p>通过在 AOSP 源代码树的框架或程序包目录中运行 <code>mangrep directBootAware</code> 命令,可以找到更多加密感知型应用和服务的示例。
+</p>
+<h2 id="dependencies">依赖关系</h2>
+<p>要安全地使用 AOSP 提供的 FBE 实现,设备需要满足以下依赖关系:</p>
+
+<ul>
+<li>对 EXT4 加密的<strong>内核支持</strong>(内核配置选项:EXT4_FS_ENCRYPTION)</li><li>基于 1.0 或 2.0 版 HAL 的 <strong><a href="/security/keystore/index.html">Keymaster 支持</a></strong>。不支持 Keymaster 0.3,因为它既不提供必要的功能,也不能保证为加密密钥提供充分保护。
+</li><li>必须在<a href="/security/trusty/index.html">可信执行环境</a> (TEE) 中实现 <strong>Keymaster/<a href="/security/keystore/index.html">Keystore</a> 和 Gatekeeper</strong>,以便为 DE 密钥提供保护,从而使未经授权的操作系统(刷到设备上的定制操作系统)无法直接请求 DE 密钥。
+</li><li>内核<strong>加密性能</strong>必须要在使用 AES XTS 时至少达到 50MB/s,以确保良好的用户体验。
+</li><li><strong>硬件信任根</strong>和<strong>验证启动</strong>需要绑定到 Keymaster 初始化进程,以确保未经授权的操作系统无法获取设备加密凭据。</li>
+</ul>
+
+<p class="note">
+<strong>注意</strong>:存储政策会应用到文件夹及其所有子文件夹。对于以未加密形式存入 OTA 文件夹以及存入系统解密密钥存放文件夹的内容,制造商应加以限制。大多数内容都应存放在凭据加密存储空间(而非设备加密存储空间)内。
+</p>
+
+<h2 id="implementation">实现</h2>
+<p>最重要的一点是,应根据<a href="https://developer.android.com/training/articles/direct-boot.html">直接启动</a>开发者文档将诸如闹钟、电话、无障碍功能等应用设为 android:directBootAware。
+</p>
+<h3 id="kernel-support">内核支持</h3>
+<p>AOSP 提供的文件级加密实现会用到 Linux 4.4 内核中的 EXT4 加密功能。推荐的解决方案是使用基于 4.4 或更高版本的内核。EXT4 加密还反向移植到了 Android 公共代码库内的 3.10 内核以及受支持的 Nexus 内核。
+</p>
+<p>对于希望将该功能引入到其设备内核的设备制造商来说,AOSP 内核/公共 Git 代码库中的 android-3.10.y 分支可作为一个很好的着手点。不过,务必要在最新的稳定版 Linux 内核(目前是 <a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/log/?id=refs/tags/v4.6">linux-4.6</a>)中应用 EXT4 和 JBD2 项目提供的最新补丁程序。Nexus 设备内核已经包含其中很多补丁程序。
+</p>
+<table>
+ <tbody><tr>
+ <th>设备</th>
+ <th>内核</th>
+ </tr>
+ <tr>
+ <td>Android Common</td>
+ <td><strong>kernel/common</strong> android-3.10.y (<a href="https://android.googlesource.com/kernel/common/+/android-3.10.y">Git</a>)</td>
+ </tr>
+ <tr>
+ <td>Nexus 5X (bullhead)</td>
+ <td><strong>kernel/msm</strong> android-msm-bullhead-3.10-n-preview-2 (<a href="https://android.googlesource.com/kernel/msm/+/android-msm-bullhead-3.10-n-preview-2">Git</a>)</td>
+ </tr>
+ <tr>
+ <td>Nexus 6P (angler)</td>
+ <td><strong>kernel/msm</strong> android-msm-angler-3.10-n-preview-2 (<a href="https://android.googlesource.com/kernel/msm/+/android-msm-angler-3.10-n-preview-2">Git</a>)</td>
+ </tr>
+</tbody></table>
+<p>请注意,以上每个内核都使用了到 3.10 的反向移植。Linux 3.18 中的 EXT4 和 JBD2 驱动程序已移植到基于 3.10 的现有内核中。由于内核各个部分之间存在依赖关系,因此这种反向移植会导致系统停止支持 Nexus 设备不使用的一些功能。其中包括:</p>
+
+<ul>
+<li>EXT3 驱动程序,不过 EXT4 仍可以装载并使用 EXT3 文件系统</li><li>全局文件系统 (GFS) 支持</li><li>EXT4 中的 ACL 支持</li>
+</ul>
+
+<p>除了对 EXT4 加密提供功能支持外,设备制造商还可以考虑实现加密加速功能,以便加快文件级加密的速度并改善用户体验。
+</p>
+<h3 id="enabling-file-based-encryption">启用文件级加密</h3>
+<p>通过将不带参数的 <code>fileencryption</code> 标记添加到 <code>userdata</code> 分区最后一列的 <code>fstab</code> 行中,可以启用 FBE。要查看示例,请访问 <a href="https://android.googlesource.com/device/lge/bullhead/+/nougat-release/fstab_fbe.bullhead">https://android.googlesource.com/device/lge/bullhead/+/nougat-release/fstab_fbe.bullhead</a>
+</p>
+<p>测试设备上的 FBE 实现情况时,可以指定以下标记:<code>forcefdeorfbe="&lt;path/to/metadata/partition&gt;"</code>
+</p>
+<p>此标记会将设备设为使用 FDE,但允许针对开发者转换为 FBE。默认情况下,此标记的行为类似于 <code>forceencrypt</code>,会使设备进入 FDE 模式。不过,它将提供一个调试选项,以便在开发者预览中允许将设备切换到 FBE 模式。另外,还可以使用以下命令在 fastboot 中启用 FBE:</p>
+<p>
+<code>$ fastboot --wipe-and-use-fbe</code>
+</p>
+<p>此标记仅用于开发目的,可提供一个在实际 FBE 设备发布之前演示 FBE 功能的平台。此标记在将来可能会被弃用。
+</p>
+<h3 id="integrating-with-keymaster">与 Keymaster 集成</h3>
+<p><code>vold</code> 负责处理密钥生成和内核密钥环管理工作。AOSP 的 FBE 实现要求设备支持 1.0 或更高版本的 Keymaster HAL。更低版本的 Keymaster HAL 不受支持。</p>
+<p>首次启动时,在启动过程的早期阶段会生成并安装用户 0 的密钥。到 <code>init</code> 的 <code>on-post-fs</code> 阶段完成时,Keymaster 必须已做好处理请求的准备。在 Nexus 设备上,这是通过设置一个脚本块处理的:</p>
+
+<ul>
+<li>确保 Keymaster 在 <code>/data</code> 装载之前启动</li><li>指定文件加密算法套件:AOSP 的文件级加密实现会用到采用 XTS 模式的 AES-256 算法<p class="note">
+<strong>注意</strong>:所有加密都基于采用 XTS 模式的 AES-256 算法。XTS 的定义方式决定了它需要两个 256 位密钥;因此实际上 CE 密钥和 DE 密钥都是 512 位密钥。
+</p>
+</li>
+</ul>
+
+<h3 id="encryption-policy">加密政策</h3>
+<p>EXT4 加密在目录级应用加密政策。首次创建设备的 <code>userdata</code> 分区时,会由 <code>init</code> 脚本应用基本结构和政策。这些脚本将触发创建首位用户(用户 0)的 CE 密钥和 DE 密钥,并定义要使用这些密钥加密哪些目录。创建其他用户和资料时,会生成必要的其他密钥并将其存储在密钥代码库中;接下来会创建它们的凭据和设备存储位置,并且加密政策会将这些密钥关联到相应目录。
+</p>
+<p>在 AOSP 当前提供的文件级加密实现中,加密政策被硬编码到了以下位置:</p>
+<p>
+<code>/system/extras/ext4_utils/ext4_crypt_init_extensions.cpp</code>
+</p>
+<p>可以在该文件中添加例外情况,以彻底防止特定目录被加密,具体方法是将相应目录添加到 <code>directories_to_exclude</code> 列表中。如果进行了此类修改,设备制造商应添加 <a href="/security/selinux/device-policy.html">SELinux 政策</a>,以便仅向需要使用未加密目录的应用授予访问权限(应排除所有不可信的应用)。
+</p>
+<p>目前唯一可接受的使用这种方法的情况是在支持旧版 OTA 功能方面。
+</p>
+<h3 id="supporting-direct-boot-in-system-applications">在系统应用中支持直接启动</h3>
+
+<h4 id="making-applications-direct-boot-aware">将应用设为直接启动感知型应用</h4>
+<p>为了实现系统应用的快速迁移,新增了两个可在应用级别设置的属性。<code>defaultToDeviceProtectedStorage</code> 属性仅适用于系统应用,<code>directBootAware</code> 属性则适用于所有应用。
+</p>
+
+<pre>
+&lt;application
+ android:directBootAware="true"
+ android:defaultToDeviceProtectedStorage="true"&gt;
+</pre>
+
+<p>应用级别的 <code>directBootAware</code> 属性的含义是将相应应用中的所有组件均标记为加密感知型组件。
+</p>
+<p><code>defaultToDeviceProtectedStorage</code> 属性用于将默认的应用存储位置重定向到 DE 存储空间(而非 CE 存储空间)。使用此标记的系统应用必须要仔细审核存储在默认位置的所有数据,并将敏感数据的路径更改为使用 CE 存储空间。使用此选项的设备制造商应仔细检查要存储的数据,以确保其中不含任何个人信息。
+</p>
+<p>在这种模式下运行时,以下系统 API 可在需要时用于明确管理由 CE 存储空间支持的 Context(这些 API 与设备保护存储空间适用的同类 API 相对应)。
+</p>
+
+<ul>
+<li><code>Context.createCredentialProtectedStorageContext()</code>
+</li><li><code>Context.isCredentialProtectedStorage()</code></li>
+</ul>
+<h4 id="supporting-multiple-users">支持多位用户</h4>
+<p>多用户环境中的每位用户均会获得一个单独的加密密钥。每位用户均会获得两个密钥:一个 DE 密钥和一个 CE 密钥。用户 0 由于是特殊用户,因此必须要先登录设备。这部分适用于使用<a href="/devices/tech/admin/index.html">设备管理功能</a>的情况。
+</p>
+<p>加密感知型应用按照以下方式与各用户进行互动:<code>INTERACT_ACROSS_USERS</code> 和 <code>INTERACT_ACROSS_USERS_FULL</code> 允许应用与设备上的所有用户互动。不过,这些应用只能访问已解锁用户的 CE 加密目录。
+</p>
+<p>应用或许能够与各个 DE 区域自由互动,但一位用户已解锁并不意味着设备上的所有用户均已解锁。应用在尝试访问这些区域之前,应先检查该状态。
+</p>
+<p>每个工作资料用户 ID 也会获得两个密钥:一个 DE 密钥和一个 CE 密钥。当满足工作挑战时,资料用户会被解锁,并且 Keymaster(在 TEE 中)可以提供资料的 TEE 密钥。
+</p>
+<h3 id="handling-updates">处理更新</h3>
+<p>恢复分区无法访问用户数据分区中采用 DE 保护的存储空间。强烈建议实现 FBE 的设备支持新版 OTA 机制(采用即将推出的 A/B 系统更新方式)。由于可以在正常操作期间应用 OTA 更新,因此恢复分区无需访问已加密存储卷中的数据。
+</p>
+<p>如果使用旧版 OTA 解决方案(该解决方案要求恢复分区访问用户数据分区中的 OTA 文件),则需要执行以下操作:</p>
+
+<ul>
+<li>在用户数据分区中创建一个顶级目录(例如“misc_ne”)。
+</li><li>将该顶级目录添加到加密政策例外情况中(请参阅上文中的<a href="#encryption-policy">加密政策</a>)。
+</li><li>在该目录中创建一个用于存放 OTA 更新包的目录。
+</li><li>添加 SELinux 规则和文件环境,以便控制对该文件夹及其内容的访问。应当只有接收 OTA 更新的进程或应用能够对该文件夹进行读取和写入操作。
+</li><li>任何其他应用或进程都不应具有访问该文件夹的权限。</li>
+</ul>
+
+<p>在该文件夹中创建一个目录,以便存放 OTA 更新包。
+</p>
+<h2 id="validation">验证</h2>
+<p>为了确保实现的 FBE 功能版本能够按预期工作,需要部署多种 <a href="https://android.googlesource.com/platform/cts/+/nougat-cts-release/hostsidetests/appsecurity/src/android/appsecurity/cts/DirectBootHostTest.java">CTS 加密测试</a>。
+</p>
+<p>可以顺利为您的主板编译内核后,请另行为 x86 编译内核并在 QEMU 下运行该内核,然后您就可以使用以下命令通过 <a hre="https://git.kernel.org/cgit/fs/ext2/xfstests-bld.git/plain/quick-start?h=META">xfstest</a> 进行测试了:</p>
+<pre>
+$ kvm-xfstests -c encrypt -g auto
+</pre>
+<p>此外,设备制造商可以在启用了 FBE 的设备上进行以下手动测试:</p>
+
+<ul>
+ <li>检查 <code>ro.crypto.state</code> 是否存在<ul>
+ <li>确认 <code>ro.crypto.state</code> 是否已加密</li>
+ </ul>
+ </li>
+ <li>检查 <code>ro.crypto.type</code> 是否存在<ul>
+ <li>确认 <code>ro.crypto.type</code> 是否已设为 <code>file</code></li>
+ </ul>
+ </li>
+</ul>
+
+<p>此外,测试人员可以在主用户已设置锁定屏幕的情况下启动一个 <code>userdebug</code> 实例。然后通过 <code>adb</code> shell 命令进入设备,并使用 <code>su</code> 获得 root 权限。确认 <code>/data/data</code> 中是否包含加密的文件名;如果没有,则表示存在问题。
+</p>
+<h2 id="aosp-implementation-details">AOSP 实现详情</h2>
+<p>本部分详细介绍了 AOSP 的文件级加密实现,并讲解了文件级加密的运作方式。设备制造商应该无需执行任何更改,即可在其设备上使用 FBE 和“直接启动”功能。
+</p>
+<h3 id="ext4-encryption">EXT4 加密</h3>
+<p>AOSP 的文件级加密实现会用到内核中的 EXT4 加密功能,并配置为:</p><ul>
+<li>借助采用 XTS 模式的 AES-256 算法加密文件内容</li><li>借助采用 CBC-CTS 模式的 AES-256 算法加密文件名</li></ul>
+<h3 id="key-derivation">密钥派生</h3>
+<p>硬盘加密密钥(512 位 AES-XTS 密钥)以加密形式存储:通过另一个存放在 TEE 中的密钥(256 位 AES-GCM 密钥)进行加密。要使用该 TEE 密钥,需要具备以下三项:</p><ul>
+<li>身份验证令牌</li><li>扩展凭据</li><li>secdiscardable hash</li></ul>
+<p>身份验证令牌是一个经过加密和身份验证的令牌,由 <a href="/security/authentication/gatekeeper.html">Gatekeeper</a> 在用户成功登录时生成。<em></em>除非用户提供的身份验证令牌正确无误,否则 TEE 将拒绝用户使用该密钥。如果用户没有任何凭据,则不使用也不需要使用身份验证令牌。
+</p>
+<p>扩展凭据是使用 <code>scrypt</code> 算法进行加盐和扩展处理的用户凭据。<em></em>实际上,凭据在被传递到 <code>vold</code>(以便传递到 <code>scrypt</code>)之前,会在锁定设置服务中接受一次哈希处理。扩展凭据会以加密形式绑定到 TEE 中的相应密钥,并享有适用于 <code>KM_TAG_APPLICATION_ID</code> 的所有保证。如果用户没有凭据,则不使用也不需要使用扩展凭据。
+</p>
+<p><code>secdiscardable hash</code> 是 16 KB 随机文件的 512 位哈希,和用于重建相应密钥的其他信息(例如种子)存储在一起。在相应密钥被删除时,该文件会一并被安全地删除,或以新的方式被加密;采用这种附加的保护措施后,攻击者要恢复相应密钥,必须要先恢复这个被安全删除的文件中的每一个位。secdiscardable hash 同样会以加密形式绑定到 TEE 中的相应密钥,并享有适用于 <code>KM_TAG_APPLICATION_ID</code> 的所有保证。请参阅<a href="/security/keystore/implementer-ref.html">面向 Keystore 实现人员的参考资料</a>。
+
+</p></body></html> \ No newline at end of file
diff --git a/zh-cn/security/keystore/implementer-ref.html b/zh-cn/security/keystore/implementer-ref.html
new file mode 100644
index 00000000..19fabb57
--- /dev/null
+++ b/zh-cn/security/keystore/implementer-ref.html
@@ -0,0 +1,706 @@
+<html devsite><head>
+ <title>面向实现人员的参考资料</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>本页中提供了一些对 <a href="index.html">Keymaster</a> HAL 实现人员很有帮助的详细信息,其中介绍了 HAL 中的每个标记和每个函数。</p>
+
+<h2 id="authorization_tags">授权标记</h2>
+
+<p>除非标记说明中另有注明,否则以下所有标记都是在密钥生成期间用于指定密钥特性。</p>
+
+<h3 id="km_tag_purpose">KM_TAG_PURPOSE</h3>
+
+<p>用于指定相应密钥可用于哪些目的。</p>
+
+<p>可能的值是通过以下枚举定义的:</p>
+
+<pre>
+typedef enum {
+ KM_PURPOSE_ENCRYPT = 0,
+ KM_PURPOSE_DECRYPT = 1,
+ KM_PURPOSE_SIGN = 2,
+ KM_PURPOSE_VERIFY = 3,
+} keymaster_purpose_t;
+</pre>
+
+<p>此标记可重复使用。可以生成具有多个值的密钥,不过一项操作只有一个目的。当调用 <a href="#begin">begin</a> 函数来启动某项操作时,要指定操作的目的。如果为操作指定的目的未通过相应密钥授权,操作必须失败并显示 <code>KM_ERROR_INCOMPATIBLE_PURPOSE</code>。</p>
+
+<h3 id="km_tag_algorithm">KM_TAG_ALGORITHM</h3>
+
+<p>用于指定与相应密钥配合使用的加密算法。</p>
+
+<p>可能的值是通过以下枚举定义的:</p>
+
+<pre>
+typedef enum {
+ KM_ALGORITHM_RSA = 1,
+ KM_ALGORITHM_EC = 3,
+ KM_ALGORITHM_AES = 32,
+ KM_ALGORITHM_HMAC = 128,
+} keymaster_algorithm_t;
+</pre>
+
+<p>此标记不可重复使用。</p>
+
+<h3 id="km_tag_key_size">KM_TAG_KEY_SIZE</h3>
+
+<p>用于指定相应密钥的大小(以位数计,按适用于相应密钥算法的一般方式衡量)。例如,对于 RSA 密钥,<code>KM_TAG_KEY_SIZE</code> 用于指定公开模数的大小。对于 AES 密钥,此标记用于指定密钥私密材料的长度。</p>
+
+<p>此标记不可重复使用。</p>
+
+<h3 id="km_tag_block_mode">KM_TAG_BLOCK_MODE</h3>
+
+<p>用于指定可与相应密钥配合使用的分块加密模式。此标记仅与 AES 密钥有关。</p>
+
+<p>可能的值是通过以下枚举定义的:</p>
+
+<pre>
+typedef enum {
+ KM_MODE_ECB = 1,
+ KM_MODE_CBC = 2,
+ KM_MODE_CTR = 3,
+ KM_MODE_GCM = 32,
+} keymaster_block_mode_t;
+</pre>
+
+<p>此标记可重复使用。对于 AES 密钥操作,必须要在 <a href="#begin">begin</a> 的 <code>additional_params</code> 参数中指定模式。如果指定的模式不在相应密钥的关联模式之列,操作必须失败并显示 <code>KM_ERROR_INCOMPATIBLE_BLOCK_MODE</code>。</p>
+
+<h3 id="km_tag_digest">KM_TAG_DIGEST</h3>
+
+<p>用于指定可与相应密钥配合使用以执行签名和验证操作的摘要算法。此标记与 RSA 密钥、ECDSA 密钥和 HMAC 密钥有关。</p>
+
+<p>可能的值是通过以下枚举定义的:</p>
+
+<pre>
+typedef enum {
+ KM_DIGEST_NONE = 0,
+ KM_DIGEST_MD5 = 1,
+ KM_DIGEST_SHA1 = 2,
+ KM_DIGEST_SHA_2_224 = 3,
+ KM_DIGEST_SHA_2_256 = 4,
+ KM_DIGEST_SHA_2_384 = 5,
+ KM_DIGEST_SHA_2_512 = 6,
+}
+keymaster_digest_t;
+</pre>
+
+<p>此标记可重复使用。对于签名和验证操作,必须要在 <a href="#begin">begin</a> 的 <code>additional_params</code> 参数中指定摘要。如果指定的摘要不在相应密钥的关联摘要之列,操作必须失败并显示 <code>KM_ERROR_INCOMPATIBLE_DIGEST</code>。</p>
+
+<h3 id="km_tag_padding">KM_TAG_PADDING</h3>
+
+<p>用于指定可与相应密钥配合使用的填充模式。此标记与 RSA 密钥和 AES 密钥有关。</p>
+
+<p>可能的值是通过以下枚举定义的:</p>
+
+<pre>
+typedef enum {
+ KM_PAD_NONE = 1,
+ KM_PAD_RSA_OAEP = 2,
+ KM_PAD_RSA_PSS = 3,
+ KM_PAD_RSA_PKCS1_1_5_ENCRYPT = 4,
+ KM_PAD_RSA_PKCS1_1_5_SIGN = 5,
+ KM_PAD_PKCS7 = 64,
+} keymaster_padding_t;
+</pre>
+
+<p><code>KM_PAD_RSA_OAEP</code> 和 <code>KM_PAD_RSA_PKCS1_1_5_ENCRYPT</code> 仅用于 RSA 加密/解密密钥,分别用来指定 RSA PKCS#1v2 OAEP 填充和 RSA PKCS#1 v1.5 随机填充。<code>KM_PAD_RSA_PSS</code> 和 <code>KM_PAD_RSA_PKCS1_1_5_SIGN</code> 仅用于 RSA 签名/验证密钥,分别用来指定 RSA PKCS#1v2 PSS 填充和 RSA PKCS#1 v1.5 确定性填充。另外请注意,RSA PSS 填充模式与 <a href="#km_tag_digest">KM_DIGEST_NONE</a> 不兼容。</p>
+
+<p><code>KM_PAD_NONE</code> 可与 RSA 密钥或 AES 密钥配合使用。对于 AES 密钥,如果将 <code>KM_PAD_NONE</code> 与分块模式 ECB 或 CBC 配合使用,并且要加密或解密的数据的长度不是 AES 分块大小的倍数,调用 finish 必须失败并显示 <code>KM_ERROR_INVALID_INPUT_LENGTH</code>。</p>
+
+<p><code>KM_PAD_PKCS7</code> 只能与 AES 密钥以及 ECB 和 CBC 模式配合使用。</p>
+
+<p>此标记可重复使用。在调用 <a href="#begin">begin</a> 时必须指定填充模式。如果指定的模式未针对相应密钥获得授权,操作必须失败并显示 <code>KM_ERROR_INCOMPATIBLE_BLOCK_MODE</code>。</p>
+
+<h3 id="km_tag_caller_nonce">KM_TAG_CALLER_NONCE</h3>
+
+<p>用于指定调用程序可以为需要随机数的操作提供随机数。</p>
+
+<p>此标记为布尔值,因此可能的值为 true(如果此标记存在)和 false(如果此标记不存在)。</p>
+
+<p>此标记仅用于 AES 密钥,并且仅与 CBC、CTR 和 GCM 分块模式有关。如果此标记不存在,实现应拒绝执行向 <a href="#begin">begin</a> 提供 <a href="#km_tag_nonce">KM_TAG_NONCE</a> 的所有操作,并显示 <code>KM_ERROR_CALLER_NONCE_PROHIBITED</code>。</p>
+
+<p>此标记不可重复使用。</p>
+
+<h3 id="km_tag_min_mac_length">KM_TAG_MIN_MAC_LENGTH</h3>
+
+<p>此标记是支持 GCM 模式的 HMAC 密钥和 AES 密钥所必需的标记,用于指定可通过相应密钥请求或验证的 MAC 的最小长度。</p>
+
+<p>此标记的值是 MAC 的最小长度(以位数计)。这个值必须是 8 的倍数。对于 HMAC 密钥,这个值不得小于 64。对于 GCM 密钥,这个值必须介于 96 到 128 之间。</p>
+
+<h3 id="km_tag_rsa_public_exponent">KM_TAG_RSA_PUBLIC_EXPONENT</h3>
+
+<p>用于为 RSA 密钥对指定公开指数的值。此标记仅与 RSA 密钥有关,而且是所有 RSA 密钥都必需的标记。</p>
+
+<p>此标记的值是一个 64 位的未签名整数,并且必须符合 RSA 公开指数方面的要求。由于这个值是由调用程序指定的,因此无法由实现来选择。这个值必须是质数。Trustlet 必须要支持 2^16+1 这个值,而且最好还支持其他合理的值,尤其是 3。如果未指定指数或指定的指数不受支持,密钥生成操作必须失败并显示 <code>KM_ERROR_INVALID_ARGUMENT</code>。</p>
+
+<p>此标记不可重复使用。</p>
+
+<h3 id="km_tag_blob_usage_requirements">KM_TAG_BLOB_USAGE_REQUIREMENTS</h3>
+
+<p>用于指定必须满足哪些系统环境条件才能使用生成的密钥。</p>
+
+<p>可能的值是通过以下枚举定义的:</p>
+
+<pre>
+typedef enum {
+ KM_BLOB_STANDALONE = 0,
+ KM_BLOB_REQUIRES_FILE_SYSTEM = 1,
+} keymaster_key_blob_usage_requirements_t;
+</pre>
+
+<p>可以在密钥生成期间指定此标记,以便要求只有在指定条件下才可以使用生成的密钥。此标记必须要和密钥特性一起返回(通过 <a href="#generate_key">generate_key</a> 和 <a href="#get_key_characteristics">get_key_characteristics</a>)。如果调用程序指定了 <code>KM_TAG_BLOB_USAGE_REQUIREMENTS</code>(值为 <code>KM_BLOB_STANDALONE</code>),Trustlet 必须返回一个可在没有文件系统支持的情况下使用的密钥 Blob。这对于具有已加密磁盘的设备至关重要:在使用 Keymaster 密钥解密磁盘之前,此类设备的文件系统可能一直无法使用。</p>
+
+<p>此标记不可重复使用。</p>
+
+<h3 id="km_tag_bootloader_only">KM_TAG_BOOTLOADER_ONLY</h3>
+
+<p>用于指定只有引导加载程序能够使用相应密钥。</p>
+
+<p>此标记为布尔值,因此可能的值为 true(如果此标记存在)和 false(如果此标记不存在)。</p>
+
+<p>尝试从 Android 系统使用带有 <code>KM_TAG_BOOTLOADER_ONLY</code> 标记的密钥时,操作必须失败并显示 <code>KM_ERROR_INVALID_KEY_BLOB</code>。</p>
+
+<p>此标记不可重复使用。</p>
+
+<h3 id="km_tag_active_datetime">KM_TAG_ACTIVE_DATETIME</h3>
+
+<p>用于指定相应密钥变为有效状态的日期和时间。在此之前,尝试使用相应密钥时,操作必须失败并显示 <code>KM_ERROR_KEY_NOT_YET_VALID</code>。</p>
+
+<p>此标记的值是一个 64 位的整数,表示距 1970 年 1 月 1 日的毫秒数。</p>
+
+<p>此标记不可重复使用。</p>
+
+<h3 id="km_tag_origination_expire_datetime">KM_TAG_ORIGINATION_EXPIRE_DATETIME</h3>
+
+<p>用于指定相应密钥无法再用于签名和加密目的的过期日期和时间。如果向 <a href="#begin">begin</a> 提供的目的是 <a href="#km_tag_purpose">KM_PURPOSE_SIGN</a> 或 <a href="#km_tag_purpose">KM_PURPOSE_ENCRYPT</a>,那么在此之后,尝试使用相应密钥时,操作必须失败并显示 <code>KM_ERROR_KEY_EXPIRED</code>。</p>
+
+<p>此标记的值是一个 64 位的整数,表示距 1970 年 1 月 1 日的毫秒数。</p>
+
+<p>此标记不可重复使用。</p>
+
+<h3 id="km_tag_usage_expire_datetime">KM_TAG_USAGE_EXPIRE_DATETIME</h3>
+
+<p>用于指定相应密钥无法再用于验证和解密目的的过期日期和时间。如果向 <a href="#begin">begin</a> 提供的目的是 <a href="#km_tag_purpose">KM_PURPOSE_VERIFY</a> 或 <a href="#km_tag_purpose">KM_PURPOSE DECRYPT</a>,那么在此之后,尝试使用相应密钥时,操作必须失败并显示 <code>KM_ERROR_KEY_EXPIRED</code>。</p>
+
+<p>此标记的值是一个 64 位的整数,表示距 1970 年 1 月 1 日的毫秒数。</p>
+
+<p>此标记不可重复使用。</p>
+
+<h3 id="km_tag_min_seconds_between_ops">KM_TAG_MIN_SECONDS_BETWEEN_OPS</h3>
+
+<p>用于指定至少必须间隔多长时间才能再次将密钥用于允许的操作。在不限制密钥使用次数可能会给暴力破解攻击以可乘之机的环境中,可以使用此标记来限制密钥的使用次数。</p>
+
+<p>此标记的值是一个 32 位的整数,表示允许的操作之间间隔的秒数。</p>
+
+<p>当有操作使用带有此标记的某个密钥时,计时器应在 <a href="#finish">finish</a> 或 <a href="#abort">abort</a> 调用期间启动。在计时器表明通过 <code>KM_TAG_MIN_SECONDS_BETWEEN_OPS</code> 指定的间隔时间已过去之前收到的所有 <a href="#begin">begin</a> 调用都必须失败并显示 <code>KM_ERROR_KEY_RATE_LIMIT_EXCEEDED</code>。这项要求意味着 Trustlet 必须要为带有此标记的密钥维护一份计时器表格。由于 Keymaster 内存的大小通常有限制,因此该表格可以具有固定的最大大小,并且当该表格被占满时,如果有操作尝试使用带有此标记的密钥,Keymaster 可以使这些操作失败。该表格必须能够容纳至少 32 个使用中的密钥,而且当密钥最小使用间隔到期时,必须主动重复使用该表格中的位置。如果某项操作因该表格已被占满而失败,Keymaster 应返回 <code>KM_ERROR_TOO_MANY_OPERATIONS</code>。</p>
+
+<p>此标记不可重复使用。</p>
+
+<h3 id="km_tag_max_uses_per_boot">KM_TAG_MAX_USES_PER_BOOT</h3>
+
+<p>用于指定在两次系统重启之间可以使用相应密钥的最大次数。这是另一种限制密钥使用次数的机制。</p>
+
+<p>此标记的值是一个 32 位的整数,表示在每次系统启动后可以使用相应密钥的次数。</p>
+
+<p>当有操作使用带有此标记的某个密钥时,与该密钥关联的计数器应在 <a href="#begin">begin</a> 调用期间递增。当密钥计数器超出此标记的值后,所有尝试使用该密钥的后续操作都必须失败并显示 <code>KM_ERROR_MAX_OPS_EXCEEDED</code>,直到设备重启为止。这项要求意味着 Trustlet 必须要为带有此标记的密钥维护一份使用次数计数器表格。由于 Keymaster 内存的大小通常有限制,因此该表格可以具有固定的最大大小,并且当该表格被占满时,如果有操作尝试使用带有此标记的密钥,Keymaster 可以使这些操作失败。该表格必须能够容纳至少 16 个密钥。如果某项操作因该表格已被占满而失败,Keymaster 应返回 <code>KM_ERROR_TOO_MANY_OPERATIONS</code>。</p>
+
+<p>此标记不可重复使用。</p>
+
+<h3 id="km_tag_user_secure_id">KM_TAG_USER_SECURE_ID</h3>
+
+<p>用于指定只能在某个安全的用户身份验证状态下使用相应密钥。此标记与 <a href="#km_tag_no_auth_required">KM_TAG_NO_AUTH_REQUIRED</a> 互斥。</p>
+
+<p>此标记的值是一个 64 位的整数,用于指定在通过 <a href="#km_tag_auth_token">KM_TAG_AUTH_TOKEN</a> 向 <a href="#begin">begin</a> 提供的身份验证令牌中必须存在哪个身份验证政策状态值,身份验证程序才会授权使用相应密钥。如果在调用 <a href="#begin">begin</a> 时未提供身份验证令牌,或提供的身份验证令牌没有匹配的政策状态值,但所用密钥带有此标记,该调用必须失败。</p>
+
+<p>此标记可重复使用。如果提供的值中有任何一个与身份验证令牌中的任何政策状态值一致,身份验证程序即会授权使用相应密钥。否则,操作必须失败并显示 <code>KM_ERROR_KEY_USER_NOT_AUTHENTICATED</code>。</p>
+
+<h3 id="km_tag_no_auth_required">KM_TAG_NO_AUTH_REQUIRED</h3>
+
+<p>用于指定无需进行身份验证即可使用相应密钥。此标记与 <a href="#km_tag_user_secure_id">KM_TAG_USER_SECURE_ID</a> 互斥。</p>
+
+<p>此标记为布尔值,因此可能的值为 true(如果此标记存在)和 false(如果此标记不存在)。</p>
+
+<p>此标记不可重复使用。</p>
+
+<h3 id="km_tag_user_auth_type">KM_TAG_USER_AUTH_TYPE</h3>
+
+<p>用于指定可以使用哪些类型的用户身份验证程序来授权使用相应密钥。请求 Keymaster 执行所用密钥带有此标记的操作时,必须要为 Keymaster 提供一个身份验证令牌,并且该令牌的 <code>authenticator_type</code> 字段必须与此标记中的值一致。准确来说就是,<code>(ntoh(token.authenticator_type) &amp;
+auth_type_tag_value) != 0</code> 必须为 true,其中 <code>ntoh</code> 是一个函数,用于将按网络字节序保存的整数转换成按主机字节序保存的整数,而 <code>auth_type_tag_value</code> 是此标记的值。</p>
+
+<p>此标记的值是以下枚举值的位掩码(32 位整数):</p>
+
+<pre>
+typedef enum {
+ HW_AUTH_NONE = 0,
+ HW_AUTH_PASSWORD = 1 &lt;&lt; 0,
+ HW_AUTH_FINGERPRINT = 1 &lt;&lt; 1,
+ // Additional entries should be powers of 2.
+ HW_AUTH_ANY = UINT32_MAX,
+} hw_authenticator_type_t;
+</pre>
+
+<p>此标记不可重复使用。</p>
+
+<h3 id="km_tag_auth_timeout">KM_TAG_AUTH_TIMEOUT</h3>
+
+<p>用于指定授权在多长时间内使用相应密钥(以秒数计,从通过身份验证开始算起)。如果 <a href="#km_tag_user_secure_id">KM_TAG_USER_SECURE_ID</a> 存在而此标记不存在,那么每次使用相应密钥时都需要通过身份验证(要详细了解各项操作的身份验证流程,请参阅 <a href="#begin">begin</a>)。</p>
+
+<p>此标记的值是一个 32 位的整数,用于指定可在多长时间内使用相应密钥(以秒数计,从使用通过 <a href="#km_tag_mac_length">KM_TAG_USER_AUTH_TYPE</a> 指定的身份验证方法对通过 <a href="#km_tag_user_secure_id">KM_TAG_USER_SECURE_ID</a> 指定的用户成功进行身份验证开始算起)。</p>
+
+<p>此标记不可重复使用。</p>
+
+<h3 id="km_tag_all_applications">KM_TAG_ALL_APPLICATIONS</h3>
+
+<p>预留标记,供将来使用。</p>
+
+<p>此标记不可重复使用。</p>
+
+<h3 id="km_tag_application_id">KM_TAG_APPLICATION_ID</h3>
+
+<p>当提供给 <a href="#generate_key">generate_key</a> 或 <a href="#import_key">import_key</a> 时,此标记用于指定使用相应密钥时必须要提供的数据。具体来说就是,调用 <a href="#export_key">export_key</a> 和 <a href="#get_key_characteristics">get_key_characteristics</a> 时必须要在 <code>client_id</code> 参数中提供相同的值,而调用 <a href="#begin">begin</a> 时则必须要提供此标记以及相同的相关数据(作为 <code>in_params</code> 集的一部分)。如果未收到正确的数据,函数必须返回 <code>KM_ERROR_INVALID_KEY_BLOB</code>。</p>
+
+<p><i></i>此标记的内容必须要以加密形式绑定到相应密钥,这意味着,如果有不轨人士有权访问安全域的所有机密内容,但无权访问此标记的内容,必须要确保他们无法解密相应密钥(在不对此标记的内容进行暴力破解攻击的情况下)。</p>
+
+<p>此标记的值是一个 Blob(任意长度的字节数数组)。</p>
+
+<p>此标记不可重复使用。</p>
+
+<h3 id="km_tag_application_data">KM_TAG_APPLICATION_DATA</h3>
+
+<p>当提供给 <a href="#generate_key">generate_key</a> 或 <a href="#import_key">import_key</a> 时,此标记用于指定使用相应密钥时必须要提供的数据。具体来说就是,调用 <a href="#export_key">export_key</a> 和 <a href="#get_key_characteristics">get_key_characteristics</a> 时必须要在 <code>client_id</code> 参数中提供相同的值,而调用 <a href="#begin">begin</a> 时则必须要提供此标记以及相同的相关数据(作为 <code>in_params</code> 集的一部分)。如果未收到正确的数据,函数必须返回 <code>KM_ERROR_INVALID_KEY_BLOB</code>。</p>
+
+<p><i></i>此标记的内容必须要以加密形式绑定到相应密钥,这意味着,如果有不轨人士有权访问安全域的所有机密内容,但无权访问此标记的内容,必须要确保他们无法解密相应密钥(在不对此标记的内容进行暴力破解攻击的情况下)。</p>
+
+<p>此标记的值是一个 Blob(任意长度的字节数数组)。</p>
+
+<p>此标记不可重复使用。</p>
+
+<h3 id="km_tag_creation_datetime">KM_TAG_CREATION_DATETIME</h3>
+
+<p>用于指定相应密钥的创建日期和时间(以距 1970 年 1 月 1 日的毫秒数计)。此标记为可选标记,仅供参考。</p>
+
+<p>此标记不可重复使用。</p>
+
+<h3 id="km_tag_origin">KM_TAG_ORIGIN</h3>
+
+<p>用于指定相应密钥是在哪里创建的(如果知道)。在生成或导入密钥期间可以不指定此标记,但此标记必须要由 Trustlet 添加到密钥特性中。</p>
+
+<p>可能的值是在 <code>keymaster_origin_t</code> 中定义的:</p>
+
+<pre>
+typedef enum {
+ KM_ORIGIN_GENERATED = 0,
+ KM_ORIGIN_IMPORTED = 2,
+ KM_ORIGIN_UNKNOWN = 3,
+} keymaster_key_origin_t
+</pre>
+
+<p>此标记的值的完整含义不仅取决于值本身,还取决于值是位于由硬件强制执行的特性列表中,还是位于由软件强制执行的特性列表中。</p>
+
+<p><code>KM_ORIGIN_GENERATED</code> 表示相应密钥是由 Keymaster 生成的。如果它位于由硬件强制执行的列表中,那么相应密钥是在安全硬件中生成的,并且已永久绑定到硬件。如果它位于由软件强制执行的列表中,那么相应密钥是在 SoftKeymaster 中生成的,并且没有绑定到硬件。</p>
+
+<p><code>KM_ORIGIN_IMPORTED</code> 表示相应密钥是在 Keymaster 之外生成的,并且导入到了 Keymaster 中。如果它位于由硬件强制执行的列表中,那么相应密钥已永久绑定到硬件,不过可能存在位于安全硬件之外的副本。如果它位于由软件强制执行的列表中,那么相应密钥已导入到 SoftKeymaster 中,并且没有绑定到硬件。</p>
+
+<p><code>KM_ORIGIN_UNKNOWN</code> 应当仅出现在由硬件强制执行的列表中。它表示相应密钥已绑定到硬件,但不知道相应密钥原本就是在安全硬件中生成的,还是导入的。只有在使用 keymaster0 硬件模拟 keymaster1 服务时,才会出现这种情况。</p>
+
+<p>此标记不可重复使用。</p>
+
+<h3 id="km_tag_rollback_resistant">KM_TAG_ROLLBACK_RESISTANT</h3>
+
+<p>用于表明相应密钥可抗回滚,也就是说,当通过 <a href="#delete_key">delete_key</a> 或 <a href="#delete_all_keys">delete_all_keys</a> 删除相应密钥后,可保证相应密钥已被永久删除且无法再使用。如果密钥不带此标记,那么在被删除后,可能能够从备份中恢复。</p>
+
+<p>此标记为布尔值,因此可能的值为 true(如果此标记存在)和 false(如果此标记不存在)。</p>
+
+<p>此标记不可重复使用。</p>
+
+<h3 id="km_tag_root_of_trust">KM_TAG_ROOT_OF_TRUST</h3>
+
+<p>用于指定“信任根”,即经过验证的启动程序在验证操作系统是否已启动时使用的键(如果有)。在任何情况下,都不可以通过密钥特性将此标记提供给 Keymaster,也不可以通过密钥特性从 Keymaster 返回此标记。</p>
+
+<h3 id="km_tag_associated_data">KM_TAG_ASSOCIATED_DATA</h3>
+
+<p>用于提供进行 AES-GCM 加密或解密时使用的“相关数据”。可以将此标记提供给 <a href="#update">update</a>,以便指定在计算 GCM 标记时使用的未加密/解密的数据。</p>
+
+<p>此标记的值是一个 Blob(任意长度的字节数数组)。</p>
+
+<p>此标记不可重复使用。</p>
+
+<h3 id="km_tag_nonce">KM_TAG_NONCE</h3>
+
+<p>用于提供或返回进行 AES GCM、CBC 或 CTR 加密/解密时使用的随机数或初始化矢量 (IV)。在加密和解密操作期间,可以将此标记提供给 <a href="#begin">begin</a>。仅当相应密钥带有 <a href="#km_tag_caller_nonce">KM_TAG_CALLER_NONCE</a> 时,才可以将此标记提供给 <a href="#begin">begin</a>。如果调用程序未提供此标记,Keymaster 将随机生成适当的随机数或 IV 并通过 begin 将其返回。</p>
+
+<p>此标记的值是一个 Blob(任意长度的字节数数组)。所允许的长度取决于模式:GCM 随机数的长度为 12 个字节;CBC IV 和 CTR IV 的长度为 16 个字节。</p>
+
+<p>此标记不可重复使用。</p>
+
+<h3 id="km_tag_auth_token">KM_TAG_AUTH_TOKEN</h3>
+
+<p>用于向 <a href="#begin">begin</a>、<a href="#update">update</a> 或 <a href="#finish">finish</a> 提供身份验证令牌(请参阅“身份验证”页面),以便向要求用户通过身份验证的密钥操作(密钥带有 <a href="#km_tag_user_secure_id">KM_TAG_USER_SECURE_ID</a>)证明相应用户已通过身份验证。</p>
+
+<p>此标记的值是一个包含 <code>hw_auth_token_t</code> 结构的 Blob。</p>
+
+<p>此标记不可重复使用。</p>
+
+<h3 id="km_tag_mac_length">KM_TAG_MAC_LENGTH</h3>
+
+<p>用于提供 MAC 或 GCM 身份验证标记的请求长度(以位数计)。</p>
+
+<p>此标记的值是 MAC 长度(以位数计)。这个值必须是 8 的倍数,并且不得小于与相应密钥关联的 <a href="#km_tag_min_mac_length">KM_TAG_MIN_MAC_LENGTH</a> 的值。</p>
+
+<h2 id="functions">函数</h2>
+
+<h3 id="deprecated_functions">已弃用的函数</h3>
+
+<p>虽然以下函数位于 <code>keymaster1_device_t</code> 定义中,但不应实现这些函数。这些函数的指针应设为 <code>NULL</code>:</p>
+
+<ul>
+ <li><code>generate_keypair</code>
+ </li><li><code>import_keypair</code>
+ </li><li><code>get_keypair_public</code>
+ </li><li><code>delete_keypair</code>
+ </li><li><code>delete_all</code>
+ </li><li><code>sign_data</code>
+ </li><li><code>verify_data</code>
+</li></ul>
+
+<h3 id="general_implementation_guidelines">常规实现准则</h3>
+
+<p>以下准则适用于 API 中的所有函数。</p>
+
+<h4 id="input_pointer_parameters">输入指针参数</h4>
+
+<p>进行指定调用时不使用的输入指针参数可以是 <code>NULL</code>。调用程序无需提供占位符。例如,某些密钥类型和模式可能不会使用 <a href="#begin">begin</a> 的 <code>in_params</code> 参数中的任何值,因此调用程序可以将 <code>in_params</code> 设为 <code>NULL</code> 或提供一个空的参数集。调用程序也可以提供不使用的参数,而 Keymaster 方法不得发出错误。</p>
+
+<p>如果所需的输入参数为 NULL,Keymaster 方法应返回 <code>KM_ERROR_UNEXPECTED_NULL_POINTER</code>。</p>
+
+<h4 id="output_pointer_parameters">输出指针参数</h4>
+
+<p>与输入指针参数类似,不使用的输出指针参数可以是 <code>NULL</code>。如果某个方法需要在某个输出参数中返回数据,但发现该参数为 <code>NULL</code>,则应返回 <code>KM_ERROR_OUTPUT_PARAMETER_NULL</code>。</p>
+
+<h4 id="api_misuse">API 滥用</h4>
+
+<p>调用程序可以通过多种方式提出虽然不合理或很荒谬但技术上并没有错误的请求。在这种情况下,keymaster1 实现无需失败或发出诊断。实现不应诊断以下情况:使用过小的密钥、指定不相关的输入参数、重复使用 IV 或随机数、生成密钥时未指定目的(因此生成的密钥没有用处),以及类似情况。但必须诊断以下情况:缺少必需的参数、指定无效的必需参数,以及类似错误。</p>
+
+<p>应用、框架和 Android Keystore 需负责确保对 Keymaster 模块的调用是合理的,而且是有用的。</p>
+
+<h3 id="get_supported_algorithms">get_supported_algorithms</h3>
+
+<p>用于返回一个列表,其中包含 Keymaster 硬件实现支持的算法。如果是软件实现,则必须返回一个空列表;如果是混合实现,则必须返回一个仅包含硬件支持的算法的列表。</p>
+
+<p>keymaster1 实现必须要支持 RSA、EC、AES 和 HMAC。</p>
+
+<h3 id="get_supported_block_modes">get_supported_block_modes</h3>
+
+<p>用于返回一个列表,其中包含对于指定的算法和目的,Keymaster 硬件实现支持的 AES 分块模式。</p>
+
+<p>对于不是分块加密算法的 RSA、EC 和 HMAC,无论是任何有效目的,此方法都必须返回一个空列表。如果目的无效,则应导致此方法返回 <code>KM_ERROR_INVALID_PURPOSE</code>。</p>
+
+<p>keymaster1 实现必须要支持使用 ECB、CBC、CTR 和 GCM 进行 AES 加密和解密。</p>
+
+<h3 id="get_supported_padding_modes">get_supported_padding_modes</h3>
+
+<p>用于返回一个列表,其中包含对于指定的算法和目的,Keymaster 硬件实现支持的填充模式。</p>
+
+<p>HMAC 和 EC 并没有填充这一概念,因此针对所有有效目的,此方法都必须返回一个空列表。如果目的无效,则应导致此方法返回 <code>KM_ERROR_INVALID_PURPOSE</code>。</p>
+
+<p>对于 RSA,keymaster1 实现必须要支持:</p>
+
+<ul>
+ <li>非填充式加密、解密、签名和验证。对于非填充式加密和签名,如果消息比公开模数短,实现必须要在消息左侧填充零来补齐。对于非填充式解密和验证,输入长度必须与公开模数的大小一致。
+ </li><li>PKCS#1 v1.5 加密和签名填充模式</li><li>盐最小长度为 20 的 PSS</li><li>OAEP</li></ul>
+
+<p>对于采用 ECB 和 CBC 模式的 AES 算法,keymaster1 实现必须要支持无填充和 PKCS#7 填充。CTR 和 GCM 模式必须仅支持无填充。</p>
+
+<h3 id="get_supported_digests">get_supported_digests</h3>
+
+<p>用于返回一个列表,其中包含对于指定的算法和目的,Keymaster 硬件实现支持的摘要模式。</p>
+
+<p>任何 AES 模式都不支持摘要,也不需要摘要,因此无论是任何有效目的,此方法都必须返回一个空列表。</p>
+
+<p>keymaster1 实现可以只实现一部分已定义的摘要,但必须要提供 SHA-256。强烈建议 keymaster1 实现提供 MD5、SHA1、SHA-224、SHA-256、SHA384 和 SHA512(完整的已定义摘要集)。</p>
+
+<h3 id="get_supported_import_formats">get_supported_import_formats</h3>
+
+<p>用于返回一个列表,其中包含指定算法的 Keymaster 硬件实现支持的导入格式。</p>
+
+<p>keymaster1 实现必须要支持 PKCS#8 格式(无密码保护),以便导入 RSA 密钥对和 EC 密钥对,并且必须要支持以原始格式导入 AES 密钥材料和 HMAC 密钥材料。</p>
+
+<h3 id="get_supported_export_formats">get_supported_export_formats</h3>
+
+<p>用于返回一个列表,其中包含指定算法的 Keymaster 硬件实现支持的导出格式。</p>
+
+<p>keymaster1 实现必须要支持 X.509 格式,以便导出 RSA 公钥和 EC 公钥。不得支持导出私钥或非对称密钥。</p>
+
+<h3 id="add_rng_entropy">add_rng_entropy</h3>
+
+<p>用于将调用程序提供的熵添加到 keymaster1 实现生成随机数(在密钥中使用)、IV 以及其他内容时使用的池中。</p>
+
+<p>Keymaster1 实现必须将收到的熵<strong>安全地</strong>混合到所使用的池中,该池中必须还要包含由硬件随机数生成器在内部生成的熵。混合操作必须具有以下特性:即使攻击者能够完全控制通过 <code>add_rng_entropy</code> 提供的位数或硬件生成的位数(但不能同时控制这两者),他们能够预测出通过熵池生成的位数的概率也不得超过 ½。</p>
+
+<p>尝试估算内部池中的熵的 keymaster1 实现必须假定通过 <code>add_rng_entropy</code> 提供的数据不包含熵。</p>
+
+<h3 id="generate_key">generate_key</h3>
+
+<p>用于生成一个新的加密密钥,同时指定将永久绑定到该密钥的关联授权。keymaster1 实现必须能够确保无法通过任何与生成密钥时指定的授权不一致的方式使用相应密钥。对于安全硬件无法强制执行的授权,安全硬件的义务仅限于确保与相应密钥关联的无法强制执行的授权不能被修改,以便每次调用 <a href="#get_key_characteristics">get_key_characteristics</a> 时都会返回原始值。此外,通过 <code>generate_key</code> 返回的特性必须将授权正确地分配到由硬件强制执行的列表和由软件强制执行的列表中。如需更多详细信息,请参阅 <a href="#get_key_characteristics">get_key_characteristics</a>。</p>
+
+<p>必须要向 <code>generate_key</code> 提供的参数取决于要生成的密钥的类型。这一部分将概括介绍每种类型的密钥必需的标记以及允许使用的标记。<a href="#km_tag_algorithm">KM_TAG_ALGORITHM</a> 始终为必需的标记,用于指定类型。</p>
+
+<h4 id="rsa_keys">RSA 密钥</h4>
+
+<p>以下参数是生成 RSA 密钥时必需的参数。</p>
+
+<ul>
+ <li><a href="#km_tag_key_size">KM_TAG_KEY_SIZE</a> 用于指定公开模数的大小(以位数计)。如果缺少此参数,方法必须返回 <code>KM_ERROR_UNSUPPORTED_KEY_SIZE</code>。必须要支持 1024、2048、3072 和 4096,最好还支持为 8 的倍数的所有密钥大小。
+ </li><li><a href="#km_tag_rsa_public_exponent">KM_TAG_RSA_PUBLIC_EXPONENT</a> 用于指定 RSA 公开指数的值。如果缺少此参数,方法必须返回 <code>KM_ERROR_INVALID_ARGUMENT</code>。实现必须要支持 3 和 65537,最好还支持不超过 2^64 的所有质数值。
+</li></ul>
+
+<p>以下参数不是生成 RSA 密钥时必需的参数,但如果在缺少这些参数的情况下生成 RSA 密钥,生成的密钥将无法使用。如果缺少这些参数,<code>generate_key</code> 函数不应返回错误。</p>
+
+<ul>
+ <li><a href="#km_tag_purpose">KM_TAG_PURPOSE</a> 用于指定允许的目的。对于 RSA 密钥,必须要支持采用任意组合的所有目的。
+ </li><li><a href="#km_tag_digest">KM_TAG_DIGEST</a> 用于指定可与新密钥配合使用的摘要算法。不支持任何摘要算法的实现必须要接受包含不受支持的摘要的密钥生成请求。不受支持的摘要应被放入“由软件强制执行”的列表内返回的密钥特性中。这是因为相应密钥能够与其他摘要配合使用,但添加摘要将在软件中进行。然后,将调用硬件按 <code>KM_DIGEST_NONE</code> 摘要算法执行相应操作。</li><li><a href="#km_tag_padding">KM_TAG_PADDING</a> 用于指定可与新密钥配合使用的填充模式。如果未指定任何不受支持的摘要算法,不支持任何摘要算法的实现必须将 <code>KM_PAD_RSA_PSS</code> 和 <code>KM_PAD_RSA_OAEP</code> 放入由软件强制执行的密钥特性列表中。
+</li></ul>
+
+<h4 id="ecdsa_keys">ECDSA 密钥</h4>
+
+<p>只有 <a href="#km_tag_key_size">KM_TAG_KEY_SIZE</a> 是生成 ECDSA 密钥时必需的参数。此参数用于选择 EC 组。实现必须要支持 224、256、384 和 521,这些值分别表示 NIST p-224、p-256、p-384 和 p521 曲线。</p>
+
+<p>为了使生成的 ECDSA 密钥可以使用,还需要 <a href="#km_tag_digest">KM_TAG_DIGEST</a>,但此参数不是生成 ECDSA 密钥时必需的参数。</p>
+
+<h4 id="aes_keys">AES 密钥</h4>
+
+<p>只有 <a href="#km_tag_key_size">KM_TAG_KEY_SIZE</a> 是生成 AES 密钥时必需的参数。如果缺少此参数,方法必须返回 <code>KM_ERROR_UNSUPPORTED_KEY_SIZE</code>。必须要支持 128 和 256。建议支持 192 位 AES 密钥。</p>
+
+<p>以下参数仅与 AES 密钥有关,但它们并不是生成 AES 密钥时必需的参数:</p>
+
+<ul>
+ <li><code>KM_TAG_BLOCK_MODE</code> 用于指定可与新密钥配合使用的分块模式。
+ </li><li><code>KM_TAG_PADDING</code> 用于指定可以使用的填充模式。此参数仅与 ECB 和 CBC 模式有关。
+</li></ul>
+
+<p>如果指定的是 GCM 分块模式,则必须要提供 <a href="#km_tag_min_mac_length">KM_TAG_MIN_MAC_LENGTH</a>。如果缺少此参数,方法必须返回 <code>KM_ERROR_MISSING_MIN_MAC_LENGTH</code>。此标记的值必须是 8 的倍数,并且必须介于 96 到 128 之间。</p>
+
+<h4 id="hmac_keys">HMAC 密钥</h4>
+
+<p>以下参数是生成 HMAC 密钥时必需的参数:</p>
+
+<ul>
+ <li><a href="#km_tag_key_size">KM_TAG_KEY_SIZE</a> 用于指定密钥大小(以位数计)。不得支持小于 64 以及不是 8 的倍数的值。必须要支持介于 64 到 512 之间并且是 8 的倍数的值。可以支持更大的值。
+ </li><li><a href="#km_tag_min_mac_length">KM_TAG_MIN_MAC_LENGTH</a> 用于指定可通过相应密钥生成或验证的 MAC 的最小长度。此参数的值必须是 8 的倍数,并且不得小于 64。
+ </li><li><a href="#km_tag_digest">KM_TAG_DIGEST</a> 用于指定相应密钥的摘要算法。必须且只能指定一种摘要,否则返回 <code>KM_ERROR_UNSUPPORTED_DIGEST</code>。如果 Trustlet 不支持指定的摘要,则返回 <code>KM_ERROR_UNSUPPORTED_DIGEST</code>。</li></ul>
+
+<h4 id="key_characteristics">密钥特性</h4>
+
+<p>如果特性参数为非 NULL 值,<code>generate_key</code> 必须返回新生成密钥的特性(适当地划分到由硬件强制执行的列表和由软件强制执行的列表中)。要了解哪些特性会划分到哪个列表中,请参阅 <a href="#get_key_characteristics">get_key_characteristics</a>。返回的特性必须要包含为生成密钥而指定的所有参数,<a href="#km_tag_application_id">KM_TAG_APPLICATION_ID</a> 和 <a href="#km_tag_application_data">KM_TAG_APPLICATION_DATA</a> 除外。如果这两个标记包含在密钥参数中,则必须要将其从返回的特性中移除;必须要确保无法通过查看返回的密钥 Blob 找出这两个标记的值。不过,这两个标记必须要以加密形式绑定到密钥 Blob,以便在使用相应密钥时,如果未提供正确的值,使用将会失败。同样,<a href="#km_tag_root_of_trust">KM_TAG_ROOT_OF_TRUST</a> 也必须要以加密形式绑定到相应密钥,但在生成或导入密钥期间可以不指定此标记,并且在任何情况下都不得返回此标记。</p>
+
+<p>除了收到的标记外,Trustlet 还必须要添加 <a href="#km_tag_origin">KM_TAG_ORIGIN</a>(值为 <code>KM_ORIGIN_GENERATED</code>);如果相应密钥可抗回滚,还要添加 <a href="#km_tag_rollback_resistant">KM_TAG_ROLLBACK_RESISTANT</a>。</p>
+
+<h4 id="rollback_resistance">抗回滚</h4>
+
+<p>抗回滚意味着,相应密钥通过 <a href="#delete_key">delete_key</a> 或 <a href="#delete_all_keys">delete_all_keys</a> 被删除后,安全硬件将保证它绝对无法再使用。不采用抗回滚的实现通常会将生成或导入的密钥材料作为密钥 Blob(一种经过加密和身份验证的形式)返回给调用程序。当 Keystore 删除密钥 Blob 后,相应密钥将会消失,但之前已设法获取密钥材料的攻击者可能能够将相应密钥材料恢复到设备上。</p>
+
+<p>如果安全硬件保证被删除的密钥以后无法被恢复,那么相应密钥便可抗回滚。安全硬件通常是通过将额外的密钥元数据存储在攻击者无法操控的可信位置来做到这一点。在移动设备上,用于实现这一点的机制通常为 Replay Protected Memory Block (RPMB)。由于可创建的密钥数量基本上没有限制,而用于抗回滚的可信存储空间的大小可能有限制,因此即使无法为新密钥提供抗回滚功能,此方法也必须可以成功。在这种情况下,不得将 <a href="#km_tag_rollback_resistant">KM_TAG_ROLLBACK_RESISTANT</a> 添加到密钥特性中。</p>
+
+<h3 id="get_key_characteristics">get_key_characteristics</h3>
+
+<p>用于返回与收到的密钥关联的参数和授权,并且返回的参数和授权会划分为两组:一组由硬件强制执行,一组由软件强制执行。此处的说明同样适用于通过 <a href="#generate_key">generate_key</a> 和 <a href="#import_key">import_key</a> 返回的密钥特性列表。</p>
+
+<p>如果在密钥生成或导入期间提供了 <code>KM_TAG_APPLICATION_ID</code>,则必须要在 <code>client_id</code> 参数中为此方法提供相同的值。否则,此方法必须返回 <code>KM_ERROR_INVALID_KEY_BLOB</code>。同样,如果在生成或导入密钥期间提供了 <code>KM_TAG_APPLICATION_DATA </code>,则必须要在 <code>app_data</code> 参数中为此方法提供相同的值。</p>
+
+<p>此方法返回的特性完整地说明了指定密钥的类型和用法。</p>
+
+<p>要确定某个指定标记是属于由硬件强制执行的列表,还是属于由软件强制执行的列表,一般规则是:如果该标记的含义完全由安全硬件来保证,则属于由硬件强制执行的列表,否则属于由软件强制执行的列表。下面列出了可能无法明确确定到底属于哪个列表的具体标记:</p>
+
+<ul>
+ <li><a href="#km_tag_algorithm">KM_TAG_ALGORITHM</a>、<a href="#km_tag_key_size">KM_TAG_KEY_SIZE</a> 和 <a href="#km_tag_rsa_public_exponent">KM_TAG_RSA_PUBLIC_EXPONENT</a> 是密钥的固有属性。任何由硬件来保障安全的密钥都将位于由硬件强制执行的列表中,这是因为诸如“此 RSA 密钥材料仅用作 RSA 密钥”之类的声明由硬件强制执行,原因是硬件将不会以任何其他方式使用相应密钥,而软件无权访问密钥材料并且根本无法使用相应密钥。
+ </li><li>由安全硬件支持的 <a href="#km_tag_digest">KM_TAG_DIGEST</a> 值将位于由硬件支持的列表中。不受支持的摘要则位于由软件支持的列表中。
+ </li><li><a href="#km_tag_padding">KM_TAG_PADDING</a> 的值通常位于由硬件支持的列表中,但如果存在某种特定的填充模式必须要由软件来强制执行的可能性,那么这些值将位于由软件强制执行的列表中。对于允许使用不是由安全硬件支持的摘要算法进行 PSS 或 OAEP 填充的 RSA 密钥,则存在这种可能性。
+ </li><li>仅当用户身份验证由硬件强制执行时,<a href="#km_tag_user_secure_id">KM_TAG_USER_SECURE_ID</a> 和 <a href="#km_tag_mac_length">KM_TAG_USER_AUTH_TYPE</a> 才由硬件强制执行。要使用户身份验证由硬件强制执行,Keymaster Trustlet 和相关身份验证 Trustlet 都必须是安全的,并且必须共用一个用于签署和验证身份验证令牌的 HMAC 密钥。有关详情,请参阅“身份验证”页面。
+ </li><li><a href="#km_tag_active_datetime">KM_TAG_ACTIVE_DATETIME</a>、<a href="#km_tag_origination_expire_datetime">KM_TAG_ORIGINATION_EXPIRE_DATETIME</a> 和 <a href="#km_tag_usage_expire_datetime">KM_TAG_USAGE_EXPIRE_DATETIME</a> 标记要求能够访问可验证的正确挂钟。大多数安全硬件将只能访问由非安全操作系统提供的时间信息,这意味着这些标记由软件强制执行。
+ </li><li>对于绑定到硬件的密钥,<a href="#km_tag_origin">KM_TAG_ORIGIN</a> 始终位于硬件列表中。如果此标记出现在硬件列表中,更高的层级便可据此确定相应密钥是由硬件支持的密钥。
+</li></ul>
+
+<h3 id="import_key">import_key</h3>
+
+<p>用于将密钥材料导入到 Keymaster 硬件中。密钥定义参数和输出特性的处理方式与 <code>generate_key</code> 相同,但存在以下例外情况:</p>
+
+<ul>
+ <li><a href="#km_tag_key_size">KM_TAG_KEY_SIZE</a> 和 <a href="#km_tag_rsa_public_exponent">KM_TAG_RSA_PUBLIC_EXPONENT</a>(仅适用于 RSA 密钥)不是输入参数中必需的标记。如果未收到这两个标记,Trustlet 必须根据收到的密钥材料推导出这两个标记的值,并将适当的标记和值添加到密钥特性中。如果收到了这两个参数,Trustlet 必须根据密钥材料对其进行验证。如果收到的值与密钥材料中的值不一致,此方法必须返回 <code>KM_ERROR_IMPORT_PARAMETER_MISMATCH</code>。</li><li>返回的 <a href="#km_tag_origin">KM_TAG_ORIGIN</a> 必须要具有 <code>KM_ORIGIN_IMPORTED</code> 这个值。</li></ul>
+
+<h3 id="export_key">export_key</h3>
+
+<p>用于从 Keymaster RSA 密钥对或 EC 密钥对中导出公钥。</p>
+
+<p>如果在密钥生成或导入期间提供了 <code>KM_TAG_APPLICATION_ID</code>,则必须要在 <code>client_id</code> 参数中为此方法提供相同的值。否则,此方法必须返回 <code>KM_ERROR_INVALID_KEY_BLOB</code>。同样,如果在生成或导入密钥期间提供了 <code>KM_TAG_APPLICATION_DATA</code>,则必须要在 <code>app_data</code> 参数中为此方法提供相同的值。</p>
+
+<h3 id="delete_key">delete_key</h3>
+
+<p>用于删除收到的密钥。此方法为可选方法,可能只能由提供抗回滚功能的 Keymaster 模块来实现。</p>
+
+<h3 id="delete_all_keys">delete_all_keys</h3>
+
+<p>用于删除所有密钥。此方法为可选方法,可能只能由提供抗回滚功能的 Keymaster 模块来实现。</p>
+
+<h3 id="begin">begin</h3>
+
+<p>用于开始使用指定的密钥和参数(视情况而定)针对指定的目的进行加密操作,并返回与 <a href="#update">update</a> 和 <a href="#finish">finish</a> 配合使用以完成操作的操作句柄。该操作句柄还会在经过身份验证的操作中用作“质询”令牌,并且对于此类操作,该操作句柄必须包含在身份验证令牌的 <code>challenge</code> 字段中。</p>
+
+<p>Keymaster 实现必须要支持至少 16 个并行操作。Keystore 最多使用 15 个,留一个给 vold 用于对密码进行加密。当 Keystore 有 15 个操作正在进行(已调用 <code>begin</code>,但尚未调用 <code>finish</code> 或 <code>abort</code>)时,如果收到开始第 16 个操作的请求,它将对最近使用最少的操作调用 <code>abort</code>,以便将进行中的操作减少到 14 个,然后再调用 <code>begin</code> 来开始执行新收到的操作请求。
+
+</p><p>如果在密钥生成或导入期间指定了 <a href="#km_tag_application_id">KM_TAG_APPLICATION_ID</a> 或 <a href="#km_tag_application_data">KM_TAG_APPLICATION_DATA</a>,那么调用 <code>begin</code> 时必须要包含这两个标记以及最初在此方法的 <code>in_params</code> 参数中指定的值。</p>
+
+<h4 id="authorization_enforcement">密钥授权强制执行</h4>
+
+<p>在执行此方法期间,如果实现将以下密钥授权放入到了“由硬件强制执行的”特性中,并且相应操作不是公钥操作,那么这些授权必须要由 Trustlet 来强制执行。即使不符合授权要求,也必须要允许公钥操作(即使用 RSA 或 EC 密钥进行的 <code>KM_PURPOSE_ENCRYPT</code> 和 <code>KM_PURPOSE_VERIFY</code>)成功完成。</p>
+
+<ul>
+ <li><a href="#km_tag_purpose">KM_TAG_PURPOSE</a> 要求为此方法指定的目的必须要与密钥授权中的某个目的一致,除非请求的操作是公钥操作,即密钥是 RSA 密钥或 EC 密钥,目的是 <code>KM_PURPOSE_ENCRYPT</code> 或 <code>KM_PURPOSE_VERIFY</code>。请注意,<code>KM_PURPOSE_ENCRYPT</code> 对 EC 密钥无效。在这种情况下,begin 应该返回 <code>KM_ERROR_UNSUPPORTED_PURPOSE</code>。
+ </li><li><a href="#km_tag_active_datetime">KM_TAG_ACTIVE_DATETIME</a> 要求与可信 UTC 时间源进行比较。如果当前日期和时间早于此标记的值,方法必须返回 <code>KM_ERROR_KEY_NOT_YET_VALID</code>。</li><li><a href="#km_tag_origination_expire_datetime">KM_TAG_ORIGINATION_EXPIRE_DATETIME</a> 要求与可信 UTC 时间源进行比较。如果当前日期和时间晚于此标记的值,并且目的是 <code>KM_PURPOSE_ENCRYPT</code> 或 <code>KM_PURPOSE_SIGN</code>,方法必须返回 <code>KM_ERROR_KEY_EXPIRED</code>。</li><li><a href="#km_tag_usage_expire_datetime">KM_TAG_USAGE_EXPIRE_DATETIME</a> 要求与可信 UTC 时间源进行比较。如果当前日期和时间晚于此标记的值,并且目的是 <code>KM_PURPOSE_DECRYPT</code> 或 <code>KM_PURPOSE_VERIFY</code>,方法必须返回 <code>KM_ERROR_KEY_EXPIRED</code>。</li><li><a href="#km_tag_min_seconds_between_ops">KM_TAG_MIN_SECONDS_BETWEEN_OPS</a> 要求与指明相应密钥上次使用时间的可信相对计时器进行比较。如果上次使用时间加上此标记的值后小于当前时间,方法必须返回 <code>KM_ERROR_KEY_RATE_LIMIT_EXCEEDED</code>。要查看重要的实现要求,请参阅标记说明。
+ </li><li><a href="#km_tag_max_uses_per_boot">KM_TAG_MAX_USES_PER_BOOT</a> 要求与用于跟踪自系统启动以来相应密钥使用次数的安全计数器进行比较。如果已使用次数超出此标记的值,方法必须返回 <code>KM_ERROR_KEY_MAX_OPS_EXCEEDED</code>。</li><li>仅当相应密钥还有 <a href="#km_tag_auth_timeout">KM_TAG_AUTH_TIMEOUT</a> 时,<a href="#km_tag_user_secure_id">KM_TAG_USER_SECURE_ID</a> 才会由此方法强制执行。如果相应密钥同时具有这两个标记,此方法必须要已在 <code>in_params</code> 中收到 <a href="#km_tag_auth_token">KM_TAG_AUTH_TOKEN</a>,并且该令牌必须有效,也就是说,HMAC 字段可正确验证。此外,相应密钥必须要有至少一个 <a href="#km_tag_user_secure_id">KM_TAG_USER_SECURE_ID</a> 值与令牌中至少一个安全 ID 值一致。最后,相应密钥还必须要有 <a href="#km_tag_mac_length">KM_TAG_USER_AUTH_TYPE</a>,而且此标记必须要与令牌中的身份验证类型一致。如果这些要求中有任何一个不符合,方法必须返回 <code>KM_ERROR_KEY_USER_NOT_AUTHENTICATED</code>。</li><li><a href="#km_tag_caller_nonce">KM_TAG_CALLER_NONCE</a> 允许调用程序指定随机数或初始化矢量 (IV)。如果相应密钥没有此标记,但调用程序为此方法提供了 <a href="#km_tag_nonce">KM_TAG_NONCE</a>,则必须返回 <code>KM_ERROR_CALLER_NONCE_PROHIBITED</code>。
+ </li><li><a href="#km_tag_bootloader_only">KM_TAG_BOOTLOADER_ONLY</a> 用于指定相应密钥只能由引导加载程序使用。如果在引导加载程序执行完毕后调用此方法,并且提供的是仅限引导加载程序使用的密钥,则必须返回 <code>KM_ERROR_INVALID_KEY_BLOB</code>。</li></ul>
+
+<h4 id="rsa_keys">RSA 密钥</h4>
+
+<p>执行任何 RSA 密钥操作时,都必须要在 <code>in_params</code> 中指定一种且只能指定一种填充模式。如果未指定或指定了多次,方法必须返回 <code>KM_ERROR_UNSUPPORTED_PADDING_MODE</code>。</p>
+
+<p>RSA 签名和验证操作需要摘要,正如使用 OAEP 填充模式进行 RSA 加密和解密操作时一样。对于这些情况,调用程序必须要在 <code>in_params</code> 中指定一种且只能指定一种摘要。如果未指定或指定了多次,方法必须返回 <code>KM_ERROR_UNSUPPORTED_DIGEST</code>。</p>
+
+<p>私钥操作(<code>KM_PURPOSE_DECYPT</code> 和 <code>KM_PURPOSE_SIGN</code>)要求摘要和填充获得授权,也就是说,指定的值必须要在密钥授权中。否则,方法必须视情况返回 <code>KM_ERROR_INCOMPATIBLE_DIGEST</code> 或 <code>KM_ERROR_INCOMPATIBLE_PADDING</code>。公钥操作(<code>KM_PURPOSE_ENCRYPT</code> 和 <code>KM_PURPOSE_VERIFY</code>)可以使用未经授权的摘要或填充。</p>
+
+<p>除了 <code>KM_PAD_NONE</code> 之外,所有 RSA 填充模式都仅适用于特定目的。具体来说就是,<code>KM_PAD_RSA_PKCS1_1_5_SIGN</code> 和 <code>KM_PAD_RSA_PSS</code> 仅支持签名和验证,而 <code>KM_PAD_RSA_PKCS1_1_1_5_ENCRYPT</code> 和 <code>KM_PAD_RSA_OAEP</code> 仅支持加密和解密。如果指定的模式不支持指定的目的,方法必须返回 <code>KM_ERROR_UNSUPPORTED_PADDING_MODE</code>。</p>
+
+<p>填充模式与摘要之间存在以下非常重要的相互关系:</p>
+
+<ul>
+
+ <li><code>KM_PAD_NONE</code> 表示将执行“原始”RSA 操作。如果是进行签名或验证,必须要指定 <code>KM_DIGEST_NONE</code> 这种摘要。如果是进行非填充式加密或解密,则不需要摘要。
+
+ </li><li><code>KM_PAD_RSA_PKCS1_1_5_SIGN</code> 填充需要摘要。摘要可以是 <code>KM_DIGEST_NONE</code>,在这种情况下,Keymaster 实现将无法构建适当的 PKCS#1 v1.5 签名结构,因为它无法添加 DigestInfo 结构。不过,实现必须要构建 <code>0x00 || 0x01 || PS || 0x00 || M</code>,其中 M 是收到的消息,PS 是填充字符串。RSA 密钥的大小必须要比消息至少多 11 个字节,否则方法必须返回 <code>KM_ERROR_INVALID_INPUT_LENGTH</code>。</li><li><code>KM_PAD_RSA_PKCS1_1_1_5_ENCRYPT</code> 填充不需要摘要。</li><li><code>KM_PAD_RSA_PSS</code> 填充需要摘要,并且摘要不能是 <code>KM_DIGEST_NONE</code>。如果指定的是 <code>KM_DIGEST_NONE</code>,方法必须返回 <code>KM_ERROR_INCOMPATIBLE_DIGEST</code>。此外,RSA 密钥的大小必须要比摘要的输出大小至少多 22 个字节。否则,方法必须返回 <code>KM_ERROR_INCOMPATIBLE_DIGEST</code>。</li><li><code>KM_PAD_RSA_OAEP</code> 填充需要摘要,并且摘要不能是 <code>KM_DIGEST_NONE</code>。如果指定的是 <code>KM_DIGEST_NONE</code>,方法必须返回 <code>KM_ERROR_INCOMPATIBLE_DIGEST</code>。</li></ul>
+
+<h4 id="ec_keys">EC 密钥</h4>
+
+<p>执行任何 EC 密钥操作时,都必须要在 <code>in_params</code> 中指定一种且只能指定一种填充模式。如果未指定或指定了多次,则返回 <code>KM_ERROR_UNSUPPORTED_PADDING_MODE</code>。</p>
+
+<p>私钥操作 (<code>KM_PURPOSE_SIGN</code>) 要求摘要获得授权,也就是说,指定的值必须要在密钥授权中。否则返回 <code>KM_ERROR_INCOMPATIBLE_DIGEST</code>。公钥操作 (<code>KM_PURPOSE_VERIFY</code>) 可以使用未经授权的摘要或填充。</p>
+
+<h4 id="aes_keys">AES 密钥</h4>
+
+<p>执行 AES 密钥操作时,必须要在 <code>in_params</code> 中指定一种且只能指定一种分块模式和填充模式。如果有任何一项未指定或指定了多次,则返回 <code>KM_ERROR_UNSUPPORTED_BLOCK_MODE</code> 或 <code>KM_ERROR_UNSUPPORTED_PADDING_MODE</code>。指定的模式必须要已通过相应密钥授权。否则,方法必须返回 <code>KM_ERROR_INCOMPATIBLE_BLOCK_MODE</code> 或 <code>KM_ERROR_INCOMPATIBLE_PADDING_MODE</code>。</p>
+
+<p>如果分块模式是 <code>KM_MODE_GCM</code>,则必须要在 <code>in_params</code> 中指定 <code>KM_TAG_MAC_LENGTH</code>。指定的值必须是 8 的倍数,并且不得大于 128,也不得小于密钥授权中 <code>KM_TAG_MIN_MAC_LENGTH</code> 的值。如果 MAC 长度大于 128 或不是 8 的倍数,则返回 <code>KM_ERROR_UNSUPPORTED_MAC_LENGTH</code>。如果 MAC 长度小于密钥最小长度,则返回 <code>KM_ERROR_INVALID_MAC_LENGTH</code>。</p>
+
+<p>如果分块模式是 <code>KM_MODE_GCM</code> 或 <code>KM_MODE_CTR</code>,那么指定的填充模式必须是 <code>KM_PAD_NONE</code>。如果分块模式是 <code>KM_MODE_ECB</code> 或 <code>KM_MODE_CBC</code>,那么指定的填充模式可以是 <code>KM_PAD_NONE</code> 或 <code>KM_PAD_PKCS7</code>。如果填充模式不符合这些要求,则返回 <code>KM_ERROR_INCOMPATIBLE_PADDING_MODE</code>。</p>
+
+<p>如果分块模式是 <code>KM_MODE_CBC</code>、<code>KM_MODE_CTR</code> 或 <code>KM_MODE_GCM</code>,则需要初始化矢量或随机数。在大多数情况下,调用程序都不应提供 IV 或随机数,而 Keymaster 实现必须要生成一个随机 IV 或随机数,并通过 <code>out_params</code> 中的 <a href="#km_tag_nonce">KM_TAG_NONCE</a> 将其返回。CBC IV 和 CTR IV 均为 16 个字节。GCM 随机数为 12 个字节。如果密钥授权包含 <a href="#km_tag_caller_nonce">KM_TAG_CALLER_NONCE</a>,那么调用程序可以通过 <code>in_params</code> 中的 <a href="#km_tag_nonce">KM_TAG_NONCE</a> 提供 IV/随机数。如果在 <a href="#km_tag_caller_nonce">KM_TAG_CALLER_NONCE</a> 未获得授权时提供了随机数,则返回 <code>KM_ERROR_CALLER_NONCE_PROHIBITED</code>。如果在 <a href="#km_tag_caller_nonce">KM_TAG_CALLER_NONCE</a> 获得了授权的情况下未提供随机数,则生成一个随机 IV/随机数。</p>
+
+<h4 id="hmac_keys">HMAC 密钥</h4>
+
+<p>执行 HMAC 密钥操作时,必须要在 <code>in_params</code> 中指定 <code>KM_TAG_MAC_LENGTH</code>。指定的值必须是 8 的倍数,并且不得大于摘要长度,也不得小于密钥授权中 <code>KM_TAG_MIN_MAC_LENGTH</code> 的值。如果 MAC 长度大于摘要长度或不是 8 的倍数,则返回 <code>KM_ERROR_UNSUPPORTED_MAC_LENGTH</code>。如果 MAC 长度小于密钥最小长度,则返回 <code>KM_ERROR_INVALID_MAC_LENGTH</code>。</p>
+
+<h3 id="update">update</h3>
+
+<p>用于提供要在通过 <a href="#begin">begin</a> 开始且正在进行的操作中处理的数据。操作是通过 <code>operation_handle</code> 参数指定的。</p>
+
+<p>为了更灵活地处理缓冲区,此方法的实现可以选择不消耗完收到的数据。调用程序负责执行循环操作,以便在后续调用中馈送其余数据。必须要在 <code>input_consumed</code> 参数中返回所消耗的输入数据量。实现必须始终消耗至少一个字节,除非相应操作无法再接受更多字节;如果收到了零个以上的字节,但消耗了零字节,调用程序会将此视为错误并中止相应操作。</p>
+
+<p>实现还可以选择返回多少数据(作为 update 的结果)。这仅与加密和解密操作有关,因为在调用 <a href="#finish">finish</a> 之前,签名和验证操作不会返回任何数据。建议尽早返回数据,而不是缓冲数据。</p>
+
+<h4 id="error_handling">错误处理</h4>
+
+<p>如果此方法返回除 <code>KM_ERROR_OK</code> 之外的错误代码,那么相应操作将被中止,操作句柄也必须变为无效。如果以后再将该句柄与此方法、<a href="#finish">finish</a> 或 <a href="#abort">abort</a> 配合使用,都必须返回 <code>KM_ERROR_INVALID_OPERATION_HANDLE</code>。</p>
+
+<h4 id="authorization_enforcement">密钥授权强制执行</h4>
+
+<p>密钥授权强制执行主要在 <a href="#begin">begin</a> 中进行。不过,密钥存在以下情况时例外:</p>
+
+<ul>
+ <li>有一个或多个 <a href="#km_tag_user_secure_id">KM_TAG_USER_SECURE_ID</a>,并且</li><li>没有 <a href="#km_tag_auth_timeout">KM_TAG_AUTH_TIMEOUT</a>
+</li></ul>
+
+<p>在这种情况下,密钥需要针对各项操作的授权,并且 update 方法必须要在 <code>in_params</code> 参数中收到 <a href="#km_tag_auth_token">KM_TAG_AUTH_TOKEN</a>。该令牌必须有效(HMAC 必须验证),必须包含匹配的安全用户 ID,必须与密钥的 <a href="#km_tag_mac_length">KM_TAG_USER_AUTH_TYPE</a> 匹配,并且必须包含质询字段中当前操作的操作句柄。如果不符合这些要求,则返回 <code>KM_ERROR_KEY_USER_NOT_AUTHENTICATED</code>。</p>
+
+<p>调用程序必须要在每次调用 <a href="#update">update</a> 和 <a href="#finish">finish</a> 时提供身份验证令牌。实现只需对该令牌验证一次(如果它倾向于这么做)。</p>
+
+<h4 id="rsa_keys">RSA 密钥</h4>
+
+<p>对于使用 <code>KM_DIGEST_NONE</code> 的签名和验证操作,此方法必须要在单次 update 中接受要签署或验证的整个分块。此方法不能只消耗分块的一部分。不过,如果调用程序选择在多次 update 中提供数据,此方法仍必须要在多次 update 中接受相应数据。如果调用程序提供的要签署的数据多于可以消耗的数据(数据长度超出 RSA 密钥大小),则返回 <code>KM_ERROR_INVALID_INPUT_LENGTH</code>。</p>
+
+<h4 id="ecdsa_keys">ECDSA 密钥</h4>
+
+<p>对于使用 <code>KM_DIGEST_NONE</code> 的签名和验证操作,此方法必须要在单次 update 中接受要签署或验证的整个分块。此方法不能只消耗分块的一部分。</p>
+
+<p>不过,如果调用程序选择在多次 update 中提供数据,此方法仍必须要在多次 update 中接受相应数据。如果调用程序提供的要签署的数据多于可以消耗的数据,则应以静默方式截断这些数据。(这与处理在类似 RSA 操作中提供的超量数据不同,因为此方法与旧版客户端兼容。)</p>
+
+<h4 id="aes_keys">AES 密钥</h4>
+
+<p>AES GCM 模式支持通过 <code>in_params</code> 参数中的 <a href="#km_tag_associated_data">KM_TAG_ASSOCIATED_DATA</a> 标记提供的“相关身份验证数据”。可以在重复调用(如果数据太大而无法在单个分块中发送,那么重复调用非常重要)中提供相关数据,但必须始终先于要加密或解密的数据提供。update 调用可以同时接收相关数据以及要加密/解密的数据,但后续 update 中不得包含相关数据。如果调用程序已在某次调用 update 时提供了要加密/解密的数据,若再次向 update 调用提供相关数据,则返回 <code>KM_ERROR_INVALID_TAG</code>。</p>
+
+<p>对于 GCM 加密,此标记会通过 <a href="#finish">finish</a> 附加到密文中。在解密期间,向上一次 update 调用提供的数据的最后 <code>KM_TAG_MAC_LENGTH</code> 个字节就是此标记。由于 <a href="#update">update</a> 的指定调用无法得知自己是否为最后一次调用,因此它必须处理除标记长度之外的所有数据,并缓冲可能的标记数据以便在调用 <a href="#finish">finish</a> 期间进行处理。</p>
+
+<h3 id="finish">finish</h3>
+
+<p>用于完成通过 <a href="#begin">begin</a> 开始且正在进行的操作,负责处理通过 <a href="#update">update</a> 提供的所有尚未处理的数据。</p>
+
+<p>此方法是操作期间调用的最后一个方法,因此必须返回所有处理后的数据。</p>
+
+<p>无论是成功完成还是返回错误,此方法都会结束相应操作,从而使收到的操作句柄无效。如果以后再将该句柄与此方法、<a href="#update">update</a> 或 <a href="#abort">abort</a> 配合使用,都必须返回 <code>KM_ERROR_INVALID_OPERATION_HANDLE</code>。</p>
+
+<p>签名操作将返回签名作为输出。验证操作将接受 <code>signature</code> 参数中的签名,并且不会返回任何输出。</p>
+
+<h4 id="authorization_enforcement">密钥授权强制执行</h4>
+
+<p>密钥授权强制执行主要在 <a href="#begin">begin</a> 中进行。不过,密钥存在以下情况时例外:</p>
+
+<ul>
+ <li>有一个或多个 <a href="#km_tag_user_secure_id">KM_TAG_USER_SECURE_ID</a>,并且</li><li>没有 <a href="#km_tag_auth_timeout">KM_TAG_AUTH_TIMEOUT</a>
+</li></ul>
+
+<p>在这种情况下,密钥需要针对各项操作的授权,并且 update 方法必须要在 <code>in_params</code> 参数中收到 <a href="#km_tag_auth_token">KM_TAG_AUTH_TOKEN</a>。该令牌必须有效(HMAC 必须验证),必须包含匹配的安全用户 ID,必须与密钥的 <a href="#km_tag_mac_length">KM_TAG_USER_AUTH_TYPE</a> 匹配,并且必须包含质询字段中当前操作的操作句柄。如果不符合这些要求,则返回 <code>KM_ERROR_KEY_USER_NOT_AUTHENTICATED</code>。</p>
+
+<p>调用程序必须要在每次调用 <a href="#update">update</a> 和 <a href="#finish">finish</a> 时提供身份验证令牌。实现只需对该令牌验证一次(如果它倾向于这么做)。</p>
+
+<h4 id="rsa_keys">RSA 密钥</h4>
+
+<p>有一些附加要求,具体取决于填充模式:</p>
+
+<ul>
+ <li><strong>KM_PAD_NONE</strong>:对于非填充式签名和加密操作,如果收到的数据比密钥短,那么在签名/加密之前,必须要在数据左侧填充零来补齐。如果数据与密钥一样长度,但数值较大,则返回 <code>KM_ERROR_INVALID_ARGUMENT</code>。对于验证和解密操作,数据必须与密钥一样长。否则返回 <code>KM_ERROR_INVALID_INPUT_LENGTH.</code>
+ </li><li><strong>KM_PAD_RSA_PSS</strong>:对于 PSS 填充式签名操作,PSS 盐不得短于 20 个字节,并且必须是随机生成的。盐可以更长;参考实现使用的是长度最大的盐。调用 <a href="#begin">begin</a> 时在 <code>input_params</code> 中使用 <a href="#km_tag_digest">KM_TAG_DIGEST</a> 指定的摘要将用作 PSS 摘要算法,而 SHA1 将用作 MGF1 摘要算法。
+ </li><li><strong>KM_PAD_RSA_OAEP</strong>:调用 <a href="#begin">begin</a> 时在 <code>input_params</code> 中使用 <a href="#km_tag_digest">KM_TAG_DIGEST</a> 指定的摘要将用作 OAEP 摘要算法,而 SHA1 将用作 MGF1 摘要算法。
+</li></ul>
+
+<h4 id="ecdsa_keys">ECDSA 密钥</h4>
+
+<p>如果为非填充式签名或验证操作提供的数据太长,则要将其截断。</p>
+
+<h4 id="aes_keys">AES 密钥</h4>
+
+<p>有一些附加要求,具体取决于分块模式:</p>
+
+<ul>
+ <li><strong>KM_MODE_ECB</strong> 或 <strong>KM_MODE_CBC</strong>:如果填充模式是 <code>KM_PAD_NONE</code>,并且数据长度不是 AES 分块大小的倍数,则返回 <code>KM_ERROR_INVALID_INPUT_LENGTH</code>。如果填充模式是 <code>KM_PAD_PKCS7</code>,则按照 PKCS#7 规范填充数据。请注意,PKCS#7 要求,如果数据长度是分块长度的倍数,则必须要添加一个额外的填充分块。
+ </li><li><strong>KM_MODE_GCM</strong>:在加密期间,处理所有明文之后,会计算此标记(<a href="#km_tag_mac_length">KM_TAG_MAC_LENGTH</a> 个字节)并将其附加到返回的密文。在解密期间,会将最后 <a href="#km_tag_mac_length">KM_TAG_MAC_LENGTH</a> 个字节作为标记处理。如果标记验证失败,则返回 <code>KM_ERROR_VERIFICATION_FAILED</code>。</li></ul>
+
+<h3 id="abort">abort</h3>
+
+<p>用于中止正在进行的操作。在调用 abort 之后,如果后续再将收到的操作句柄与 <a href="#update">update</a>、<a href="#finish">finish</a> 或 <a href="#abort">abort</a> 配合使用,则返回 <code>KM_ERROR_INVALID_OPERATION_HANDLE</code>。</p>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/security/overview/acknowledgements.html b/zh-cn/security/overview/acknowledgements.html
new file mode 100644
index 00000000..a348736d
--- /dev/null
+++ b/zh-cn/security/overview/acknowledgements.html
@@ -0,0 +1,864 @@
+<html devsite><head>
+ <title>Android 安全性致谢</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>Android 安全团队非常感谢以下个人和团队帮助提高 Android 安全性。他们或发现安全漏洞,并负责地通过 AOSP 错误跟踪工具<a href="https://code.google.com/p/android/issues/entry?template=Security%20bug%20report">安全错误报告</a>模板向我们报告,或提交对 Android 安全性具有积极影响的代码(包括符合<a href="https://www.google.com/about/appsecurity/patch-rewards/">补丁程序奖励</a>计划条件的代码),帮助提高了 Android 安全性。</p>
+
+<h2 id="2017">2017 年</h2>
+<div style="LINE-HEIGHT:25px;">
+
+<p>Google 动态工具团队的 Alexander Potapenko</p>
+
+<p>Alexandru Blanda</p>
+
+<p>阿里巴巴移动安全团队的 Baozeng Ding</p>
+
+<p>Ben Actis (<a href="https://twitter.com/ben_ra">@Ben_RA</a>)</p>
+
+<p>Android 安全团队的 Billy Lau</p>
+
+<p>百度安全实验室的包沉浮</p>
+
+<p>阿里巴巴移动安全团队的 Chengming Yang</p>
+
+<p><a href="http://c0reteam.org">C0RE 团队</a>的 Chiachih Wu (<a href="https://twitter.com/chiachih_wu">@chiachih_wu</a>)</p>
+
+<p><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:shaodacheng2016@gmail.com">Dacheng Shao</a></p>
+
+<p>Daniel Dakhno</p>
+
+<p>Copperhead Security 的 Daniel Micay</p>
+
+<p>腾讯玄武实验室的 Daxing Guo (<a href="https://twitter.com/freener0">@freener0</a>)</p>
+
+<p><a href="mailto:derrek.haxx@gmail.com">derrek</a> (<a href="https://twitter.com/derrekr6">@derrekr6</a>)</p>
+
+<p>腾讯科恩实验室 (<a href="https://twitter.com/keen_lab">@keen_lab</a>) 的 Di Shen (<a href="https://twitter.com/returnsme">@returnsme</a>)</p>
+
+<p>加州大学圣巴巴拉分校 Shellphish Grill 团队的 donfos (Aravind Machiry)</p>
+
+<p><a href="http://www.linkedin.com/in/dzima">Dzmitry Lukyanenka</a></p>
+
+<p><a href="http://www.ms509.com">MS509Team</a> 的 En He (<a href="http://twitter.com/heeeeen4x">@heeeeen4x</a>)</p>
+
+<p>索尼移动通信股份有限公司的 Fang Chen</p>
+
+<p>Chrome 的 Frank Liberato</p>
+
+<p>Project Zero 的 Gal Beniamini</p>
+
+<p>奇虎 360 科技有限公司 IceSword 实验室的 Gengjia Chen (<a href="https://twitter.com/chengjia4574">@chengjia4574</a>)</p>
+
+<p>Google WebM 团队</p>
+
+<p><a href="http://www.360.com">奇虎 360 科技有限公司</a> Alpha 团队的龚广 (<a href="http://twitter.com/oldfresher">@oldfresher</a>)</p>
+
+<p>新加坡理工大学 (SIT) 的 Guangdong Bai</p>
+
+<p><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:arnow117@gmail.com">Hanxiang Wen</a></p>
+
+<p>奇虎 360 科技有限公司 Alpha 团队的 Hao Chen</p>
+
+<p>索尼移动通信股份有限公司的 Hiroki Yamamoto</p>
+
+<p><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:hlhan@bupt.edu.cn">Hongli Han</a></p>
+
+<p>Ian Foster (<a href="https://twitter.com/lanrat">@lanrat</a>)</p>
+
+<p>趋势科技的 Jack Tang</p>
+
+<p>Google 的 Jeff Sharkey</p>
+
+<p>Jeff Trim</p>
+
+<p><a href="https://skyeye.360safe.com">奇虎 360 天眼实验室</a>的 Jianjun Dai (<a href="https://twitter.com/Jioun_dai">@Jioun_dai</a>)</p>
+
+<p>奇虎 360 IceSword 实验室的 Jianqiang Zhao (<a href="https://twitter.com/jianqiangzhao">@jianqiangzhao</a>)</p>
+
+<p>Jon Sawyer (<a href="http://twitter.com/jcase">@jcase</a>)</p>
+
+<p>阿里巴巴的 Jun Cheng</p>
+
+<p>百度安全实验室的韦韬</p>
+
+<p><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:zlbzlb815@163.com">Lubo Zhang</a></p>
+
+<p>LINE Corporation 的 ma.la</p>
+
+<p>Google 的 Makoto Onuki</p>
+
+<p>Google 的 <a href="mailto:salyzyn@android.com">Mark Salyzyn</a></p>
+
+<p>Google 的 Max Spector:</p>
+
+<p>IBM X-Force 安全研究团队的 Michael Goberman</p>
+
+<p>特斯拉汽车公司产品安全团队的 Mike Anderson (<a href="https://twitter.com/manderbot">@manderbot</a>)</p>
+
+<p><a href="http://c0reteam.org">C0RE 团队</a>的 Mingjian Zhou (<a href="https://twitter.com/Mingjian_Zhou">@Mingjian_Zhou</a>)</p>
+
+<p>Monk Avel</p>
+
+<p>特斯拉汽车公司产品安全团队的 Nathan Crandall (<a href="https://twitter.com/natecray">@natecray</a>)</p>
+
+<p>LINE Corporation 的 Nikolay Elenkov</p>
+
+<p>阿里巴巴移动安全团队的 Ning You</p>
+
+<p>阿里巴巴移动安全团队的 Peng Xiao</p>
+
+<p>百度安全实验室的丁鹏飞</p>
+
+<p>趋势科技的 Peter Pi (<a href="https://twitter.com/heisecode">@heisecode</a>)</p>
+
+<p>奇虎 360 科技有限公司 IceSword 实验室的 <a href="http://weibo.com/jfpan">pjf</a></p>
+
+<p>腾讯科恩实验室的何淇丹 (<a href="https://twitter.com/flanker_hqd">@flanker_hqd</a>)</p>
+
+<p>奇虎 360 的 Qing Zhang</p>
+
+<p>蚂蚁金服巴斯光年安全实验室的 Quhe</p>
+
+<p>IBM X-Force 安全研究团队的 Roee Hay</p>
+
+<p>IBM X-Force 研发团队的 Sagi Kedmi</p>
+
+<p>DarkMatter 安全通信部门的 <a href="mailto:keun-o.park@darkmatter.ae">Sahara</a></p>
+
+<p>加州大学圣巴巴拉分校 Shellphish Grill 团队的 salls (<a href="https://twitter.com/chris_salls">@chris_salls</a>)</p>
+
+<p>Scott Bauer (<a href="http://twitter.com/ScottyBauer1">@ScottyBauer1</a>)</p>
+
+<p>Sean Beaupre (<a href="https://twitter.com/firewaterdevs">@firewaterdevs</a>)</p>
+
+<p>趋势科技移动威胁研究团队的 Seven Shen (<a href="https://twitter.com/lingtongshen">@lingtongshen</a>)</p>
+
+<p>富士通的 Shinichi Matsumoto</p>
+
+<p><a href="http://www.byterev.com">ByteRev</a> 的 <a href="mailto:smarques84@gmail.com">Stéphane Marques</a></p>
+
+<p>Stephen Morrow</p>
+
+<p>Google 的 Svetoslav Ganov</p>
+
+<p>Tim Becker</p>
+
+<p><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:segfault5514@gmail.com">Tong Lin</a></p>
+
+<p>Uma Sankar Pradhan (<a href="https://twitter.com/umasankar_iitd">@umasankar_iitd</a>)</p>
+
+<p><a href="http://www.trendmicro.com">趋势科技</a>移动威胁研究团队的 V.E.O (<a href="https://twitter.com/vysea">@VYSEa</a>)</p>
+
+<p>蚂蚁金服巴斯光年安全实验室的 wanchouchou</p>
+
+<p>阿里巴巴的 Weichao Sun (<a href="https://twitter.com/sunblate">@sunblate</a>)</p>
+
+<p><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:vancouverdou@gmail.com">Wenke Dou</a></p>
+
+<p>奇虎 360 科技有限公司 Alpha 团队的 Wenlin Yang (<a href="https://twitter.com/wenlin_yang">@wenlin_yang</a>)</p>
+
+<p>蚂蚁金服巴斯光年安全实验室的<a href="http://www.weibo.com/wishlinux">吴潍浠</a> (<a href="https://twitter.com/wish_wu">@wish_wu</a>)</p>
+
+<p><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:wisedd@gmail.com">Xiaodong Wang</a></p>
+
+<p><a href="http://c0reteam.org">C0RE 团队</a>的 Xuxian Jiang</p>
+
+<p><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:bigwyfone@gmail.com">Yanfeng Wang</a></p>
+
+<p>阿里巴巴移动安全团队的 Yang Song</p>
+
+<p><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:yaojun8558363@gmail.com">Yao Jun</a></p>
+
+<p>阿里巴巴的王勇 (<a href="https://twitter.com/ThomasKing2014">@ThomasKing2014</a>)</p>
+
+<p>奇虎 360 科技有限公司 IceSword 实验室的 Yonggang Guo (<a href="https://twitter.com/guoygang">@guoygang</a>)</p>
+
+<p>奇虎 360 科技有限公司 Vulpecker 团队的 Yu Pan</p>
+
+<p><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:computernik@gmail.com">Yuan-Tsung Lo</a></p>
+
+<p><a href="http://c0reteam.org">C0RE 团队</a>的 Yuqi Lu (<a href="https://twitter.com/nikos233__">@nikos233</a>)</p>
+
+<p>腾讯安全平台部门的 Yuxiang Li (<a href="https://twitter.com/xbalien29">@Xbalien29</a>)</p>
+
+<p><a href="http://www.cmcm.com/">猎豹移动公司</a>安全研究实验室的 Zhanpeng Zhao(行之)(<a href="https://twitter.com/0xr0ot">@0xr0ot</a>)</p>
+
+<p><a href="http://www.nsfocus.com">NSFocus</a> 的 <a href="mailto:zhouzhenster@gmail.com">Zhen Zhou</a> (<a href="https://twitter.com/henices">@henices</a>)</p>
+
+ <p><a href="http://www.nsfocus.com">NSFocus</a> 的 <a href="mailto:sundaywind2004@gmail.com">Zhixin Li</a></p>
+
+ <p>奇虎 360 科技有限公司成都安全响应中心的 <a href="http://weibo.com/ele7enxxh">Zinuo Han</a></p>
+
+ <p>Google 的 Zubin Mithra</p>
+
+ </div>
+
+<h2 id="2016">2016 年</h2>
+
+<div style="LINE-HEIGHT:25px;">
+
+<p>Google Chrome 安全团队的 Abhishek Arya</p>
+
+<p>Check Point Software Technologies Ltd. 的 Adam Donenfeld 等人</p>
+
+<p>Google 的 Adam Powell</p>
+
+<p>Context Information Security 的 Alex Chapman</p>
+
+<p><a href="http://www.isti.tu-berlin.de/security_in_telecommunications">Security in Telecommunications</a> 的 Altaf Shaik</p>
+
+<p>Andre Teixeira Rizzo</p>
+
+<p>Andrea Biondo</p>
+
+<p>Google 的 Andrei Kapishnikov</p>
+
+<p><a href="https://www.e2e-assure.com">e2e-assure</a> 的 Andy Tyler (<a href="https://twitter.com/ticarpi">@ticarpi</a>)</p>
+
+<p>CENSUS S.A. 的 Anestis Bechtsoudis (<a href="https://twitter.com/anestisb">@anestisb</a>)</p>
+
+<p>无声信息技术 <a href="http://www.pkav.net">PKAV</a> 的 Ao Wang (<a href="https://twitter.com/ArayzSegment">@ArayzSegment</a>)</p>
+<p>腾讯安全平台部门的 Askyshang</p>
+
+<p>阿里巴巴移动安全团队的 Baozeng Ding</p>
+
+<p>Google Project Zero 的 Ben Hawkes</p>
+
+<p>Android 安全团队的 Billy Lau</p>
+
+<p>Google Telecom 团队的 Brad Ebinger</p>
+
+<p>Broadgate 团队</p>
+
+<p>Android 安全团队的 Chad Brubaker</p>
+
+<p>阿里巴巴移动安全团队的 Chao Yang</p>
+
+<p>百度安全实验室的包沉浮</p>
+
+<p>阿里巴巴移动安全团队的 Chengming Yang</p>
+
+<p><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:zc1991@mail.ustc.edu.cn">Chi Zhang</a></p>
+
+<p><a href="http://www.360safe.com/">奇虎 360</a> <a href="http://c0reteam.org">C0RE 团队</a>的 Chiachih Wu (<a href="https://twitter.com/chiachih_wu">@chiachih_wu</a>)</p>
+
+<p>Christian Seel</p>
+
+<p>Google 的 Christopher Tate</p>
+
+<p>比雷埃夫斯大学的 <a href="mailto:kpatsak@unipi.gr">Constantinos Patsakis</a></p>
+
+<p>卡内基梅隆大学的 Cory Pruce</p>
+
+<p>阿姆斯特丹自由大学的 Cristiano Giuffrida</p>
+
+<p>Copperhead Security 的 Daniel Micay</p>
+
+<p>Google 的 David Benjamin</p>
+
+<p>Google Pixel C 团队的 David Riley</p>
+
+<p><a href="http://jaq.alibaba.com">阿里巴巴移动安全团队</a>的 Dawei Peng (<a href="http://weibo.com/u/5622360291">Vinc3nt4H</a>)</p>
+
+<p>腾讯科恩实验室 (<a href="https://twitter.com/keen_lab">@keen_lab</a>) 的 Di Shen (<a href="https://twitter.com/returnsme">@returnsme</a>)</p>
+
+<p>Google 的 Dianne Hackborn</p>
+
+<p>Google 动态工具团队的 Dmitry Vyukov</p>
+
+<p>布伦瑞克工业大学<a href="https://www.ibr.cs.tu-bs.de">操作系统和计算机网络学院</a>的 Dominik Schürmann</p>
+
+<p>加州大学河滨分校的 <a href="mailto:dshe002@ucr.edu">Dongdong She</a></p>
+
+<p>韩国科学技术院系统安全实验室的 Dongkwan Kim (<a href="mailto:dkay@kaist.ac.kr">dkay@kaist.ac.kr</a>)</p>
+
+<p>dosomder</p>
+
+<p>阿里巴巴移动安全团队的 dragonltx</p>
+
+<p>DS</p>
+
+<p>Dzmitry Lukyanenka (<a href="http://www.linkedin.com/in/dzima">www.linkedin.com/in/dzima</a>)</p>
+
+<p>趋势科技的徐健</p>
+
+<p>比雷埃夫斯大学的 <a href="mailto:talepis@unipi.gr">Efthimios Alepis</a></p>
+
+<p><a href="http://www.ms509.com">MS509Team</a> 的 En He (<a href="https://twitter.com/heeeeen4x">@heeeeen4x</a>)</p>
+
+<p>Gal Beniamini(<a href="https://twitter.com/@laginimaineb">@laginimaineb</a>、<a href="http://bits-please.blogspot.com/">http://bits-please.blogspot.com</a>)</p>
+
+<p>奇虎 360 科技有限公司 0x031E 实验室的 Gengjia Chen (<a href="https://twitter.com/@chengjia4574">@chengjia4574</a>)</p>
+
+<p>腾讯科恩实验室的刘耕铭 (<a href="http://twitter.com/dmxcsnsbh">@dmxcsnsbh</a>)</p>
+
+<p><a href="https://www.epfl.ch">École polytechnique fédérale de Lausanne</a> 的 <a href="mailto:gpiskas@gmail.com">George Piskas</a></p>
+
+<p>加州大学圣巴巴拉分校的 Giovanni Vigna</p>
+
+<p>Google Android 团队的 Greg Kaiser</p>
+
+<p><a href="http://www.360.com/">奇虎 360 科技有限公司</a>的龚广 (<a href="https://twitter.com/oldfresher">@oldfresher</a>)</p>
+
+<p>加州大学河滨分校的 <a href="mailto:hzhan033@ucr.edu">Hang Zhang</a></p>
+
+<p><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:arnow117@gmail.com">Hanxiang Wen</a></p>
+
+<p>奇虎 360 科技有限公司 Vulpecker 团队的 Hao Chen</p>
+
+<p><a href="http://www.cmcm.com">猎豹移动公司</a>安全研究实验室的 Hao Qin</p>
+
+<p>阿姆斯特丹自由大学的 Herbert Bos</p>
+
+<p>韩国科学技术院系统安全实验室的 Hongil Kim (<a href="mailto:hongilk@kaist.ac.kr">hongilk@kaist.ac.kr</a>)</p>
+
+<p><a href="http://www.search-lab.hu/">Search-Lab Ltd.</a> 的 Imre Rad</p>
+
+<p><a href="http://www.iwobanas.com">Iwo Banas</a></p>
+
+<p>Mandiant(FireEye 旗下的一家公司)的 Jake Valletta</p>
+
+<p>Google Project Zero 的 James Forshaw</p>
+
+<p>Jann Horn (<a href="https://thejh.net/">https://thejh.net</a>)</p>
+
+<p><a href="http://keybase.io/jasonrogena">Jason Rogena</a></p>
+
+<p>Google 的 Jeremy C. Joslin</p>
+
+<p>腾讯 KEEN 实验室 (<a href="https://twitter.com/k33nteam">@K33nTeam</a>) 的 jfang</p>
+
+<p>奇虎 360 IceSword 实验室的 Jianqiang Zhao (<a href="https://twitter.com/jianqiangzhao">@jianqiangzhao</a>)</p>
+
+<p>Joshua Drake (<a href="https://twitter.com/jduck">@jduck</a>)</p>
+
+<p>Jouni Malinen PGP id EFC895FA</p>
+
+<p>Fortinet FortiGuard 实验室的 Kai Lu (<a href="https://twitter.com/K3vinLuSec">@K3vinLuSec</a>)</p>
+
+<p>Kandala Shivaram reddy</p>
+
+<p>阿姆斯特丹自由大学的 Kaveh Razavi</p>
+
+<p>Google 的 Kenny Root</p>
+
+<p>Google 的 Lee Campbell</p>
+
+<p><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:zlbzlb815@163.com">Lubo Zhang</a></p>
+
+<p>Google 安全团队的 Maciej Szawłowski</p>
+
+<p>萨尔大学 CISPA 的 Madhu Priya Murugan</p>
+
+<p>Google 的 Makoto Onuki</p>
+
+<p>腾讯科恩实验室 (<a href="https://twitter.com/keen_lab">@keen_lab</a>) 的 Marco Grassi (<a href="https://twitter.com/marcograss">@marcograss</a>)</p>
+
+<p>Google 的 Marco Nelissen</p>
+
+<p>Google Project Zero 的 Mark Brand</p>
+
+<p>Google 的 Mark Renouf</p>
+
+<p>Google Chrome 安全团队的 Martin Barbella</p>
+
+<p>加州大学圣巴巴拉分校的 Martina Lindorfer</p>
+
+<p>Google 的 Max Spector</p>
+
+<p>瓶科技的 MengLuo Gou (<a href="https://twitter.com/idhyt3r">@idhyt3r</a>)</p>
+
+<p>Michał Bednarski (<a href="https://github.com/michalbednarski">github.com/michalbednarski</a>)</p>
+
+<p>Mike Maarse</p>
+
+<p>Android 安全团队的 Min Chong</p>
+
+<p><a href="http://www.360safe.com/">奇虎 360</a> <a href="http://c0reteam.org">C0RE 团队</a>的 Mingjian Zhou (<a href="https://twitter.com/Mingjian_Zhou">@Mingjian_Zhou</a>)</p>
+
+<p>Google 的 Miriam Gershenson</p>
+
+<p>Vertu Corporation LTD 的 Nancy Wang</p>
+
+<p><a href="mailto:nasim@zamir.ca">Nasim Zamir</a></p>
+
+<p>特斯拉汽车公司产品安全团队的 Nathan Crandall (<a href="https://twitter.com/natecray">@natecray</a>)</p>
+
+<p>Qualcomm 产品安全计划的 Nico Golde (<a href="https://twitter.com/iamnion">@iamnion</a>)</p>
+
+<p>Nightwatch Cybersecurity Research (<a href="https://twitter.com/nightwatchcyber">@nightwatchcyber</a>)</p>
+
+<p>阿里巴巴移动安全团队的 Ning You</p>
+
+<p>Google 的 Oleksiy Vyalov</p>
+
+<p>Google Chrome 安全团队的 Oliver Chang</p>
+
+<p>Context Information Security 的 Paul Stone</p>
+
+<p>阿里巴巴移动安全团队的 Peng Xiao</p>
+
+<p>百度安全实验室的丁鹏飞</p>
+
+<p>趋势科技的 Peter Pi (<a href="https://twitter.com/heisecode">@heisecode</a>)</p>
+
+奇虎 360 IceSword 实验室的 <a href="http://weibo.com/jfpan">pjf</a><p></p>
+
+<p>Google 信息安全工程师团队的 Quan Nguyen</p>
+
+<p><a href="http://www.wooyun.org/">乌云 TangLab</a> 的 Qianwei Hu (<a href="mailto:rayxcp@gmail.com">rayxcp@gmail.com</a>)</p>
+
+<p>腾讯科恩实验室 (<a href="https://twitter.com/keen_lab">@keen_lab</a>) 的 Qidan He (<a href="https://twitter.com/@Flanker_hqd">@Flanker_hqd</a>)</p>
+
+<p>Richard Shupak</p>
+
+<p>Google 的 Ricky Wai</p>
+
+<p>Google 的 Robin Lee</p>
+
+<p>IBM X-Force 安全研究员 Roee Hay</p>
+
+<p>Roeland Krak</p>
+
+<p><a href="https://labs.mwrinfosecurity.com/">MWR 实验室</a>的 Romain Trouvé</p>
+
+<p>Lv51 团队的 Ronald L. Loor Vargas (<a href="https://twitter.com/loor_rlv">@loor_rlv</a>)</p>
+
+<p>IBM X-Force 安全研究员 Sagi Kedmi</p>
+
+<p>Google 的 Samuel Tan</p>
+
+<p>Google Telecom 团队的 Santos Cordon</p>
+
+<p><a href="mailto:sbauer@plzdonthack.me">Scott Bauer</a> (<a href="https://twitter.com/ScottyBauer1">@ScottyBauer1</a>)</p>
+
+<p>腾讯 KEEN 实验室 (<a href="https://twitter.com/k33nteam">@K33nTeam</a>) 的 Sen Nie (<a href="https://twitter.com/@nforest_">@nforest_</a>)</p>
+
+<p>卡巴斯基实验室的 Sergey Bobrov (<a href="http://twitter.com/Black2Fan">@Black2Fan</a>)</p>
+
+<p>趋势科技 (<a href="http://www.trendmicro.com">www.trendmicro.com</a>) 的 Seven Shen (<a href="https://twitter.com/@lingtongshen">@lingtongshen</a>)</p>
+
+<p>Google 的 Sharvil Nanavati</p>
+
+<p><a href="http://www.isti.tu-berlin.de/security_in_telecommunications">Security in Telecommunications</a> 的 Shinjo Park (<a href="https://twitter.com/ad_ili_rai">@ad_ili_rai</a>)</p>
+
+<p>Stuart Henderson</p>
+
+<p>新加坡管理大学的 Su Mon Kywe</p>
+
+<p>百度安全实验室的韦韬</p>
+
+<p>Thom Does</p>
+
+<p>华为公司的 Tieyan Li</p>
+
+<p>SentinelOne / RedNaga 的 Tim Strazzere (<a href="https://twitter.com/timstrazz">@timstrazz</a>)</p>
+
+<p>Google X 的 Tom Craig</p>
+
+<p>Tom Rootjunky</p>
+
+<p><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:segfault5514@gmail.com">Tong Lin</a></p>
+
+<p>北京大学的 <a href="mailto:litongxin1991@gmail.com">Tongxin Li</a></p>
+
+<p>trotmaster (<a href="https://twitter.com/trotmaster99">@trotmaster99</a>)</p>
+
+<p>Vasily Vasilev</p>
+
+<p>Google 的 Victor Chang</p>
+
+<p>阿姆斯特丹自由大学的 Victor van der Veen</p>
+
+<p>Google 的 Vignesh Venkatasubramanian</p>
+
+<p>Android 安全团队的 Vishwath Mohan</p>
+
+<p>腾讯玄武实验室的 Wei Wei (<a href="https://twitter.com/Danny__Wei">@Danny__Wei</a>)</p>
+
+<p>阿里巴巴的 Weichao Sun (<a href="https://twitter.com/sunblate">@sunblate</a>)</p>
+
+<p>腾讯科恩实验室 (<a href="https://twitter.com/keen_lab">@keen_lab</a>) 的 Wen Niu (<a href="https://twitter.com/NWMonster">@NWMonster</a>)</p>
+
+<p><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:vancouverdou@gmail.com">Wenke Dou</a></p>
+
+<p>奇虎 360 科技有限公司 Alpha 团队的 Wenlin Yang</p>
+
+<p>William Roberts (<a href="mailto:william.c.roberts@intel.com">william.c.roberts@intel.com</a>)</p>
+
+<p><a href="http://www.trendmicro.com">趋势科技</a><a href="http://blog.trendmicro.com/trendlabs-security-intelligence/category/mobile/">移动威胁响应团队</a>的<a href="http://weibo.com/wishlinux">吴潍浠</a> (<a href="https://twitter.com/wish_wu">@wish_wu</a>)</p>
+
+<p><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:wisedd@gmail.com">Xiaodong Wang</a></p>
+
+<p>印第安纳大学布卢明顿分校的 <a href="mailto:xw7@indiana.edu">Xiaofeng Wang</a></p>
+
+<p>腾讯安全平台部门的 Xiling Gong</p>
+
+<p><a href="http://www.alibaba.com/">阿里巴巴</a>的何星宇 (<a href="https://twitter.com/Spid3r_">@Spid3r_</a>)</p>
+
+<p>北京大学的 <a href="mailto:hanxinhui@pku.edu.cn">Xinhui Han</a></p>
+
+<p><a href="http://www.360safe.com/">奇虎 360</a> <a href="http://c0reteam.org">C0RE 团队</a>的 Xuxian Jiang</p>
+
+<p>Android Bionic 团队的 Yabin Cui</p>
+
+<p>中国科学院软件研究所 TCA 实验室的 Yacong Gu</p>
+
+<p><a href="https://wwws.nightwatchcybersecurity.com">Nightwatch Cybersecurity</a> 的 Yakov Shafranovich</p>
+
+<p>阿里巴巴移动安全团队的 Yang Dong</p>
+
+<p>阿里巴巴移动安全团队的 Yang Song</p>
+
+<p>加州大学圣巴巴拉分校的 Yanick Fratantonio</p>
+
+<p><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:yaojun8558363@gmail.com">Yao Jun</a></p>
+
+<p>印第安纳大学布卢明顿分校的 <a href="mailto:luc2yj@gmail.com">Yeonjoon Lee</a></p>
+
+<p>阿里巴巴移动安全团队的 Yi Zhang</p>
+
+<p>新加坡管理大学的 Yingjiu Li</p>
+
+<p>华为公司 SCC Eagleye 团队的 Yong Shi</p>
+
+<p>阿里巴巴的王勇 (<a href="https://twitter.com/ThomasKing2014">@ThomasKing2014</a>)</p>
+
+<p>腾讯玄武实验室的 Yongke Wang (<a href="https://twitter.com/Rudykewang">@Rudykewang</a>)</p>
+
+<p>华为公司的 Yongzheng Wu</p>
+
+<p><a href="http://c0reteam.org">C0RE 团队</a>的 Yuan-Tsung Lo (<a href="mailto:computernik@gmail.com">computernik@gmail.com</a>)</p>
+
+<p>百度安全实验室的 Yulong Zhang</p>
+
+<p>密歇根大学安娜堡分校的 <a href="http://yurushao.info">Yuru Shao</a></p>
+
+<p>腾讯安全平台部门的 Yuxiang Li (<a href="https://twitter.com/xbalien29">@Xbalien29</a>)</p>
+
+<p>Android 安全团队的 Zach Riggle (<a href="https://twitter.com/@ebeip90">@ebeip90</a>)</p>
+
+<p><a href="http://www.cmcm.com">猎豹移动公司</a>安全研究实验室的 Zhanpeng Zhao(行之)(<a href="https://twitter.com/0xr0ot">@0xr0ot</a>)</p>
+
+<p>奇虎 360 科技有限公司成都安全响应中心的金哲</p>
+
+<p>加州大学河滨分校的 <a href="mailto:zhiyunq@cs.ucr.edu">Zhiyun Qian</a></p>
+
+<p>无声信息技术 <a href="http://www.pkav.net">PKAV</a> 的 <a href="http://weibo.com/ele7enxxh">Zinuo Han</a></p>
+
+<p>Google 的 Zubin Mithra</p>
+
+</div>
+
+<h2 id="2015">2015 年</h2>
+
+<div style="LINE-HEIGHT:25px;">
+<p>Google Chrome 安全团队的 Abhishek Arya</p>
+
+<p>Alex Copot</p>
+
+<p>Alex Eubanks</p>
+
+<p>Alexandru Blanda</p>
+
+<p>Arne Swinnen (<a href="https://www.arneswinnen.net/">www.arneswinnen.net</a>)</p>
+
+<p>Artem Chaykin</p>
+
+<p>Ben Hawkes</p>
+
+<p>Brennan Lautner</p>
+
+<p>奇虎 360 C0RE 团队的 Chiachih Wu</p>
+
+<p>Darmstadt (siegfried.rasthofer@gmail.com)</p>
+
+<p>Copperhead Security 的 Daniel Micay (daniel.micay@copperhead.co)</p>
+
+<p>韩国科学技术院系统安全实验室的 Dongkwan Kim (dkay@kaist.ac.kr)</p>
+
+<p>阿里巴巴移动安全团队的 dragonltx</p>
+
+<p>Gal Beniamini (<a href="http://bits-please.blogspot.com/">http://bits-please.blogspot.com</a>)</p>
+
+<p><a href="http://www.360.cn/">奇虎 360 科技有限公司</a>的龚广(<a href="https://twitter.com/oldfresher">@oldfresher</a>、higongguang@gmail.com)</p>
+
+<p>韩国科学技术院系统安全实验室的 Hongil Kim (hongilk@kaist.ac.kr)</p>
+
+<p>Google Project Zero 的 Ian Beer</p>
+
+<p>阿根廷布宜诺斯艾利斯 Dr. Manuel Sadosky 基金会 Programa STIC 的 Iván Arce (@4Dgifts)</p>
+
+<p>趋势科技的 Jack Tang (@jacktang310)</p>
+
+<p><a href="http://security.utexas.edu/">德克萨斯州大学奥斯汀分校</a>的 jgor (<a href="https://twitter.com/indiecom">@indiecom</a>)</p>
+
+<p>阿根廷布宜诺斯艾利斯 Dr. Manuel Sadosky 基金会 Programa STIC 的 Joaquín Rinaudo (@xeroxnir)</p>
+
+<p>Exodus Intelligence 的 Jordan Gruskovnjak (@jgrusko)</p>
+
+<p>Zimperium 的 Joshua Drake</p>
+
+<p>奇虎 360 C0RE 团队的 Lei Wu</p>
+
+<p><a href="http://k33nteam.org/">碁震安全研究团队</a> (<a href="https://twitter.com/k33nteam">@K33nTeam</a>) 的 Marco Grassi (<a href="https://twitter.com/marcograss">@marcograss</a>)</p>
+
+<p>EmberMitre Ltd 的 Mark Carter (<a href="https://twitter.com/hanpingchinese">@hanpingchinese</a>)</p>
+
+<p>Google Chrome 安全团队的 Martin Barbella</p>
+
+<p><a href="https://www.mitre.org/">MITRE Corporation</a> 的 Michael Peck (mpeck@mitre.org)</p>
+
+<p>Michał Bednarski (<a href="https://github.com/michalbednarski">https://github.com/michalbednarski</a>)</p>
+
+<p>上奥地利/哈根贝格应用科学大学 JR-Center u'smile 的 Michael Roland</p>
+
+<p>Google Project Zero 的 Natalie Silvanovich</p>
+
+<p>Google Chrome 安全团队的 Oliver Chang</p>
+
+<p>趋势科技的 Peter Pi</p>
+
+<p>奇虎 360 科技有限公司的 Ping Li</p>
+
+<p>碁震安全研究团队(@K33nTeam、<a href="http://k33nteam.org/">http://k33nteam.org/</a>)的 Qidan He (@flanker_hqd)</p>
+
+<p>Roee Hay 和 Or Peles</p>
+
+<p>趋势科技的 Seven Shen</p>
+
+<p>EC SPRIDE 工业大学<a href="https://blogs.uni-paderborn.de/sse/">安全软件工程团队</a>的 Siegfried Rasthofer</p>
+
+<p><a href="https://www.sit.fraunhofer.de/">Fraunhofer SIT</a> 移动安全测试实验室的 Stephan Huber (Stephan.Huber@sit.fraunhofer.de)</p>
+
+<p>Google Project Zero 的 Steven Vittitoe</p>
+
+<p><a href="http://tonybeltramelli.com/">tonybeltramelli.com</a> 的 Tony Beltramelli (<a href="https://twitter.com/Tbeltramelli">@Tbeltramelli</a>)</p>
+
+<p>Tzu-Yin (Nina) Tai</p>
+
+<p>百度 X-Team 的 Wangtao(neobyte)</p>
+
+<p>碁震安全研究团队(@K33nTeam、<a href="http://k33nteam.org/">http://k33nteam.org/</a>)的 Wen Xu (@antlr7)</p>
+
+<p>William Roberts (<a href="mailto:william.c.roberts@intel.com">william.c.roberts@intel.com</a>)</p>
+
+<p>趋势科技的吴潍浠 (@wish_wu)</p>
+
+<p>奇虎 360 C0RE 团队的 Xuxian Jiang</p>
+
+<p>奇虎 360 C0RE 团队的 Yajin Zhou</p>
+
+</div>
+
+<h2 id="2014">2014 年</h2>
+<div style="LINE-HEIGHT:25px;">
+
+<p><a href="https://banno.com/">Banno</a> 的 Aaron Mangel (<a href="mailto:amangel@gmail.com">amangel@gmail.com</a>)</p>
+
+<p>Alex Park (<a href="https://twitter.com/saintlinu">@saintlinu</a>)</p>
+
+<p>Alexandru Gheorghita</p>
+
+<p><a href="https://www.facebook.com">Facebook</a> 的 <a href="https://twitter.com/isciurus">Andrey Labunets</a></p>
+
+<p><a href="http://www.corkami.com">Ange Albertini</a> (<a href="https://twitter.com/angealbertini">@angealbertini</a>)</p>
+
+<p>Fortinet FortiGuard 实验室的 Axelle Apvrille</p>
+
+<p><a href="https://www.aspectsecurity.com/">Aspect Security</a> 的 <a href="http://www.linkedin.com/in/danamodio">Dan Amodio</a> (<a href="https://twitter.com/DanAmodio">@DanAmodio</a>)</p>
+
+<p><a href="http://davidmurdoch.com">David Murdoch</a></p>
+
+<p><a href="https://labs.mwrinfosecurity.com/">MWR 实验室</a>的 Henry Hoggard (<a href="https://twitter.com/henryhoggard">@HenryHoggard</a>)</p>
+
+<p><a href="http://www.search-lab.hu/">Search-Lab Ltd.</a> 的 Imre Rad</p>
+
+<p><a href="http://thejh.net/">Jann Horn</a> <a href="https://android-review.googlesource.com/#/c/98197/"><img style="vertical-align:middle;" src="../images/tiny-robot.png" alt="绿色机器人补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/>
+</a></p>
+
+<p><a href="http://www.bluebox.com/">Bluebox Security</a> 的 Jeff Forristal</p>
+
+<p><a href="https://labs.mwrinfosecurity.com/">MWR 实验室</a>的 <a href="http://blog.redfern.me/">Joseph Redfern</a> <br />(<a href="https://twitter.com/JosephRedfern">@JosephRedfern</a>)</p>
+
+<p><a href="https://www.samsungknox.com/">三星 KNOX 安全团队</a>的 Kunal Patel (<a href="mailto:kunal.patel1@samsung.com">kunal.patel1@samsung.com</a>)</p>
+
+<p><a href="http://www.linkedin.com/in/luander">Luander Michel Ribeiro</a> (<a href="https://twitter.com/luanderock">@luanderock</a>)</p>
+
+<p>印第安纳大学布卢明顿分校的 <a href="http://homes.soic.indiana.edu/luyixing">Luyi Xing</a> (<a href="mailto:xingluyi@gmail.com">xingluyi@gmail.com</a>)</p>
+
+<p>Marc Blanchou (<a href="https://twitter.com/marcblanchou">@marcblanchou</a>)</p>
+
+<p>Mathew Solnik (<a href="https://twitter.com/msolnik">@msolnik</a>)</p>
+
+<p><a href="https://github.com/michalbednarski">Michał Bednarski</a></p>
+
+<p>犹他大学的 <a href="http://www.cs.utah.edu/~rsas/">Raimondas Sasnauskas</a></p>
+
+<p>美国国家安全局<a href="https://www.nsa.gov/research/ia_research/">可信系统研究团队</a>的 Robert Craig
+<a href="https://android-review.googlesource.com/#/q/owner:%22Robert+Craig+%253Crpcraig%2540tycho.ncsc.mil%253E%22+status:merged">
+<img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
+
+<p><a href="http://www.samsung.com">三星移动</a></p>
+
+<p>犹他大学的 Scotty Bauer (<a href="mailto:sbauer@eng.utah.edu">sbauer@eng.utah.edu</a>)</p>
+
+<p>Sebastian Brenza</p>
+
+<p>EC SPRIDE 达姆施塔特工业大学<a href="https://blogs.uni-paderborn.de/sse/">安全软件工程团队</a>的 Siegfried Rasthofer (<a href="mailto:siegfried.rasthofer@gmail.com">siegfried.rasthofer@gmail.com</a>)</p>
+
+<p><a href="http://www.sonymobile.com">索尼移动</a></p>
+
+<p><a href="https://www.sit.fraunhofer.de/">Fraunhofer SIT</a> 移动安全测试实验室的 Stephan Huber (<a href="mailto:Stephan.Huber@sit.fraunhofer.de">Stephan.Huber@sit.fraunhofer.de</a>)</p>
+
+<p>美国国家安全局<a href="https://www.nsa.gov/research/ia_research/">可信系统研究团队</a>的 Stephen Smalley
+<a href="https://android-review.googlesource.com/#/q/owner:%22Stephen+Smalley+%253Csds%2540tycho.nsa.gov%253E%22+status:merged">
+<img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
+
+<p>EC SPRIDE 达姆施塔特工业大学<a href="http://sseblog.ec-spride.de/">安全软件工程团队</a>的 Steven Arzt (<a href="mailto:Steven.Arzt@ec-spride.de">Steven.Arzt@ec-spride.de</a>)</p>
+
+<p><a href="https://www.facebook.com">Facebook</a> 的 <a href="http://www.subodh.io">Subodh Iyengar</a></p>
+
+<p>北京大学的 Tongxin Li (<a href="mailto:litongxin1991@gmail.com">litongxin1991@gmail.com</a>)</p>
+
+<p><a href="http://www.themeninthemiddle.com">The Men in the Middle</a> 的 <a href="http://www.linkedin.com/in/tonytrummer/">Tony Trummer</a> <br />(<a href="https://twitter.com/SecBro1">@SecBro1</a>)</p>
+
+<p><a href="https://www.linkedin.com/in/tdalvi">Tushar Dalvi</a> (<a href="https://twitter.com/tushardalvi">@tushardalvi</a>)</p>
+
+<p><a href="https://plus.google.com/u/0/109528607786970714118">Valera Neronov</a></p>
+
+<p><a href="http://xteam.baidu.com">百度 X-Team</a> 的 Wang Tao (<a href="mailto:wintao@gmail.com">wintao@gmail.com</a>)</p>
+
+<p><a href="http://xteam.baidu.com">百度 X-Team</a> 的 Wang Yu (<a href="https://twitter.com/xi4oyu">@xi4oyu</a>)</p>
+
+<p><a href="https://www.facebook.com">Facebook</a> 的 <a href="http://www.shackleton.io/">Will Shackleton</a></p>
+
+<p><a href="http://www.linkedin.com/in/billcroberts">William Roberts</a> (<a href="mailto:bill.c.roberts@gmail.com">bill.c.roberts@gmail.com</a>)
+<a href="https://android-review.googlesource.com/#/q/owner:bill.c.roberts%2540gmail.com+status:merged">
+<img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
+
+<p>印第安纳大学布卢明顿分校的 <a href="http://www.informatics.indiana.edu/xw7/">Xiaofeng Wang</a> (<a href="mailto:xw7@indiana.edu">xw7@indiana.edu</a>)</p>
+
+<p><a href="http://www.cs.indiana.edu/~zhou/">印第安纳大学布卢明顿分校</a>的 Xiaoyong Zhou <br />(<a href="https://twitter.com/xzhou">@xzhou</a>、<a href="mailto:zhou.xiaoyong@gmail.com">zhou.xiaoyong@gmail.com</a>)</p>
+
+<p>北京大学的 Xinhui Han (<a href="mailto:hanxinhui@pku.edu.cn">hanxinhui@pku.edu.cn</a>)</p>
+
+<p>印第安纳大学布卢明顿分校的 Yeonjoon Lee (<a href="mailto:luc2yj@gmail.com">luc2yj@gmail.com</a>)</p>
+
+<p><a href="http://www.androbugs.com">林禹成</a> (<a href="https://twitter.com/AndroBugs">@AndroBugs</a>)</p>
+
+<p><a href="http://xteam.baidu.com">百度 X-Team</a> 的 Zhang Dong Hui (<a href="http://weibo.com/shineastdh">shineastdh</a>)</p>
+
+</div>
+
+<h2 id="2013">2013 年</h2>
+
+<div style="LINE-HEIGHT:25px;">
+
+<p><a href="http://www.ecommera.com/">eCommera</a> 的 <a href="https://tsarstva.bg/sh/">Ivaylo Marinkov</a> (<a href="mailto:ivo@tsarstva.bg">ivo@tsarstva.bg</a>)</p>
+
+<p><a href="http://appliedcybersecurity.com/">Applied Cybersecurity LLC</a> 的 Jon Sawyer (<a href="mailto:jon@cunninglogic.com">jon@cunninglogic.com</a>)</p>
+
+<p><a href="http://www.accuvant.com/">Accuvant LABS</a> 的 Joshua J. Drake (<a href="https://twitter.com/jduck">@jduck</a>)
+<a href="https://android-review.googlesource.com/#/q/change:72228+OR+change:72229">
+<img style="vertical-align:middle" src="../images/patchreward.png" alt="补丁程序奖励符号" title="此人符合参加补丁程序奖励计划的条件!"/></a></p>
+
+<p>Kan Yuan</p>
+
+<p><a href="http://raonsecurity.com/">RaonSecurity</a> 的 Lucas Yang(amadoh4ck、<a href="mailto:amadoh4ck@gmail.com">amadoh4ck@gmail.com</a>)</p>
+
+<p>印第安纳大学布卢明顿分校的 <a href="http://homes.soic.indiana.edu/luyixing">Luyi Xing</a> (<a href="mailto:xingluyi@gmail.com">xingluyi@gmail.com</a>)</p>
+
+<p><a href="https://isecpartners.com/">iSEC Partners</a> 的 <a href="https://lacklustre.net/">Mike Ryan</a>
+<br />(<a href="https://twitter.com/mpeg4codec">@mpeg4codec</a>、<a href="mailto:mikeryan@isecpartners.com">mikeryan@isecpartners.com</a>)</p>
+
+<p><a href="http://illinois.edu/">伊利诺伊大学厄巴纳-尚佩恩分校</a>的 <a href="http://cryptoonline.com/">Muhammad Naveed</a>
+<br />(<a href="mailto:naveed2@illinois.edu">naveed2@illinois.edu</a>)</p>
+
+<p>Qualcomm 产品安全计划</p>
+
+<p><a href="https://securityresear.ch/">Roee Hay</a>(<a href="https://twitter.com/roeehay">@roeehay</a>、<a href="mailto:roeehay@gmail.com">roeehay@gmail.com</a>)</p>
+
+<p>美国国家安全局<a href="https://www.nsa.gov/research/ia_research/">可信系统研究团队</a>的 Robert Craig
+<a href="https://android-review.googlesource.com/#/q/owner:%22Robert+Craig+%253Crpcraig%2540tycho.ncsc.mil%253E%22+status:merged">
+<img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
+
+<p>IOActive 的 Ruben Santamarta (<a href="https://twitter.com/reversemode">@reversemode</a>)</p>
+
+<p>美国国家安全局<a href="https://www.nsa.gov/research/ia_research/">可信系统研究团队</a>的 Stephen Smalley
+<a href="https://android-review.googlesource.com/#/q/owner:%22Stephen+Smalley+%253Csds%2540tycho.nsa.gov%253E%22+status:merged">
+<img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
+
+<p><a href="http://www.linkedin.com/in/billcroberts">William Roberts</a> (<a href="mailto:bill.c.roberts@gmail.com">bill.c.roberts@gmail.com</a>)
+<a href="https://android-review.googlesource.com/#/q/owner:bill.c.roberts%2540gmail.com+status:merged">
+<img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
+
+<p>印第安纳大学布卢明顿分校的 Xiaorui Pan (<a href="mailto:eagle200467@gmail.com">eagle200467@gmail.com</a>)</p><p>
+
+</p><p>印第安纳大学布卢明顿分校的 XiaoFeng Wang (<a href="mailto:xw7@indiana.edu">xw7@indiana.edu</a>)</p>
+
+</div>
+
+<h2 id="2012">2012 年</h2>
+
+<div style="LINE-HEIGHT:25px;">
+
+<p><a href="https://viaforensics.com/">viaForensics</a> 的 David Weinstein (<a href="https://twitter.com/insitusec">@insitusec</a>)</p>
+
+<p><a href="http://thejh.net/">Jann Horn</a></p>
+
+<p>柏林工业大学的 Ravishankar Borgaonkari (<a href="https://twitter.com/raviborgaonkar">@raviborgaonkar</a>)</p>
+
+<p>美国国家安全局<a href="https://www.nsa.gov/research/ia_research/">可信系统研究团队</a>的 Robert Craig
+<a href="https://android-review.googlesource.com/#/q/owner:%22Robert+Craig+%253Crpcraig%2540tycho.ncsc.mil%253E%22+status:merged">
+<img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
+
+<p><a href="http://roeehay.blogspot.com/">Roee Hay</a>(<a href="https://twitter.com/roeehay">@roeehay</a>、<a href="mailto:roeehay@gmail.com">roeehay@gmail.com</a>)</p>
+
+<p>美国国家安全局<a href="https://www.nsa.gov/research/ia_research/">可信系统研究团队</a>的 Stephen Smalley
+<a href="https://android-review.googlesource.com/#/q/owner:%22Stephen+Smalley+%253Csds%2540tycho.nsa.gov%253E%22+status:merged">
+<img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
+
+<p><a href="http://www.linkedin.com/in/billcroberts">William Roberts</a> (<a href="mailto:bill.c.roberts@gmail.com">bill.c.roberts@gmail.com</a>)
+<a href="https://android-review.googlesource.com/#/q/owner:bill.c.roberts%2540gmail.com+status:merged">
+<img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
+
+</div>
+
+<h2 id="2011">2011 年</h2>
+
+<div style="LINE-HEIGHT:25px;">
+
+<p><a href="http://www.mulliner.org/collin/academic">MUlliNER.ORG</a> 的 Collin Mulliner (<a href="https://twitter.com/collinrm">@collinrm</a>)</p>
+
+</div>
+
+<h2 id="2009">2009 年</h2>
+
+<div style="LINE-HEIGHT:25px;">
+
+<p>Charlie Miller (<a href="https://twitter.com/0xcharlie">@0xcharlie</a>)</p>
+
+<p><a href="http://www.mulliner.org/collin/academic">MUlliNER.ORG</a> 的 Collin Mulliner (<a href="https://twitter.com/collinrm">@collinrm</a>)</p>
+
+</div>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/security/trusty/trusty-ref.html b/zh-cn/security/trusty/trusty-ref.html
new file mode 100644
index 00000000..4d0277cb
--- /dev/null
+++ b/zh-cn/security/trusty/trusty-ref.html
@@ -0,0 +1,962 @@
+<html devsite><head>
+ <title>Trusty API 参考</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p><a href="index.html">Trusty</a> API 描述了 Trusty 进程间通信 (IPC) 系统,包括与非安全域的通信。本页中提供了相关术语的定义以及关于 API 调用的参考内容。</p>
+
+<h2 id="ports_and_channels">端口和通道</h2>
+
+<p>Trusty 应用使用端口以具名路径的形式显示客户端连接到的服务端点。这可以提供一个非常简单且采用字符串形式的服务 ID 供客户端使用。端口采用反向 DNS 式命名惯例,例如 <code>com.google.servicename</code>。</p>
+
+<p>当客户端连接到端口时,会收到一个用于与相应服务交互的通道。相应服务必须接受外来连接;并且在接受后,也会收到一个通道。实质上,端口会被用来查找服务,以便通过一对已连接的通道(即端口上的连接实例)进行通信。当客户端连接到端口时,客户端和服务器之间会建立一个对称的双向连接。借助这种全双工路径,客户端和服务器可以交换任意消息,直到任一方决定断开连接为止。</p>
+
+<p>只有安全端可信应用或 Trusty 内核模块可以创建端口。在非安全端(普通域)运行的应用只能连接到安全端发布的服务。</p>
+
+<p>可信应用可以同时是客户端和服务器,具体取决于相关要求。发布服务的可信应用(作为服务器)可能需要连接到其他服务(作为客户端)。</p>
+
+<h2 id="handle_api">Handle API</h2>
+
+<p>句柄是表示资源(例如端口和通道)的未签名整数,与 UNIX 中的文件描述符类似。句柄创建好后,会被放入到应用专用句柄表格中,并可供以后参考引用。</p>
+
+<p>调用程序可以使用 <code>set_cookie()</code> 方法将私密数据与句柄相关联。</p>
+
+<h3 id="methods_handle_api">Handle API 中的方法</h3>
+
+<p>句柄仅在应用环境中有效。除非已明确指定,否则应用不得将句柄的值传递给其他应用。只能通过与 <code>INVALID_IPC_HANDLE #define,</code>(应用可以使用它来表明句柄无效或未设置)进行比较的方式来解译句柄的值。</p>
+
+<h4 id="set_cookie">set_cookie()</h4>
+
+<p>用于将调用程序提供的私密数据与指定句柄相关联。</p>
+
+<pre class="prettyprint">
+long set_cookie(uint32_t handle, void *cookie)
+</pre>
+
+<p>[输入] <code>handle</code>:其中一个 API 调用返回的任意句柄</p>
+
+<p>[输入] <code>cookie</code>:一个指针,指向 Trusty 应用中的任意用户空间数据</p>
+
+<p>[返回值]:如果操作成功了,则为 <code>NO_ERROR</code>;否则为 <code>&lt; 0</code> 错误代码</p>
+
+<p>处理在句柄创建一段时间后发生的事件时,此调用非常有用。事件处理机制会将相应句柄及其 Cookie 返回给事件处理程序。</p>
+
+<p>通过使用 <code>wait()</code> 或 <code>wait_any()</code> 调用,可以等待句柄上发生事件。</p>
+
+<h4 id="wait">wait()</h4>
+
+<p>用于在指定时间段内等待指定句柄上发生事件。</p>
+
+<pre class="prettyprint">
+long wait(uint32_t handle_id, uevent_t *event, unsigned long timeout_msecs)
+</pre>
+
+<p>[输入] <code>handle_id</code>:其中一个 API 调用返回的任意句柄</p>
+
+<p>[输出] <code>event</code>:一个指针,指向表示相应句柄上所发生事件的结构</p>
+
+<p>[输入] <code>timeout_msecs</code>:超时值(以毫秒计);-1 表示无限制超时</p>
+
+<p>[返回值]:如果在指定的超时间隔内发生了有效事件,则为 <code>NO_ERROR</code>;如果指定的超时时间已过,但未发生任何事件,则为 <code>ERR_TIMED_OUT</code>;如果是其他错误,则为 <code>&lt; 0</code></p>
+
+<h4 id="wait_any">wait_any()</h4>
+
+<p>用于在指定时间段内等待应用句柄表格中的任意句柄上发生任意事件。</p>
+
+<pre class="prettyprint">
+long wait_any(uevent_t *event, unsigned long timeout_msecs);
+</pre>
+
+<p>[输出] <code>event</code>:一个指针,指向表示相应句柄上所发生事件的结构</p>
+
+<p>[输入] <code>timeout_msecs</code>:超时值(以毫秒计)。-1 表示无限制超时</p>
+
+<p>[返回值]:如果在指定的超时间隔内发生了有效事件,则为 <code>NO_ERROR</code>;如果指定的超时时间已过,但未发生任何事件,则为 <code>ERR_TIMED_OUT</code>;如果是其他错误,则为 <code>&lt; 0</code></p>
+
+<p>如果操作成功了 (<code>retval == NO_ERROR</code>),<code>wait()</code> 和 <code>wait_any()</code> 调用会在指定的 <code>uevent_t</code> 结构内填入与发生的事件相关的信息。</p>
+
+<pre class="prettyprint">
+typedef struct uevent {
+ uint32_t handle; /* handle this event is related to */
+ uint32_t event; /* combination of IPC_HANDLE_POLL_XXX flags */
+ void *cookie; /* cookie associated with this handle */
+} uevent_t;
+</pre>
+
+<p><code>event</code> 字段中包含以下值的组合:</p>
+
+<pre class="prettyprint">
+enum {
+ IPC_HANDLE_POLL_NONE = 0x0,
+ IPC_HANDLE_POLL_READY = 0x1,
+ IPC_HANDLE_POLL_ERROR = 0x2,
+ IPC_HANDLE_POLL_HUP = 0x4,
+ IPC_HANDLE_POLL_MSG = 0x8,
+ IPC_HANDLE_POLL_SEND_UNBLOCKED = 0x10,
+ … more values[TBD]
+};
+</pre>
+
+<p><code>IPC_HANDLE_POLL_NONE</code> - 没有任何事件实际上在等待处理,调用程序应重新开始等待</p>
+
+<p><code>IPC_HANDLE_POLL_ERROR</code> - 发生未指定的内部错误</p>
+
+<p><code>IPC_HANDLE_POLL_READY</code> - 取决于句柄类型,具体如下:</p>
+
+<ul>
+ <li>对于端口,该值表示有待处理的连接</li><li>对于通道,该值表示已建立异步连接(请参阅 <code>connect()</code>)</li></ul>
+
+<p>以下事件仅与通道有关:</p>
+
+<ul>
+ <li><code>IPC_HANDLE_POLL_HUP</code> - 表示某个通道已被对端关闭</li><li><code>IPC_HANDLE_POLL_MSG</code> - 表示相应通道有待处理的消息</li><li><code>IPC_HANDLE_POLL_SEND_UNBLOCKED</code> - 表示之前所发消息被屏蔽的调用程序可以尝试再次发送消息(有关详情,请参阅 <code>send_msg()</code> 的说明)</li></ul>
+
+<p>由于可能同时设置了多个位,因此应使事件处理程序做好准备,以处理指定事件的组合。例如,对于通道来说,可能会在有待处理的消息时,连接被对端关闭。</p>
+
+<p>大多数事件都是粘滞事件。只要基本条件存在,它们就会一直存在(例如,所有待处理的消息都会被接收,所有待处理的连接请求都会被处理)。<code>IPC_HANDLE_POLL_SEND_UNBLOCKED</code> 事件属于例外情况:消息一旦被读取,该事件便会被立即清除,并且应用只有一次对其进行处理的机会。</p>
+
+<p>通过调用 <code>close()</code> 方法,可以销毁句柄。</p>
+
+<h4 id="close">close()</h4>
+
+<p>用于销毁与指定句柄关联的资源,并将指定句柄从句柄表格中移除。</p>
+
+<pre class="prettyprint">
+long close(uint32_t handle_id);
+</pre>
+
+<p>[输入] <code>handle_id</code>:要销毁的句柄</p>
+
+<p>[返回值]:如果操作成功了,则为 0;否则为表示错误的负数</p>
+
+<h2 id="server_api">Server API</h2>
+
+<p>服务器首先会创建一个或多个表示其服务端点的<strong>具名端口</strong>。每个端口都由一个句柄来表示。</p>
+
+<h3 id="methods_server_api">Server API 中的方法</h3>
+
+<h4 id="port_create">port_create()</h4>
+
+<p>用于创建具名服务端口。</p>
+
+<pre class="prettyprint">
+long port_create (const char *path, uint num_recv_bufs, size_t recv_buf_size,
+uint32_t flags)
+</pre>
+
+<p>[输入] <code>path</code>:端口的字符串名称(如上所述)。该名称在整个系统中必须是独一无二的;如果尝试创建重复的名称,则会失败。</p>
+
+<p>[输入] <code>num_recv_bufs</code>:相应端口上的通道可以预先分配的缓冲区(用于方便与客户端交换数据)的数量上限。对于双向传输的数据,缓冲区数量是单独计算的,因此如果在此处指定 1,则表示预先分配了 1 个发送缓冲区和 1 个接收缓冲区。一般情况下,所需的缓冲区数量取决于客户端和服务器之间更高级别的协议。如果是高度同步协议(发送消息,收到回复后再发送另一条消息),此数量最低可设为 1。不过,如果客户端希望在收到回复之前发送多条消息(例如,一条消息为前序,另一条为实际命令),则此数量可以设得高一些。缓冲区组是按通道分配的,因此两个单独的连接(通道)会分别有各自的缓冲区组。</p>
+
+<p>[输入] <code>recv_buf_size</code>:以上缓冲区组中各个缓冲区的大小上限。该值取决于具体协议,能够有效限制您可以与对端交换的消息的大小上限</p>
+
+<p>[输入] <code>flags</code>:标记组合,用于指定其他端口行为</p>
+
+<p>该值应该是以下值的组合:</p>
+
+<p><code>IPC_PORT_ALLOW_TA_CONNECT</code> - 允许来自其他安全应用的连接</p>
+
+<p><code>IPC_PORT_ALLOW_NS_CONNECT</code> - 允许来自非安全域的连接</p>
+
+<p>[返回值]:如果是非负数,则为所创建端口的句柄;如果是负数,则为具体错误</p>
+
+<p>然后,服务器会使用 <code>wait()</code> 或 <code>wait_any()</code> 调用轮询端口句柄列表,以查看是否有外来连接。收到连接请求(由 <code>uevent_t</code> 结构的 <code>event</code> 字段中设置的 <code>IPC_HANDLE_POLL_READY</code> 位来指明)时,服务器应调用 <code>accept()</code> 来完成连接建立过程,并创建一个通道(由另一个句柄表示),然后该通道即可被轮询,以查看是否有外来消息。</p>
+
+<h4 id="accept">accept()</h4>
+
+<p>用于接受外来连接,并获取通道句柄。</p>
+
+<pre class="prettyprint">
+long accept(uint32_t handle_id, uuid_t *peer_uuid);
+</pre>
+
+<p>[输入] <code>handle_id</code>:一个句柄,用于表示客户端已连接到哪个端口</p>
+
+<p>[输出] <code>peer_uuid</code>:一个指针,指向连接中客户端应用的 UUID 将填入到的 <code>uuud_t</code> 结构。如果连接源自非安全域,该指针将被设为全零</p>
+
+<p>[返回值]:如果是非负数,则为一个句柄,用于表示服务器可以通过哪个通道与客户端交换消息;否则为错误代码</p>
+
+<h2 id="client_api">Client API</h2>
+
+<p>本部分介绍了 Client API 中的方法。</p>
+
+<h3 id="methods_client_api">Client API 中的方法</h3>
+
+<h4 id="connect">connect()</h4>
+
+<p>用于发起与通过名称指定的端口的连接。</p>
+
+<pre class="prettyprint">
+long connect(const char *path, uint flags);
+</pre>
+
+<p>[输入] <code>path</code>:由 Trusty 应用发布的端口的名称</p>
+
+<p>[输入] <code>flags</code>:指定额外的可选行为</p>
+
+<p>[返回值]:一个句柄,用于表示可以通过哪个通道与服务器交换消息;如果是负数,则为错误</p>
+
+<p>如果未指定 <code>flags</code>(<code>flags</code> 参数设为 0),调用 <code>connect()</code> 会发起与指定端口的同步连接(如果指定端口不存在,会立即返回一个错误),并且会创建一个分块,直到服务器以其他方式接受某个连接为止。</p>
+
+<p>通过指定两个值的组合,可以改变这种行为,如下所述:</p>
+
+<pre class="prettyprint">
+enum {
+IPC_CONNECT_WAIT_FOR_PORT = 0x1,
+IPC_CONNECT_ASYNC = 0x2,
+};
+</pre>
+
+<p><code>IPC_CONNECT_WAIT_FOR_PORT</code> - 如果指定的端口在连接操作执行时没有立即存在,则强制 <code>connect()</code> 调用开始等待,而不是立即使连接失败。</p>
+
+<p><code>IPC_CONNECT_ASYNC</code> - 如果设置了此项,则会发起异步连接。在开始正常操作之前,应用必须先针对连接完成事件(由 <code>uevent_t</code> 结构的 event 字段中设置的 <code>IPC_HANDLE_POLL_READY</code> 位来指明)轮询是否有返回的句柄(通过调用 <code>wait()</code> 或 <code>wait_any()</code>)。</p>
+
+<h2 id="messaging_api">Messaging API</h2>
+
+<p>借助 Messaging API 调用,可以通过之前建立的连接(通道)发送和读取消息。服务器和客户端的 Messaging API 调用是相同的。</p>
+
+<p>客户端通过发出 <code>connect()</code> 调用接收通道句柄,而服务器则通过 <code>accept()</code> 调用获取通道句柄,如上所述。</p>
+
+<h4 id="structure_of_a_trusty_message">Trusty 消息的结构</h4>
+
+<p>如下所示,通过 Trusty API 交换的消息有一个极小的结构,供服务器和客户端就实际内容的语义达成一致:</p>
+
+<pre class="prettyprint">
+/*
+ * IPC message
+ */
+typedef struct iovec {
+ void *base;
+ size_t len;
+} iovec_t;
+
+typedef struct ipc_msg {
+ uint num_iov; /* number of iovs in this message */
+ iovec_t *iov; /* pointer to iov array */
+
+ uint num_handles; /* reserved, currently not supported */
+ handle_t *handles; /* reserved, currently not supported */
+} ipc_msg_t;
+</pre>
+
+<p>一条消息可以由一个或多个不连续的缓冲区(由 <code>iovec_t</code> 结构数组表示)组成。Trusty 使用 <code>iov</code> 数组以“分散-收集”的方式对这些分块执行读取和写入操作。可通过 <code>iov</code> 数组描述的缓冲区中的内容完全是任意的。</p>
+
+<h3 id="methods_messaging_api">Messaging API 中的方法</h3>
+
+<h4 id="send_msg">send_msg()</h4>
+
+<p>用于通过指定的通道发送消息。</p>
+
+<pre class="prettyprint">
+long send_msg(uint32_t handle, ipc_msg_t *msg);
+</pre>
+
+<p>[输入] <code>handle</code>:一个句柄,用于表示通过哪个通道发送消息</p>
+
+<p>[输入] <code>msg</code>:一个指针,指向描述消息的 <code>ipc_msg_t structure</code></p>
+
+<p>[返回值]:如果操作成功了,则为发送的字节总数;否则为表示错误的负数</p>
+
+<p>如果客户端(或服务器)尝试通过相应通道发送消息,但目标对端消息队列中没有空间,相应通道可能会进入所发消息被屏蔽的状态(对于简单的同步请求/回复协议,这种事情应该绝对不会发生,但在更复杂的情况下,则可能会发生)。如果返回 <code>ERR_NOT_ENOUGH_BUFFER</code> 错误代码,则表示相应通道进入了这种状态。在这种情况下,调用程序必须等待,直到对端通过以下方式释放其接收队列中的部分空间为止:检索处理情况并停用一些消息(由 <code>wait()</code> 或 <code>wait_any()</code> 调用返回的 <code>uevent_t</code> 结构的 <code>event</code> 字段中设置的 <code>IPC_HANDLE_POLL_SEND_UNBLOCKED</code> 位来指明)。</p>
+
+<h4 id="get_msg">get_msg()</h4>
+
+<p>用于获取指定通道的外来消息队列中下一条消息的</p>
+
+<p>相关元信息。</p>
+
+<pre class="prettyprint">
+long get_msg(uint32_t handle, ipc_msg_info_t *msg_info);
+</pre>
+
+<p>[输入] <code>handle</code>:一个句柄,用于表示必须在哪个通道上检索新消息</p>
+
+<p>[输出] <code>msg_info</code>:消息的信息结构,如下所述:</p>
+
+<pre class="prettyprint">
+typedef struct ipc_msg_info {
+ size_t len; /* total message length */
+ uint32_t id; /* message id */
+} ipc_msg_info_t;
+</pre>
+
+<p>在待处理的消息集中,每条消息都分配有一个独一无二的 ID,并且每条消息的总长度均已填好。如果已进行相应配置且协议允许,特定通道可以同时有多条待处理(已打开)的消息。</p>
+
+<p>[返回值]:如果操作成功了,则为 <code>NO_ERROR</code>;否则为表示错误的负数</p>
+
+<h4 id="read_msg">read_msg()</h4>
+
+<p>用于从指定偏移量处开始读取具有指定 ID 的消息的内容。</p>
+
+<pre class="prettyprint">
+long read_msg(uint32_t handle, uint32_t msg_id, uint32_t offset, ipc_msg_t
+*msg);
+</pre>
+
+<p>[输入] <code>handle</code>:一个句柄,用于表示从哪个通道读取相应消息</p>
+
+<p>[输入] <code>msg_id</code>:要读取的消息的 ID</p>
+
+<p>[输入] <code>offset</code>:偏移量,用于表示从哪里开始读取相应消息</p>
+
+<p>[输入] <code>msg</code>:一个指针,指向描述一组缓冲区的 <code>ipc_msg_t</code> 结构,外来消息数据将存入到这组缓冲区中</p>
+
+<p>[返回值]:如果操作成功了,则为 <code>dst</code> 缓冲区中存储的字节总数;否则为表示错误的负数</p>
+
+<p>可以根据需要多次调用 <code>read_msg</code> 方法,以便从不同的偏移量处(不一定依序)开始读取消息。</p>
+
+<h4 id="put_msg">put_msg()</h4>
+
+<p>用于停用具有指定 ID 的消息。</p>
+
+<pre class="prettyprint">
+long put_msg(uint32_t handle, uint32_t msg_id);
+</pre>
+
+<p>[输入] <code>handle</code>:一个句柄,用于表示相应消息已到达哪个通道</p>
+
+<p>[输入] <code>msg_id</code>:要停用的消息的 ID</p>
+
+<p>[返回值]:如果操作成功了,则为 <code>NO_ERROR</code>;否则为表示错误的负数</p>
+
+<p>消息被停用后,其中的内容将无法再访问,并且它占用的缓冲区也会被释放。</p>
+
+<h2 id="file_descriptor_api">File Descriptor API</h2>
+
+<p>File Descriptor API 包括 <code>read()</code>、<code>write()</code> 和 <code>ioctl()</code> 调用。所有这些调用都可以针对一组预定义(静态)的文件描述符(通常用一些较小的数字表示)执行相应操作。在当前的实现中,文件描述符空间与 IPC 句柄空间是分开的。Trusty 中的 File Descriptor API 与基于文件描述符的传统 API 类似。</p>
+
+<p>默认情况下,有 3 种预定义(标准的且广为人知的)的文件描述符:</p>
+
+<ul>
+ <li>0 - 标准输入文件。标准输入文件 <code>fd</code> 的默认实现是一个空操作(因为可信应用不应该有交互控制台),因此,如果要针对 <code>fd</code> 0 读取、写入或调用 <code>ioctl()</code>,则应返回 <code>ERR_NOT_SUPPORTED</code> 错误。
+ </li><li>1 - 标准输出文件。写入到标准输出文件的数据可路由(取决于 LK 调试级别)至非安全端上的 UART 和/或内存日志,具体取决于平台和配置。非关键调试日志和消息应写入到标准输出文件。<code>read()</code> 和 <code>ioctl()</code> 方法是空操作,应返回 <code>ERR_NOT_SUPPORTED</code> 错误。
+ </li><li>2 - 标准错误文件。写入到标准错误文件的数据应路由至非安全端上的 UART 或内存日志,具体取决于平台和配置。建议仅将关键消息写入到标准错误文件,这是因为该信息流很可能不受节流限制。<code>read()</code> 和 <code>ioctl()</code> 方法是空操作,应返回 <code>ERR_NOT_SUPPORTED</code> 错误。
+</li></ul>
+
+<p>虽然可以对这组文件描述符进行扩展,以实现更多 <code>fds</code>(从而实现平台专用扩展程序),但扩展文件描述符时需要非常谨慎。扩展文件描述符容易造成冲突,通常不建议这样做。</p>
+
+<h3 id="methods_file_descriptor_api">File Descriptor API 中的方法</h3>
+
+<h4 id="read">read()</h4>
+
+<p>用于尝试从指定的文件描述符读取最多 <code>count</code> 个字节的数据。</p>
+
+<pre class="prettyprint">
+long read(uint32_t fd, void *buf, uint32_t count);
+</pre>
+
+<p>[输入] <code>fd</code>:一个文件描述符,用于表示从哪里读取数据</p>
+
+<p>[输出] <code>buf</code>:一个指针,指向要将数据存入到的缓冲区</p>
+
+<p>[输入] <code>count</code>:要读取的字节数上限</p>
+
+<p>[返回值]:返回的已读取字节数;否则为表示错误的负数</p>
+
+<h4 id="write">write()</h4>
+
+<p>用于向指定的文件描述符写入最多 <code>count</code> 个字节的数据。</p>
+
+<pre class="prettyprint">
+long write(uint32_t fd, void *buf, uint32_t count);
+</pre>
+
+<p>[输入] <code>fd</code>:一个文件描述符,用于表示要将数据写入到哪里</p>
+
+<p>[输出] <code>buf</code>:一个指针,指向要写入的数据</p>
+
+<p>[输入] <code>count</code>:要写入的字节数上限</p>
+
+<p>[返回值]:返回的已写入字节数;否则为表示错误的负数</p>
+
+<h4 id="ioctl">ioctl()</h4>
+
+<p>用于针对指定的文件描述符调用指定的 <code>ioctl</code> 命令。</p>
+
+<pre class="prettyprint">
+long ioctl(uint32_t fd, uint32_t cmd, void *args);
+</pre>
+
+<p>[输入] <code>fd</code>:一个文件描述符,用于表示针对哪个对象调用 <code>ioctl()</code></p>
+
+<p>[输入] <code>cmd</code>:<code>ioctl</code> 命令</p>
+
+<p>[in/out] <code>args</code>:一个指向 <code>ioctl()</code> 参数的指针</p>
+
+<h2 id="miscellaneous_api">Miscellaneous API</h2>
+
+<h3 id="methods_misc_api">Miscellaneous API 中的方法</h3>
+
+<h4 id="gettime">gettime()</h4>
+
+<p>用于返回当前系统时间(以纳秒计)。</p>
+
+<pre class="prettyprint">
+long gettime(uint32_t clock_id, uint32_t flags, uint64_t *time);
+</pre>
+
+<p>[输入] <code>clock_id</code>:取决于平台;默认情况下,传递的值为 0</p>
+
+<p>[输入] <code>flags</code>:保留项,应为 0</p>
+
+<p>[输入] <code>time</code>:一个指针,指向要将当前时间存入到的位置对应的 <code>int64_t</code> 值</p>
+
+<p>[返回值]:如果操作成功了,则为 <code>NO_ERROR</code>;否则为表示错误的负数</p>
+
+<h4 id="nanosleep">nanosleep()</h4>
+
+<p>用于使调用应用的操作暂停执行指定的一段时间,并在这段时间过去之后恢复执行操作。</p>
+
+<pre class="prettyprint">
+long nanosleep(uint32_t clock_id, uint32_t flags, uint64_t sleep_time)
+</pre>
+
+<p>[输入] <code>clock_id</code>:保留项,应为 0</p>
+
+<p>[输入] <code>flags</code>:保留项,应为 0</p>
+
+<p>[输入] <code>sleep_time</code>:休眠时间(以纳秒计)</p>
+
+<p>[返回值]:如果操作成功了,则为 <code>NO_ERROR</code>;否则为表示错误的负数</p>
+
+<h2 id="example_of_a_trusted_application_server">可信应用服务器示例</h2>
+
+<p>以下示例应用展示了上述 API 的用法。该示例会创建一项“回传”服务,该服务可处理多个外来连接,并会将从位于安全端或非安全端的客户端收到的所有消息回传给调用程序。</p>
+
+<pre class="prettyprint">
+#include &lt;assert.h&gt;
+#include &lt;err.h&gt;
+#include &lt;stddef.h&gt;
+#include &lt;stdio.h&gt;
+#include &lt;stdlib.h&gt;
+#include &lt;string.h&gt;
+#include &lt;trusty_std.h&gt;
+
+#include &lt;app/echo/uuids.h&gt;
+
+#define LOG_TAG "echo_srv"
+
+#define TLOGE(fmt, ...) \
+ fprintf(stderr, "%s: %d: " fmt, LOG_TAG, __LINE__, ## __VA_ARGS__)
+
+#define MAX_ECHO_MSG_SIZE 64
+
+static const char *srv_name = "com.android.echo.srv.echo";
+
+static uint8_t msg_buf[MAX_ECHO_MSG_SIZE];
+
+/*
+ * Message handler
+ */
+static int handle_msg(handle_t chan)
+{
+ int rc;
+ iovec_t iov;
+ ipc_msg_t msg;
+ ipc_msg_info_t msg_inf;
+
+ iov.base = msg_buf;
+ iov.len = sizeof(msg_buf);
+
+ msg.num_iov = 1;
+ msg.iov = &amp;iov;
+ msg.num_handles = 0;
+ msg.handles = NULL;
+
+ /* get message info */
+ rc = get_msg(chan, &amp;msg_inf);
+ if (rc == ERR_NO_MSG)
+ return NO_ERROR; /* no new messages */
+
+ if (rc != NO_ERROR) {
+ TLOGE("failed (%d) to get_msg for chan (%d)\n",
+ rc, chan);
+ return rc;
+ }
+
+ /* read msg content */
+ rc = read_msg(chan, msg_inf.id, 0, &amp;msg);
+ if (rc &lt; 0) {
+ TLOGE("failed (%d) to read_msg for chan (%d)\n",
+ rc, chan);
+ return rc;
+ }
+
+ /* update number of bytes received */
+ iov.len = (size_t) rc;
+
+ /* send message back to the caller */
+ rc = send_msg(chan, &amp;msg);
+ if (rc &lt; 0) {
+ TLOGE("failed (%d) to send_msg for chan (%d)\n",
+ rc, chan);
+ return rc;
+ }
+
+ /* retire message */
+ rc = put_msg(chan, msg_inf.id);
+ if ( rc != NO_ERROR) {
+ TLOGE("failed (%d) to put_msg for chan (%d)\n",
+ rc, chan);
+ return rc;
+ }
+
+ return NO_ERROR;
+}
+
+/*
+ * Channel event handler
+ */
+static void handle_channel_event(const uevent_t *ev)
+{
+ int rc;
+
+ if (ev-&gt;event &amp; IPC_HANDLE_POLL_MSG) {
+ rc = handle_msg(ev-&gt;handle);
+ if (rc != NO_ERROR) {
+ /* report an error and close channel */
+ TLOGE("failed (%d) to handle event on channel %d\n",
+ rc, ev-&gt;handle);
+ close(ev-&gt;handle);
+ }
+ return;
+ }
+ if (ev-&gt;event &amp; IPC_HANDLE_POLL_HUP) {
+ /* closed by peer. */
+ close(ev-&gt;handle);
+ return;
+ }
+}
+
+/*
+ * Port event handler
+ */
+static void handle_port_event(const uevent_t *ev)
+{
+ uuid_t peer_uuid;
+
+ if ((ev-&gt;event &amp; IPC_HANDLE_POLL_ERROR) ||
+ (ev-&gt;event &amp; IPC_HANDLE_POLL_HUP) ||
+ (ev-&gt;event &amp; IPC_HANDLE_POLL_MSG) ||
+ (ev-&gt;event &amp; IPC_HANDLE_POLL_SEND_UNBLOCKED)) {
+ /* should never happen with port handles */
+ TLOGE("error event (0x%x) for port (%d)\n",
+ ev-&gt;event, ev-&gt;handle);
+ abort();
+ }
+ if (ev-&gt;event &amp; IPC_HANDLE_POLL_READY) {
+ /* incoming connection: accept it */
+ int rc = accept(ev-&gt;handle, &amp;peer_uuid);
+ if (rc &lt; 0) {
+ TLOGE("failed (%d) to accept on port %d\n",
+ rc, ev-&gt;handle);
+ return;
+ }
+ }
+}
+
+/*
+ * Main application entry point
+ */
+int main(void)
+{
+ int rc;
+ handle_t port;
+
+ /* Initialize service */
+ rc = port_create(srv_name, 1, MAX_ECHO_MSG_SIZE,
+ IPC_PORT_ALLOW_NS_CONNECT |
+ IPC_PORT_ALLOW_TA_CONNECT );
+ if (rc &lt; 0) {
+ TLOGE("Failed (%d) to create port %s\n",
+ rc, srv_name);
+ abort();
+ }
+ port = (handle_t)rc;
+
+ /* enter main event loop */
+ while (true) {
+ uevent_t ev;
+
+ ev.handle = INVALID_IPC_HANDLE;
+ ev.event = 0;
+ ev.cookie = NULL;
+
+ /* wait forever */
+ rc = wait_any(&amp;ev, -1);
+ if (rc == NO_ERROR) {
+ /* got an event */
+ if (ev.handle == port) {
+ handle_port_event(&amp;ev);
+ } else {
+ handle_channel_event(&amp;ev);
+ }
+ } else {
+ TLOGE("wait_any returned (%d)\n", rc);
+ abort();
+ }
+ }
+ return 0;
+}
+</pre>
+
+<h2 id="example_of_a_trusted_application_client">可信应用客户端示例</h2>
+
+<p>以下代码段展示了如何使用 Trusty Messaging API 来实现“回传”服务(请参见上述代码)的客户端。<code>sync_connect()</code> 方法显示了如何在异步 <code>connect()</code> 调用之上实现设有超时的同步连接。</p>
+
+<pre class="prettyprint">
+/*
+ * Local wrapper on top of an async connect that provides a
+ * synchronous connect with timeout.
+ */
+int sync_connect(const char *path, uint timeout)
+{
+ int rc;
+ uevent_t evt;
+ handle_t chan;
+
+ rc = connect(path, IPC_CONNECT_ASYNC | IPC_CONNECT_WAIT_FOR_PORT);
+ if (rc &gt;= 0) {
+ chan = (handle_t) rc;
+ rc = wait(chan, &amp;evt, timeout);
+ if (rc == 0) {
+ rc = ERR_BAD_STATE;
+ if (evt.handle == chan) {
+ if (evt.event &amp; IPC_HANDLE_POLL_READY)
+ return chan;
+ if (evt.event &amp; IPC_HANDLE_POLL_HUP)
+ rc = ERR_CHANNEL_CLOSED;
+ }
+ }
+ close(chan);
+ }
+ return rc;
+}
+</pre>
+
+<p><code>run_end_to_end_msg_test()</code> 方法可向“回传”服务异步发送 10000 条消息并处理回复。</p>
+
+<pre class="prettyprint">
+static int run_echo_test(void)
+{
+ int rc;
+ handle_t chan;
+ uevent_t uevt;
+ uint8_t tx_buf[64];
+ uint8_t rx_buf[64];
+ ipc_msg_info_t inf;
+ ipc_msg_t tx_msg;
+ iovec_t tx_iov;
+ ipc_msg_t rx_msg;
+ iovec_t rx_iov;
+
+ /* prepare tx message buffer */
+ tx_iov.base = tx_buf;
+ tx_iov.len = sizeof(tx_buf);
+ tx_msg.num_iov = 1;
+ tx_msg.iov = &amp;tx_iov;
+ tx_msg.num_handles = 0;
+ tx_msg.handles = NULL;
+
+ memset (tx_buf, 0x55, sizeof(tx_buf));
+
+ /* prepare rx message buffer */
+ rx_iov.base = rx_buf;
+ rx_iov.len = sizeof(rx_buf);
+ rx_msg.num_iov = 1;
+ rx_msg.iov = &amp;rx_iov;
+ rx_msg.num_handles = 0;
+ rx_msg.handles = NULL;
+
+ /* open connection to echo service */
+ rc = sync_connect(srv_name, 1000);
+ if(rc &lt; 0)
+ return rc;
+
+ /* got channel */
+ chan = (handle_t)rc;
+
+ /* send/receive 10000 messages asynchronously. */
+ uint tx_cnt = 10000;
+ uint rx_cnt = 10000;
+
+ while (tx_cnt || rx_cnt) {
+ /* send messages until all buffers are full */
+while (tx_cnt) {
+ rc = send_msg(chan, &amp;tx_msg);
+ if (rc == ERR_NOT_ENOUGH_BUFFER)
+ break; /* no more space */
+ if (rc != 64) {
+ if (rc &gt; 0) {
+ /* incomplete send */
+ rc = ERR_NOT_VALID;
+}
+ goto abort_test;
+}
+ tx_cnt--;
+ }
+
+ /* wait for reply msg or room */
+ rc = wait(chan, &amp;uevt, 1000);
+ if (rc != NO_ERROR)
+ goto abort_test;
+
+ /* drain all messages */
+ while (rx_cnt) {
+ /* get a reply */
+ rc = get_msg(chan, &amp;inf);
+ if (rc == ERR_NO_MSG)
+ break; /* no more messages */
+ if (rc != NO_ERROR)
+goto abort_test;
+
+ /* read reply data */
+ rc = read_msg(chan, inf.id, 0, &amp;rx_msg);
+ if (rc != 64) {
+ /* unexpected reply length */
+ rc = ERR_NOT_VALID;
+ goto abort_test;
+}
+
+ /* discard reply */
+ rc = put_msg(chan, inf.id);
+ if (rc != NO_ERROR)
+ goto abort_test;
+ rx_cnt--;
+ }
+}
+
+abort_test:
+ close(chan);
+ return rc;
+}
+</pre>
+
+<h2 id="non-secure_world_apis_and_applications">非安全域 API 及应用</h2>
+
+<p>在非安全端运行的内核和用户空间程序可访问从安全端发布且标有 <code>IPC_PORT_ALLOW_NS_CONNECT</code> 属性的一组 Trusty 服务。</p>
+
+<p>非安全端上的执行环境(内核和用户空间)与安全端上的执行环境截然不同。因此,这两种环境使用的不是一个库,而是使用了两组不同的 API。在内核中,Client API 由 Trusty-IPC 内核驱动程序提供,并会注册一个字符设备节点,用户空间进程可使用该节点与在安全端上运行的服务通信。</p>
+
+<h3 id="user_space_trusty_ipc_client_api">用户空间 Trusty IPC Client API</h3>
+
+<p>用户空间 Trusty IPC Client API 库是设备节点 <code>fd</code> 之上的一个薄层。</p>
+
+<p>通过调用 <code>tipc_connect()</code>(用于初始化与指定 Trusty 服务的连接),用户空间程序可启动通信会话。在内部,<code>tipc_connect()</code> 调用会打开一个指定的设备节点以获取文件描述符,并且会发起 <code>TIPC_IOC_CONNECT ioctl()</code> 调用,其中的 <code>argp</code> 参数指向一个字符串,该字符串中包含要连接的服务名称。</p>
+
+<pre class="prettyprint">
+#define TIPC_IOC_MAGIC 'r'
+#define TIPC_IOC_CONNECT _IOW(TIPC_IOC_MAGIC, 0x80, char *)
+</pre>
+
+<p>获取的文件描述符只能用于与创建该文件描述符时所针对的服务进行通信。当不再需要相应连接时,应通过调用 <code>tipc_close()</code> 关闭该文件描述符。</p>
+
+<p>通过 <code>tipc_connect()</code> 调用获取的文件描述符相当于典型的字符设备节点;该文件描述符符合以下条件:</p>
+
+<ul>
+ <li>可以根据需要切换到非屏蔽模式</li><li>可以在其中写入数据,以使用标准 <code>write()</code> 调用向另一端发送消息</li><li>可以像对常规文件描述符一样对其进行轮询(使用 <code>poll()</code> 调用或 <code>select()</code> 调用),以查看是否有外来消息</li><li>可以读取其中的数据,以检索外来消息</li></ul>
+
+<p>调用程序通过针对指定 <code>fd</code> 执行写入调用操作向 Trusty 服务发送消息。Trusty-IPC 驱动程序会将传递到上述 <code>write()</code> 调用的所有数据转换成一条消息。该消息会被传送至安全端,然后 Trusty 内核中的 IPC 子系统会对消息数据进行处理,处理后的数据将路由至适当的目的地,并作为特定通道句柄上的 <code>IPC_HANDLE_POLL_MSG</code> 事件传送至应用事件循环。根据特定的服务专用协议,Trusty 服务可能会发送一条或多条回复消息,这些消息会被传送回非安全端,并被放入到适当的通道文件描述符消息队列中,以供用户空间应用 <code>read()</code> 调用检索。</p>
+
+<h4 id="tipc_connect">tipc_connect()</h4>
+
+<p>用于打开指定的 <code>tipc</code> 设备节点并发起与指定 Trusty 服务的连接。</p>
+
+<pre class="prettyprint">
+int tipc_connect(const char *dev_name, const char *srv_name);
+</pre>
+
+<p>[输入] <code>dev_name</code>:要打开的 Trusty IPC 设备节点的路径</p>
+
+<p>[输入] <code>srv_name</code>:要连接的已发布 Trusty 服务的名称</p>
+
+<p>[返回值]:如果操作成功了,则为有效的文件描述符;否则为 -1。</p>
+
+<h4 id="tipc_close">tipc_close()</h4>
+
+<p>用于终止与通过文件描述符指定的 Trusty 服务的连接。</p>
+
+<pre class="prettyprint">
+int tipc_close(int fd);
+</pre>
+
+<p>[输入] <code>fd</code>:之前通过 <code>tipc_connect()</code> 调用打开的文件描述符</p>
+
+<h2 id="kernel_trusty_ipc_client_api">内核 Trusty IPC Client API</h2>
+
+<p>内核 Trusty IPC Client API 适用于内核驱动程序。用户空间 Trusty IPC API 在该 API 之上实现。</p>
+
+<p>一般情况下,该 API 的典型用法包括以下步骤:调用程序使用 <code>tipc_create_channel()</code> 函数创建一个 <code>struct tipc_chan</code> 对象,然后使用 <code>tipc_chan_connect()</code> 调用发起与在安全端上运行的 Trusty IPC 服务的连接。通过调用 <code>tipc_chan_shutdown()</code> 可终止与远程端的连接,随后调用 <code>tipc_chan_destroy()</code> 可清除资源。</p>
+
+<p>通过 <code>handle_event()</code> 回调收到已成功建立连接的通知后,调用程序会执行以下操作:</p>
+
+<ul>
+ <li>使用 <code>tipc_chan_get_txbuf_timeout()</code> 调用获取消息缓冲区</li><li>撰写消息</li><li>使用 <code>tipc_chan_queue_msg()</code> 方法将消息加入队列,以将其传送至相应通道连接的 Trusty 服务(位于安全端)</li></ul>
+
+<p>消息成功加入队列后,调用程序应取消保存消息缓冲区,因为在处理消息后,消息缓冲区最终会由远程端恢复为可用缓冲区池(供其他消息以后重复使用)。如果未能将此类缓冲区加入队列,或不再需要此类缓冲区,用户只需调用 <code>tipc_chan_put_txbuf()</code> 即可。</p>
+
+<p>通过处理 <code>handle_msg()</code> 通知回调(在 Trusty-IPC <code>rx</code> 工作队列环境中调用,用于提供一个指向 <code>rx</code> 缓冲区的指针,该缓冲区中包含要处理的外来消息),API 用户可从远程端接收消息。</p>
+
+<p><code>handle_msg()</code> 回调实现应返回一个指向有效 <code>struct tipc_msg_buf</code> 的指针。如果相应消息缓冲区在本地处理并且以后不再需要,那么它可以与外来消息缓冲区相同。或者,如果外来消息缓冲区已加入队列以接受进一步处理,那么相应缓冲区可以是通过 <code>tipc_chan_get_rxbuf()</code> 调用获取的新缓冲区。必须对单独的 <code>rx</code> 缓冲区进行跟踪,并在不再需要此类缓冲区时使用 <code>tipc_chan_put_rxbuf()</code> 调用最终将其释放。</p>
+
+<h3 id="methods_ktic_api">内核 Trusty IPC Client API 中的方法</h3>
+
+<h4 id="tipc_create_channel">tipc_create_channel()</h4>
+
+<p>用于针对特定 Trusty-IPC 设备创建并配置 Trusty IPC 通道实例。</p>
+
+<pre class="prettyprint">
+struct tipc_chan *tipc_create_channel(struct device *dev,
+ const struct tipc_chan_ops *ops,
+ void *cb_arg);
+</pre>
+
+<p>[输入] <code>dev</code>:一个指针,指向创建相应设备通道时所针对的 Trusty-IPC</p>
+
+<p>[输入] <code>ops</code>:一个指针,指向已填入调用程序专用回调的 <code>struct tipc_chan_ops</code></p>
+
+<p>[输入] <code>cb_arg</code>:一个指针,指向将传递到 <code>tipc_chan_ops</code> 回调的数据</p>
+
+<p>[返回值]:如果操作成功了,则为指向新创建的 <code>struct tipc_chan</code> 实例的指针;否则为 <code>ERR_PTR(err)</code></p>
+
+<p>一般情况下,当相应活动发生时,调用程序必须提供两个异步发起的回调。</p>
+
+<p>发起 <code>void (*handle_event)(void *cb_arg, int event)</code> 事件,以便让调用程序知道通道状态发生的变化。</p>
+
+<p>[输入] <code>cb_arg</code>:一个指针,指向传递到 <code>tipc_create_channel()</code> 调用的数据</p>
+
+<p>[输入] <code>event</code>:可以是以下任一值的事件:</p>
+
+<ul>
+ <li><code>TIPC_CHANNEL_CONNECTED</code> - 表示成功连接到远程端</li><li><code>TIPC_CHANNEL_DISCONNECTED</code> - 表示远程端拒绝了新的连接请求或请求与之前连接的通道断开连接</li><li><code>TIPC_CHANNEL_SHUTDOWN</code> - 表示远程端正在关闭,将永久终止所有连接</li></ul>
+
+<p>发起 <code>struct tipc_msg_buf *(*handle_msg)(void *cb_arg, struct tipc_msg_buf *mb)</code> 回调,以便提供关于通过指定通道收到了一条新消息的通知。</p>
+
+<ul>
+ <li>[输入] <code>cb_arg</code>:一个指针,指向传递到 <code>tipc_create_channel()</code> 调用的数据</li><li>[输入] <code>mb</code>:一个指针,指向描述外来消息的 <code>struct tipc_msg_buf</code></li><li>[返回值]:回调实现应返回一个指向 <code>struct tipc_msg_buf</code> 的指针。如果相应消息在本地处理并且以后不再需要,那么该指针可以与 <code>mb</code> 参数收到的指针相同(或者,它可以是通过 <code>tipc_chan_get_rxbuf()</code> 调用获取的新缓冲区)</li></ul>
+
+<h4 id="tipc_chan_connect">tipc_chan_connect()</h4>
+
+<p>用于发起与指定 Trusty IPC 服务的连接。</p>
+
+<pre class="prettyprint">
+int tipc_chan_connect(struct tipc_chan *chan, const char *port);
+</pre>
+
+<p>[输入] <code>chan</code>:一个指针,指向通过 <code>tipc_create_chan()</code> 调用返回的通道</p>
+
+<p>[输入] <code>port</code>:一个指针,指向包含要连接的服务名称的字符串</p>
+
+<p>[返回值]:如果操作成功了,则为 0;否则为表示错误的负数</p>
+
+<p>调用程序会在连接建立后收到通知(收到 <code>handle_event</code> 回调)。</p>
+
+<h4 id="tipc_chan_shutdown">tipc_chan_shutdown()</h4>
+
+<p>用于终止与之前通过 <code>tipc_chan_connect()</code> 调用发起的与 Trusty IPC 服务的连接。</p>
+
+<pre class="prettyprint">
+int tipc_chan_shutdown(struct tipc_chan *chan);
+</pre>
+
+<p>[输入] <code>chan</code>:一个指针,指向通过 <code>tipc_create_chan()</code> 调用返回的通道</p>
+
+<h4 id="tipc_chan_destroy">tipc_chan_destroy()</h4>
+
+<p>用于销毁指定的 Trusty IPC 通道。</p>
+
+<pre class="prettyprint">
+void tipc_chan_destroy(struct tipc_chan *chan);
+</pre>
+
+<p>[输入] <code>chan</code>:一个指针,指向通过 <code>tipc_create_chan()</code> 调用返回的通道</p>
+
+<h4 id="tipc_chan_get_txbuf_timeout">tipc_chan_get_txbuf_timeout()</h4>
+
+<p>用于获取通过指定通道发送数据时可以使用的消息缓冲区。如果相应缓冲区无法立即进入可用状态,调用程序可能会在指定的超时(以毫秒计)期间被屏蔽。</p>
+
+<pre class="prettyprint">
+struct tipc_msg_buf *
+tipc_chan_get_txbuf_timeout(struct tipc_chan *chan, long timeout);
+</pre>
+
+<p>[输入] <code>chan</code>:一个指针,指向要将消息加入到的队列所属的通道</p>
+
+<p>[输入] <code>chan</code>:<code>tx</code> 缓冲区可用之前等待的超时上限</p>
+
+<p>[返回值]:如果操作成功了,则为有效的消息缓冲区;如果出现错误,则为 <code>ERR_PTR(err)</code></p>
+
+<h4 id="tipc_chan_queue_msg">tipc_chan_queue_msg()</h4>
+
+<p>用于将要通过指定的 Trusty IPC 通道发送的消息加入到队列。</p>
+
+<pre class="prettyprint">
+int tipc_chan_queue_msg(struct tipc_chan *chan, struct tipc_msg_buf *mb);
+</pre>
+
+<p>[输入] <code>chan</code>:一个指针,指向要将消息加入到的队列所属的通道</p>
+
+<p>[输入] <code>mb:</code> 一个通过 <code>tipc_chan_get_txbuf_timeout()</code> 调用获取的指针,指向要加入到队列的消息</p>
+
+<p>[返回值]:如果操作成功了,则为 0;否则为表示错误的负数</p>
+
+<h4 id="tipc_chan_put_txbuf">tipc_chan_put_txbuf()</h4>
+
+<p>用于释放之前通过 <code>tipc_chan_get_txbuf_timeout()</code> 调用获取的指定 <code>Tx</code> 消息缓冲区。</p>
+
+<pre class="prettyprint">
+void tipc_chan_put_txbuf(struct tipc_chan *chan,
+ struct tipc_msg_buf *mb);
+</pre>
+
+<p>[输入] <code>chan</code>:一个指针,指向相应消息缓冲区所属的通道</p>
+
+<p>[输入] <code>mb</code>:一个指针,指向要释放的消息缓冲区</p>
+
+<p>[返回值]:无</p>
+
+<h4 id="tipc_chan_get_rxbuf">tipc_chan_get_rxbuf()</h4>
+
+<p>用于获取通过指定通道接收消息时可以使用的消息缓冲区。</p>
+
+<pre class="prettyprint">
+struct tipc_msg_buf *tipc_chan_get_rxbuf(struct tipc_chan *chan);
+</pre>
+
+<p>[输入] <code>chan</code>:一个指针,指向相应消息缓冲区所属的通道</p>
+
+<p>[返回值]:如果操作成功了,则为有效的消息缓冲区;如果出现错误,则返回 <code>ERR_PTR(err)</code></p>
+
+<h4 id="tipc_chan_put_rxbuf">tipc_chan_put_rxbuf()</h4>
+
+<p>用于释放之前通过 <code>tipc_chan_get_rxbuf()</code> 调用获取的指定消息缓冲区。</p>
+
+<pre class="prettyprint">
+void tipc_chan_put_rxbuf(struct tipc_chan *chan,
+ struct tipc_msg_buf *mb);
+</pre>
+
+<p>[输入] <code>chan</code>:一个指针,指向相应消息缓冲区所属的通道</p>
+
+<p>[输入] <code>mb</code>:一个指针,指向要释放的消息缓冲区</p>
+
+<p>[返回值]:无</p>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/64-bit-builds.html b/zh-cn/source/64-bit-builds.html
new file mode 100644
index 00000000..7f042a08
--- /dev/null
+++ b/zh-cn/source/64-bit-builds.html
@@ -0,0 +1,155 @@
+<html devsite><head>
+ <title>了解 64 位版本</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<h2 id="overview">概览</h2>
+
+<p>从编译系统的角度来看,最显著的变化是现可支持在一次编译中为两种目标 CPU 架构(64 位和 32 位)编译二进制文件。这也称为“多库编译”。<em></em></p>
+
+<p>对于本机静态库和共享库,编译系统设置了为两种架构编译二进制文件的规则。产品配置 (<code>PRODUCT_PACKAGES</code>) 与依赖关系图共同决定了编译哪些二进制文件并安装到系统映像中。</p>
+
+<p>对于可执行文件和应用,编译系统默认仅编译 64 位版本,但您可以使用一个全局 <code>BoardConfig.mk</code> 变量或针对特定模块的变量来替换此设置。</p>
+
+<p class="caution"><strong>注意</strong>:如果某个应用向其他 32 位或 64 位的应用公开一个 API,那么该应用必须在其清单中将 <code>android:multiarch</code> 属性的值设为 <code>true</code>,以避免可能出现的错误。</p>
+
+<h2 id="product_configuration">产品配置</h2>
+
+<p>在 <code>BoardConfig.mk</code> 中,我们添加了以下变量来配置第二个 CPU 架构和 ABI:</p>
+
+<pre class="prettyprint">
+TARGET_2ND_ARCH
+TARGET_2ND_ARCH_VARIANT
+TARGET_2ND_CPU_VARIANT
+TARGET_2ND_CPU_ABI
+TARGET_2ND_CPU_ABI2
+</pre>
+
+<p>您可以在 <code>build/target/board/generic_arm64/BoardConfig.mk</code> 中查看示例。</p>
+
+<p>如果您希望编译系统默认编译 32 位可执行文件和应用,请设置以下变量:</p>
+
+<pre class="prettyprint">
+TARGET_PREFER_32_BIT := true
+</pre>
+
+<p>不过,您可以在 <code>Android.mk</code> 中使用针对特定模块的变量来替换此设置。</p>
+
+<p>在多库编译中,<code>PRODUCT_PACKAGES</code> 中的模块名称同时涵盖了 32 位和 64 位二进制文件,只要这些名称是由编译系统定义的。对于通过依赖关系提取而来的库,只有在另一个 32 位库或可执行文件要求使用时,系统才会安装 32 位库。64 位库也遵循同样的规则。</p>
+
+<p>但是,<code>make</code> 命令行中的模块名称仅涵盖 64 位版本。例如,在运行 <code>lunch
+aosp_arm64-eng</code> 之后,<code>make libc</code> 仅编译 64 位库。要编译 32 位库,您需要运行 <code>make libc_32</code>。</p>
+
+<h2 id="module_definition_in_android_mk">Android.mk 中的模块定义</h2>
+
+<p>您可以使用 <code>LOCAL_MULTILIB</code> 变量来配置您是要编译 32 位还是 64 位架构,或是同时编译二者,并可以替换全局 <code>TARGET_PREFER_32_BIT</code> 变量。</p>
+
+<p>将 <code>LOCAL_MULTILIB</code> 设为以下任一值:</p>
+
+<ul>
+ <li>“both”(二者):同时编译 32 位和 64 位架构。</li>
+ <li>“32”:仅编译 32 位架构。</li>
+ <li>“64”:仅编译 64 位架构。</li>
+ <li>“first”(第一个):仅编译第一个架构(在 32 位设备中编译 32 位架构,在 64 位设备中编译 64 位架构)。</li>
+ <li>“”:默认值;编译系统根据模块类和其他 <code>LOCAL_</code> 变量(如 <code>LOCAL_MODULE_TARGET_ARCH</code>、<code>LOCAL_32_BIT_ONLY</code> 等)决定要编译哪种架构。</li>
+</ul>
+
+<p>在多库编译中,<code>ifeq $(TARGET_ARCH)</code> 等条件不再起作用。</p>
+
+<p>如果您想为某些特定架构编译模块,以下变量可为您提供帮助:</p>
+
+<ul>
+ <li><code>LOCAL_MODULE_TARGET_ARCH</code><br />该变量可设为一个架构列表,类似于“arm x86 arm64”。只有正在编译的架构位于该列表中,编译系统才会添加当前模块。</li>
+
+ <li><code>LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH</code><br /><code>LOCAL_MODULE_TARGET_ARCH</code> 的相反变量。只有正在编译的架构不在相应列表中,编译系统才会添加当前模块。</li>
+</ul>
+
+<p>上述两个变量有两个小变体:</p>
+
+<ul>
+ <li><code>LOCAL_MODULE_TARGET_ARCH_WARN</code></li>
+ <li><code>LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH_WARN</code></li>
+</ul>
+
+<p>如果当前模块由于架构受到这两个变量的限制而被跳过,编译系统将发出警告。</p>
+
+<p>要设置针对特定架构的编译标记,请使用针对特定架构的 <code>LOCAL_</code> 变量。针对特定架构的 <code>LOCAL_</code> 变量由普通 <code>LOCAL_</code> 变量加架构后缀构成,例如:</p>
+
+<ul>
+ <li> <code>LOCAL_SRC_FILES_arm, LOCAL_SRC_FILES_x86,</code>
+ </li><li> <code>LOCAL_CFLAGS_arm, LOCAL_CFLAGS_arm64,</code>
+ </li><li> <code>LOCAL_LDFLAGS_arm, LOCAL_LDFLAGS_arm64,</code>
+</li></ul>
+
+<p>只有当前正在为相应架构编译二进制文件时,才能使用这些变量。</p>
+
+<p>有时,根据当前正在为 32 位还是 64 位架构编译二进制文件来设置标记会更方便。在这种情况下,您可以使用带有 <code>_32</code> 或 <code>_64</code> 后缀的 <code>LOCAL_</code> 变量,例如:</p>
+
+<ul>
+ <li> <code>LOCAL_SRC_FILES_32, LOCAL_SRC_FILES_64,</code>
+ </li><li> <code>LOCAL_CFLAGS_32, LOCAL_CFLAGS_64,</code>
+ </li><li> <code>LOCAL_LDFLAGS_32, LOCAL_LDFLAGS_64,</code>
+</li></ul>
+
+<p>请注意,并非所有 <code>LOCAL_</code> 变量都支持针对特定架构的变体。如需了解此类变量的最新列表,请参阅 <code>build/core/clear_vars.mk</code>。</p>
+
+<h2 id="install_path">安装路径</h2>
+
+<p>在过去,您可以使用 <code>LOCAL_MODULE_PATH</code> 将库安装到默认位置以外的位置。例如:<code>LOCAL_MODULE_PATH :=
+$(TARGET_OUT_SHARED_LIBRARIES)/hw</code>。</p>
+
+<p>在多库编译中,请改用 <code>LOCAL_MODULE_RELATIVE_PATH</code>:</p>
+
+<pre class="prettyprint">
+LOCAL_MODULE_RELATIVE_PATH := hw
+</pre>
+
+<p>这样就可以将 64 位和 32 位库安装到正确的位置。</p>
+
+<p>如果您要将某个可执行文件编译为同时适用于 32 位和 64 位架构,则需要使用以下变量之一来区分安装路径:</p>
+
+<ul>
+ <li><code>LOCAL_MODULE_STEM_32, LOCAL_MODULE_STEM_64</code><br />指定已安装文件的名称。
+ </li><li><code>LOCAL_MODULE_PATH_32, LOCAL_MODULE_PATH_64</code><br />指定安装路径。
+</li></ul>
+
+<h2 id="generated_sources">生成的源代码</h2>
+
+<p>在多库编译中,在 <code>$(local-intermediates-dir)</code>(或通过明确的变量在 <code>$(intermediates-dir-for)
+</code> 中生成)中生成源代码文件这种方法会变得不再可靠。这是因为 32 位和 64 位版本都需要用到中间目录中生成的源代码,而 <code>$(local-intermediates-dir)</code> 仅指向两个中间目录中的一个。</p>
+
+<p>值得高兴的是,编译系统现在提供了一个适合多库编译的、用于生成源代码的专用中间目录。您可以调用 <code>
+$(local-generated-sources-dir)</code> 或 <code>$(generated-sources-dir-for)</code> 来获取该目录的路径。它们的用法与 <code>$(local-intermediates-dir)</code> 和 <code>$(intermediates-dir-for)</code> 类似。</p>
+
+<p>如果源代码文件在新的专用目录中生成并由 <code>LOCAL_GENERATED_SOURCES</code> 调用,那么就意味着它在多库编译中是同时为 32 位和 64 位架构编译的。</p>
+
+<h2 id="prebuilts">预编译</h2>
+
+<p>在多库编译中,您无法使用 <code>TARGET_ARCH</code>(或加上 <code>TARGET_2ND_ARCH</code>)来告知编译系统,预编译的二进制文件是以哪种架构为目标。请改用上述 <code>LOCAL_</code> 变量 <code>LOCAL_MODULE_TARGET_ARCH</code> 或 <code>LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH</code>。</p>
+
+<p>利用这些变量,即使编译系统目前正在进行 64 位多库编译,也可以选择对应的 32 位预编译二进制文件。</p>
+
+<p>如果您想使用所选的架构来计算预编译二进制文件的源路径,则可以调用<code> $(get-prebuilt-src-arch)</code>。</p>
+
+<h2 id="dex-preopt">Dex-preopt</h2>
+
+<p>对于 64 位设备,我们会默认为启动映像及任何 Java 库同时生成 32 位和 64 位 odex 文件。对于 APK,我们默认仅为主要的 64 位架构生成 odex。如果某个应用将同时在 32 位和 64 位进程中启动,请使用 <code>LOCAL_MULTILIB := both</code> 确保同时生成 32 位和 64 位 odex 文件。该标记还会指示编译系统同时添加 32 位和 64 位 JNI 库(如果应用中包含任何此类库)。</p>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/add-device.html b/zh-cn/source/add-device.html
new file mode 100644
index 00000000..4bdb2466
--- /dev/null
+++ b/zh-cn/source/add-device.html
@@ -0,0 +1,290 @@
+<html devsite><head>
+ <title>添加新设备</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>您可以参考本页中的信息为自己的设备和产品创建 Makefile。请注意,与本部分中的其他页面不同,本页中的内容仅适合在创建全新的设备类型时参考,而且仅适合公司编译和产品团队参考。</p>
+
+<h2 id="build-layers">了解编译层</h2>
+
+<p>编译层次结构包括与设备的物理结构对应的抽象层。下表中介绍了这些层。每个层都与上一层存在一对多的关系。例如,一个架构可以有多个板,一个板可以有多个产品。您可以将指定层中的某个元素定义为同一层中某个元素的特化元素,从而免去复制操作并简化维护工作。</p>
+
+<table>
+ <tbody><tr>
+ <th>层</th>
+ <th>示例</th>
+ <th>说明</th>
+ </tr>
+ <tr>
+ <td>产品</td>
+ <td>myProduct、myProduct_eu、myProduct_eu_fr、j2、sdk</td>
+ <td><p>产品层用于定义所开发的产品的功能规范,例如要编译的模块、支持的语言区域,以及针对各语言区域的配置。也就是说,这是总体产品的名称。产品特定变量在产品定义 Makefile 中进行定义。一个产品可以沿用其他产品的定义,这有助于简化维护工作。一种常用的方法是:先创建一个基础产品,其中包含会应用到所有产品的功能,然后再基于这个基础产品创建产品变体。例如,如果有两个产品只是使用的无线技术不同(分别使用 CDMA 和 GSM),那么您可以让这两个产品沿用未定义无线技术的同一个基础产品的定义。
+</p></td>
+
+ </tr>
+ <tr>
+ <td>板/设备</td>
+ <td>sardine、trout、goldfish</td>
+ <td>设备/板层代表设备上由可塑材料组成的物理层(即设备的工业设计)。例如,在北美销售的设备可能包括 QWERTY 键盘,而在法国销售的设备则可能包括 AZERTY 键盘。该层还用于展现产品的基本架构图。这些架构图包括板上的外围设备及其配置。所使用的名称只不过是代表不同板/设备配置的代码。</td>
+ </tr>
+<tr>
+ <td>架构</td>
+ <td>arm、x86、mips、arm64、x86_64、mips64</td>
+ <td>架构层用于描述板上运行的处理器配置和 ABI(应用二进制接口)。</td>
+ </tr>
+</tbody></table>
+
+<h2 id="build-variants">使用编译类型</h2>
+
+<p>在针对特定产品进行编译时,如果能在最终发布版本的基础上进行细微修改,通常会非常有用。在模块定义中,模块可以通过 <code>LOCAL_MODULE_TAGS</code> 指定标记,这些标记可以是以下一个或多个值:<code>optional</code>(默认)、<code>debug</code>、<code>eng</code>。</p>
+
+<p>如果某个模块没有通过 <code>LOCAL_MODULE_TAGS</code> 指定标记,则其标记默认为 <code>optional</code>。仅当 <code>PRODUCT_PACKAGES</code> 的产品配置需要可选模块时,系统才会安装可选模块。</p><p>以下是当前已定义的编译类型:</p>
+
+<table border="1">
+<tbody><tr>
+ <td>
+ <code>eng<code>
+ </code></code></td>
+ <td>这是默认的编译类型。
+ <ul>
+ <li>安装带有 <code>eng</code> 和/或 <code>debug</code> 标记的模块。
+ </li><li>除了带有标记的模块之外,还会根据产品定义文件安装相应模块。</li>
+ <li><code>ro.secure=0</code>
+ </li><li><code>ro.debuggable=1</code>
+ </li><li><code>ro.kernel.android.checkjni=1</code>
+ </li><li><code>adb</code> 默认处于启用状态。
+ </li></ul></td>
+</tr>
+<tr>
+ <td>
+ <code>user<code>
+ </code></code></td>
+ <td>这是旨在用作最终版本配置步骤的编译类型。
+ <ul>
+ <li>安装带有 <code>user</code> 标记的模块。</li>
+ <li>除了带有标记的模块之外,还会根据产品定义文件安装相应模块。</li>
+ <li><code>ro.secure=1</code> </li>
+ <li><code>ro.debuggable=0</code> </li>
+ <li><code>adb</code> 默认处于停用状态。</li>
+ </ul></td>
+</tr>
+<tr>
+ <td>
+ <code>userdebug<code>
+ </code></code></td>
+ <td>除了以下几点之外,其余均与 <code>user</code> 相同:<ul>
+ <li>还会安装带有 <code>debug</code> 标记的模块。
+ </li><li><code>ro.debuggable=1</code>
+ </li><li><code>adb</code> 默认处于启用状态。
+ </li></ul></td>
+</tr>
+</tbody></table>
+
+<h2 id="use-resource-overlays">利用资源叠加层定制版本</h2>
+
+<p>Android 编译系统会在编译时利用资源叠加层定制产品。资源叠加层用于指定在默认文件之上应用的资源文件。要使用资源叠加层,请修改项目编译文件,将 <code>PRODUCT_PACKAGE_OVERLAYS</code> 设为相对于顶级目录的路径。当编译系统搜索资源时,该路径将成为影子根目录,系统除了在当前根目录中进行搜索外,还会一并在该路径中搜索。</p>
+
+<p><a href="https://android.googlesource.com/platform/frameworks/base/+/master/core/res/res/values/config.xml">frameworks/base/core/res/res/config.xml</a> 文件中包含用户最常自定义的设置。</p>
+
+<p>要在此文件上设置资源叠加层,请将叠加层目录添加到项目编译文件中,如下所示:</p>
+
+<pre>
+PRODUCT_PACKAGE_OVERLAYS := device/<i>device_implementer</i>/<i>device_name</i>/overlay
+</pre>
+
+<p>或</p>
+
+<pre>
+PRODUCT_PACKAGE_OVERLAYS := vendor/<i>vendor_name</i>/overlay
+</pre>
+
+<p>然后,将一个叠加层文件添加到该目录下,例如:</p>
+
+<pre>
+vendor/foobar/overlay/frameworks/base/core/res/res/config.xml
+</pre>
+
+<p>在叠加层 <code>config.xml</code> 文件中找到的所有字符串或字符串数组都将会替换在原始文件中找到的对应字符串或字符串数组。</p>
+
+<h2 id="build-a-product">编译产品</h2>
+
+<p>您可以通过多种方式组织设备的源文件。我们将以 Nexus 6 为例,简要介绍是如何组织其实施文件的,不过您可以按照自己认为合适的方式组织源文件并进行编译。
+</p>
+<p>为 Nexus 6 实施了一个名为 <code>shamu</code> 的主设备配置。根据此设备配置创建了一个产品以及一个产品定义 Makefile,该 Makefile 用于声明关于设备的产品特定信息,例如名称和型号。您可以查看 <code>device/moto/shamu</code> 目录,了解所有相关配置的具体设置方式。
+</p>
+<h3 id="makefiles">编写 Makefile</h3>
+<p>以下步骤介绍了如何采用与设置 Nexus 6 产品线类似的方式设置产品 Makefile:</p>
+<ol>
+ <li>为您的产品创建 <code>device/&lt;company_name&gt;/&lt;device_name&gt;</code> 目录,例如 <code>device/moto/shamu</code>。该目录中将包含您设备的源代码以及编译这些代码所需的 Makefile。
+ </li>
+
+ <li>创建一个用于声明设备所需文件和模块的 <code>device.mk</code> Makefile。有关示例,请参阅 <code>device/moto/shamu/device.mk</code>。
+ </li>
+
+ <li>创建一个产品定义 Makefile,以便基于设备创建具体产品。以下示例 Makefile 来自于 <code>device/moto/shamu/aosp_shamu.mk</code>。请注意,该产品会通过 Makefile 沿用 <code>device/moto/shamu/device.mk</code> 和 <code>vendor/moto/shamu/device-vendor.mk</code> 文件中的内容,同时还会声明产品特定信息,例如名称、品牌和型号。
+
+<pre>
+# Inherit from the common Open Source product configuration
+$(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_base_telephony.mk)
+
+PRODUCT_NAME := aosp_shamu
+PRODUCT_DEVICE := shamu
+PRODUCT_BRAND := Android
+PRODUCT_MODEL := AOSP on Shamu
+PRODUCT_MANUFACTURER := motorola
+PRODUCT_RESTRICT_VENDOR_FILES := true
+
+$(call inherit-product, device/moto/shamu/device.mk)
+$(call inherit-product-if-exists, vendor/moto/shamu/device-vendor.mk)
+
+PRODUCT_NAME := aosp_shamu
+
+PRODUCT_PACKAGES += \
+ Launcher3
+</pre>
+
+ <p>要查看可添加到 Makefile 的其他产品特定变量,请参阅<a href="#prod-def">产品定义变量</a>。
+ </p>
+ </li>
+
+ <li>创建一个指向产品的 Makefile 的 <code>AndroidProducts.mk</code> 文件。在此示例中,仅需要产品定义 Makefile。以下示例来自于 <code>device/moto/shamu/AndroidProducts.mk</code>:<pre>
+#
+# This file should set PRODUCT_MAKEFILES to a list of product makefiles
+# to expose to the build system. LOCAL_DIR will already be set to
+# the directory containing this file.
+#
+# This file may not rely on the value of any variable other than
+# LOCAL_DIR; do not use any conditionals, and do not look up the
+# value of any variable that isn't set in this file or in a file that
+# it includes.
+#
+
+PRODUCT_MAKEFILES := \
+ $(LOCAL_DIR)/aosp_shamu.mk
+</pre>
+ </li>
+
+ <li>创建一个包含板特定配置的 <code>BoardConfig.mk</code> Makefile。有关示例,请参阅 <code>device/moto/shamu/BoardConfig.mk</code>。
+ </li>
+
+ <li>创建一个 <code>vendorsetup.sh</code> 文件,以便将您的产品(“午餐套餐”)与<a href="#build-variants">版本变体</a>(使用短划线将两者分隔开)一起添加到编译版本中。例如:<pre>
+add_lunch_combo &lt;product_name&gt;-userdebug
+</pre>
+ </li>
+
+ <li>这时,您就可以基于同一设备创建更多产品变体了。
+ </li>
+
+</ol>
+<h3 id="prod-def">设置产品定义变量</h3>
+<p>产品特定变量在产品的 Makefile 中定义。在产品定义文件中维护的变量包括:</p>
+<table>
+ <tbody>
+ <tr>
+ <th>参数</th>
+ <th>说明</th>
+ <th>示例</th>
+ </tr>
+ <tr>
+ <td>PRODUCT_AAPT_CONFIG</td>
+ <td>
+ 创建程序包时使用的 <code>aapt</code> 配置</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>PRODUCT_BRAND</td>
+ <td>对软件进行自定义所针对的品牌(如果有),例如运营商</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>PRODUCT_CHARACTERISTICS</td>
+ <td>
+ <code>aapt</code> 特性,用于允许向程序包添加变体特定资源。
+ </td>
+ <td>tablet、nosdcard</td>
+ </tr>
+ <tr>
+ <td>PRODUCT_COPY_FILES</td>
+ <td>字词列表,例如 <code>source_path:destination_path</code>。在编译相应产品时,应将源路径下的文件复制到目标路径。config/Makefile 中定义了针对复制步骤的规则</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>PRODUCT_DEVICE</td>
+ <td>工业设计的名称。这也是板名称,编译系统会使用该名称查找 <code>BoardConfig.mk.</code>
+ </td>
+ <td>
+ <code>tuna</code>
+ </td>
+ </tr>
+ <tr>
+ <td>PRODUCT_LOCALES</td>
+ <td>以空格分隔的列表,用于列出由双字母语言代码和双字母国家/地区代码组成的代码对,以便说明针对用户的一些设置,例如界面语言和时间、日期以及货币格式。PRODUCT_LOCALES 中列出的第一个语言区域会被用作产品的默认语言区域。
+ </td>
+ <td>
+ <code>en_GB de_DE es_ES fr_CA</code>
+ </td>
+ </tr>
+ <tr>
+ <td>PRODUCT_MANUFACTURER</td>
+ <td>制造商的名称</td>
+ <td>
+ <code>acme</code>
+ </td>
+ </tr>
+ <tr>
+ <td>PRODUCT_MODEL</td>
+ <td>最终产品的最终用户可见名称</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>PRODUCT_NAME</td>
+ <td>总体产品的最终用户可见名称,将显示在“设置”&gt;“关于”屏幕中。
+ </td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>PRODUCT_OTA_PUBLIC_KEYS</td>
+ <td>产品的无线下载 (OTA) 公钥列表</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>PRODUCT_PACKAGES</td>
+ <td>列出要安装的 APK 和模块。
+ </td>
+ <td>
+ <code>Calendar Contacts</code>
+ </td>
+ </tr>
+ <tr>
+ <td>PRODUCT_PACKAGE_OVERLAYS</td>
+ <td>指明是使用默认资源还是添加任何产品特定叠加层</td>
+ <td>
+ <code>vendor/acme/overlay</code>
+ </td>
+ </tr>
+ <tr>
+ <td>PRODUCT_PROPERTY_OVERRIDES</td>
+ <td>系统属性分配(采用“key=value”格式)列表</td>
+ <td></td>
+ </tr>
+ </tbody>
+</table>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/brands.html b/zh-cn/source/brands.html
new file mode 100644
index 00000000..0aed859e
--- /dev/null
+++ b/zh-cn/source/brands.html
@@ -0,0 +1,104 @@
+<html devsite><head>
+ <title>品牌使用准则</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>“Android”名称、<img src="/source/assets/images/sac_logo.png" alt="Android" style="margin:0;padding:0 2px;vertical-align:baseline"/> 徽标、“Google Play”品牌以及其他商标均为 Google Inc. 的资产,不属于通过 Android 开放源代码项目提供的资源。</p>
+
+<p>如果您有意使用这些品牌,以表明它们与您的设备之间有所关联,请遵循本文中的使用准则。这些使用准则与 <a href="https://developer.android.com/distribute/tools/promote/brand.html">Android 应用开发者品牌使用准则</a>和 <a href="https://www.google.com/permissions/">Google 品牌权限</a>是相辅相成的关系。</p>
+
+<h2 id="brand-android">Android</h2>
+
+<p>以下是关于 Android 品牌和相关资产的制造商使用准则。</p>
+
+<h3 id="text-android" style="clear:right">在文本中使用 Android</h3>
+<ul>
+ <li>Android™ 首次出现在创意素材中时应标注商标符号。</li>
+ <li>“Android”应始终采用首字母大写形式,且一律不得使用复数或所有格形式。
+ </li>
+ <li>若要在设备的硬件、包装或营销材料中使用“Android”,则只有<a href="/compatibility/index.html">与 Android 兼容</a>的设备才能这样做。</li>
+ <li>不得在产品名称中使用“Android”,也不得将其用作包装或设备上的主要或明显的标记。</li>
+ <li>“Android”一词只能用于指明您设备的操作系统。如果您不确定自己的用法是否符合我们的使用准则,请通过以下简单的测试来加以验证:如果您可以将“Android”替换为“Android 平台”且文本内容仍然有意义,那么您可以使用“Android”一词。
+ <ul>
+ <li><span style="color:red">不正确</span>:Android XBrand 手机</li>
+ <li><span style="color:green">正确</span>:采用 Android 的 XBrand 手机</li>
+ </ul>
+ </li>
+ <li>您可以将“with Android”(搭载 Android)(以纯黑色文本显示)与您的徽标一起使用。如果与您的徽标一起使用,则“with Android”(搭载 Android)不应超过徽标大小的 90%。首次或着重以这种形式使用时,后面应标注 ™ 符号。</li>
+ <li>只有后跟一个合适的通称时,Android 才可用作描述词。<em></em>不得将“Android”用作您设备的产品名称或品牌的一部分。
+ <ul>
+ <li><span style="color:red">不正确</span>:Android XBrand 手机</li>
+ <li><span style="color:green">正确</span>:Android 移动设备</li>
+ </ul>
+ <p><strong>无论在任何情况下使用 Android 名称,都必须在您的资料中包含以下归属信息</strong>:</p>
+ <blockquote><em>Android 是 Google Inc. 的商标。</em></blockquote><p></p>
+ </li>
+</ul>
+
+<h4>可接受的使用情形示例</h4>
+<img src="images/JB-TM-example.png" alt="Jelly Bean 商标示例"/>
+<img src="images/8100-TM-example.png" alt="8100 系列商标示例"/>
+
+<h4>不可接受的使用情形示例</h4>
+<img src="images/XBrand-TM-example.jpg" alt="XBrand 商标示例"/>
+
+<h3 id="logo-android">Android 徽标</h3>
+<p>除非经 Google 书面协议明确授权,否则任何人都不得使用 Android 徽标及其专用字体(无论是否包含 Android 机器人)。</p>
+<img alt="无徽标" src="images/android_logo_new_crossed_out.png"/>
+<img alt="无徽标" src="https://developer.android.com/images/brand/android_logo_no.png"/>
+
+<h3 id="robot-android">Android 机器人</h3>
+
+<div class="wrap">
+<div class="col-4">
+ <img alt="android-robot" style="float:left;margin-right:10px" src="/source/images/Android_Robot_100.png"/>
+ <p style="padding-top:20px">
+ <a href="https://developer.android.com/images/brand/Android_Robot_100.png">100x118</a><br />
+ <a href="https://developer.android.com/images/brand/Android_Robot_200.png">200x237</a><br />
+ <a href="https://developer.android.com/downloads/brand/Android_Robot_outlined.ai">Illustrator</a>
+ </p>
+</div>
+<div class="col-8">
+<p style="padding-top:20px">在注明适当归属信息的情况下,您可以在营销资料中自由使用、重制和修改 Android 机器人。如需了解详情,请参阅<a href="https://developer.android.com/distribute/tools/promote/brand.html">应用开发者品牌使用准则</a>和 <a href="https://creativecommons.org/licenses/by/3.0/">Creative Commons 许可</a>。</p>
+</div>
+</div>
+
+<div class="wrap" style="padding-top:20px">
+<div class="col-4" style="align:center">
+<img alt="no-peace-robot" style="width:30%;height:30%" src="images/No_PeaceBot_200.jpg"/>
+</div>
+<div class="col-8">
+<p style="padding-top:20px">合作伙伴的营销材料中不得使用 Android Peace 机器人或其任何变体形式(例如带 Peace 标记的 Android 机器人)。</p>
+</div>
+</div>
+
+<div style="clear:both"></div>
+<h2 id="brand-google_play">Google Play</h2>
+
+<p>若要在硬件包装、硬件的营销材料或硬件本身上使用“Google Play”名称和 Google Play 商店图标,则只有<a href="/source/faqs.html#if-my-device-is-compatible-does-it-automatically-have-access-to-google-play-and-branding">获得使用 Google Play 的许可</a>的设备才能这样做。如需查看获得使用 Google Play 的许可的设备列表,请参阅<a href="https://support.google.com/googleplay/answer/1727131">支持的设备</a>。</p>
+
+<h2>其他品牌</h2>
+<p><a href="https://www.android.com/auto/">Android Auto</a>、<a href="https://www.android.com/tv/">Android TV</a> 和 <a href="https://www.android.com/wear/">Android Wear</a> 是 Google 所拥有的品牌。这些品牌要求使用 Google 专有软件,此类软件在 Android 平台上运行且只能在获得 Google 授予的许可后使用。要了解如何申请许可,请参阅<a href="/compatibility/contact-us.html">与我们联系</a>。
+
+</p><h2 id="Questions">问题</h2>
+
+<p>如需了解更多品牌使用信息,请通过提交<a href="https://support.google.com/googleplay/contact/brand_developer">合作伙伴品牌咨询表单</a>与 Android 合作伙伴营销团队联系。</p>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/build-numbers.html b/zh-cn/source/build-numbers.html
new file mode 100644
index 00000000..883954b1
--- /dev/null
+++ b/zh-cn/source/build-numbers.html
@@ -0,0 +1,1737 @@
+<html devsite><head>
+ <title>代号、标记和细分版本 (Build) 号</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>简要来说,Android 的开发是围绕着版本系列进行的,这些版本使用美味的点心名字(按字母顺序)作为代号。</p>
+
+<h2 id="platform-code-names-versions-api-levels-and-ndk-releases">平台代号、版本、API 级别和 NDK 版本</h2>
+<p>为方便起见,代号与以下版本号、API 级别和 NDK 版本相对应:</p>
+<table>
+<thead>
+<tr>
+<th>代号</th>
+<th>版本</th>
+<th>API 级别</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>Nougat</td>
+<td>7.1</td>
+<td>API 级别 25</td>
+</tr>
+<tr>
+<td>Nougat</td>
+<td>7.0</td>
+<td>API 级别 24</td>
+</tr>
+<tr>
+<td>Marshmallow</td>
+<td>6.0</td>
+<td>API 级别 23</td>
+</tr>
+<tr>
+<td>Lollipop</td>
+<td>5.1</td>
+<td>API 级别 22</td>
+</tr>
+<tr>
+<td>Lollipop</td>
+<td>5.0</td>
+<td>API 级别 21</td>
+</tr>
+<tr>
+<td>KitKat</td>
+<td>4.4-4.4.4</td>
+<td>API 级别 19</td>
+</tr>
+<tr>
+<td>Jelly Bean</td>
+<td>4.3.x</td>
+<td>API 级别 18</td>
+</tr>
+<tr>
+<td>Jelly Bean</td>
+<td>4.2.x</td>
+<td>API 级别 17</td>
+</tr>
+<tr>
+<td>Jelly Bean</td>
+<td>4.1.x</td>
+<td>API 级别 16</td>
+</tr>
+<tr>
+<td>Ice Cream Sandwich</td>
+<td>4.0.3-4.0.4</td>
+<td>API 级别 15,NDK 8</td>
+</tr>
+<tr>
+<td>Ice Cream Sandwich</td>
+<td>4.0.1-4.0.2</td>
+<td>API 级别 14,NDK 7</td>
+</tr>
+<tr>
+<td>Honeycomb</td>
+<td>3.2.x</td>
+<td>API 级别 13</td>
+</tr>
+<tr>
+<td>Honeycomb</td>
+<td>3.1</td>
+<td>API 级别 12,NDK 6</td>
+</tr>
+<tr>
+<td>Honeycomb</td>
+<td>3.0</td>
+<td>API 级别 11</td>
+</tr>
+<tr>
+<td>Gingerbread</td>
+<td>2.3.3-2.3.7</td>
+<td>API 级别 10</td>
+</tr>
+<tr>
+<td>Gingerbread</td>
+<td>2.3-2.3.2</td>
+<td>API 级别 9,NDK 5</td>
+</tr>
+<tr>
+<td>Froyo</td>
+<td>2.2.x</td>
+<td>API 级别 8,NDK 4</td>
+</tr>
+<tr>
+<td>Eclair</td>
+<td>2.1</td>
+<td>API 级别 7,NDK 3</td>
+</tr>
+<tr>
+<td>Eclair</td>
+<td>2.0.1</td>
+<td>API 级别 6</td>
+</tr>
+<tr>
+<td>Eclair</td>
+<td>2.0</td>
+<td>API 级别 5</td>
+</tr>
+<tr>
+<td>Donut</td>
+<td>1.6</td>
+<td>API 级别 4,NDK 2</td>
+</tr>
+<tr>
+<td>Cupcake</td>
+<td>1.5</td>
+<td>API 级别 3,NDK 1</td>
+</tr>
+<tr>
+<td>(无代号)</td>
+<td>1.1</td>
+<td>API 级别 2</td>
+</tr>
+<tr>
+<td>(无代号)</td>
+<td>1.0</td>
+<td>API 级别 1</td>
+</tr>
+</tbody>
+</table>
+<p>从 Cupcake 开始,每个细分细分版本均有一个简短的细分版本代码,以作区分,例如 FRF85B。</p>
+<p>第一个字母代表相应版本系列的代号,例如 F 表示 Froyo。</p>
+<p>第二个字母是分支代码,Google 用它来表示细分版本所属的确切代号分支。按照惯例,R 表示主要版本分支。</p>
+<p>接下来的字母和两个数字是日期代码。字母表示季度,其中 A 表示 2009 年第 1 季度。因此,F 表示 2010 年第 2 季度。两个数字表示相应季度内的第某天,因此 F85 表示 2010 年 6 月 24 日。</p>
+<p>最后,末尾字母表示具有相同日期代码的不同版本,从 A 开始;但 A 实际上并不会显示,通常会为了简洁而省略。</p>
+<p>日期代码并不一定是某个细分版本的确切构建日期,Google 常常会在现有细分版本中增加细微的更改,并在新细分版本中重复使用与现有细分版本相同的日期代码。</p>
+
+<h2 id="source-code-tags-and-builds">源代码标记和细分版本</h2>
+<p>下表完整列出了从 Donut 开始的细分版本和标记。您可以从以下网址下载 Nexus 设备的出厂映像和二进制文件:</p>
+<p><a href="https://developers.google.com/android/nexus/images">https://developers.google.com/android/nexus/images</a></p>
+<p><a href="https://developers.google.com/android/nexus/drivers">https://developers.google.com/android/nexus/drivers</a></p>
+<table>
+ <thead>
+ <tr>
+ <th>细分版本</th>
+ <th>分支</th>
+ <th>版本</th>
+ <th>支持的设备</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>N6F26U</td>
+ <td>android-7.1.1_r28</td>
+ <td>Nougat</td>
+ <td>Nexus 6</td>
+ </tr>
+ <tr>
+ <td>NUF26N</td>
+ <td>android-7.1.1_r27</td>
+ <td>Nougat</td>
+ <td>Nexus 6P</td>
+ </tr>
+ <tr>
+ <td>NOF27C</td>
+ <td>android-7.1.1_r26</td>
+ <td>Nougat</td>
+ <td>Pixel XL、Pixel</td>
+ </tr>
+ <tr>
+ <td>NOF27B</td>
+ <td>android-7.1.1_r25</td>
+ <td>Nougat</td>
+ <td>Pixel XL、Pixel</td>
+ </tr>
+ <tr>
+ <td>N4F26T</td>
+ <td>android-7.1.1_r24</td>
+ <td>Nougat</td>
+ <td>Nexus 5X、Nexus 6P、Nexus 9 (volantis/volantisg)、Pixel C</td>
+ </tr>
+ <tr>
+ <td>NMF27D</td>
+ <td>android-7.1.1_r23</td>
+ <td>Nougat</td>
+ <td>Nexus Player</td>
+ </tr>
+ <tr>
+ <td>NMF26X</td>
+ <td>android-7.1.1_r22</td>
+ <td>Nougat</td>
+ <td>Nexus Player</td>
+ </tr>
+ <tr>
+ <td>NOF26W</td>
+ <td>android-7.1.1_r21</td>
+ <td>Nougat</td>
+ <td>Pixel XL、Pixel</td>
+ </tr>
+ <tr>
+ <td>NOF26V</td>
+ <td>android-7.1.1_r20</td>
+ <td>Nougat</td>
+ <td>Pixel XL、Pixel</td>
+ </tr>
+ <tr>
+ <td>N6F26R</td>
+ <td>android-7.1.1_r17</td>
+ <td>Nougat</td>
+ <td>Nexus 6</td>
+ </tr>
+ <tr>
+ <td>NUF26K</td>
+ <td>android-7.1.1_r16</td>
+ <td>Nougat</td>
+ <td>Nexus 6P</td>
+ </tr>
+ <tr>
+ <td>N4F26Q</td>
+ <td>android-7.1.1_r15</td>
+ <td>Nougat</td>
+ <td>Nexus 9 (volantis/volantisg)</td>
+ </tr>
+ <tr>
+ <td>N4F26O</td>
+ <td>android-7.1.1_r14</td>
+ <td>Nougat</td>
+ <td>Nexus 5X、Nexus 6P、Pixel C</td>
+ </tr>
+ <tr>
+ <td>N6F26Q</td>
+ <td>android-7.1.1_r13</td>
+ <td>Nougat</td>
+ <td>Nexus 6</td>
+ </tr>
+ <tr>
+ <td>N4F26M</td>
+ <td>android-7.1.1_r12</td>
+ <td>Nougat</td>
+ <td>Nexus 9 (volantis)</td>
+ </tr>
+ <tr>
+ <td>N4F26J</td>
+ <td>android-7.1.1_r11</td>
+ <td>Nougat</td>
+ <td>Nexus 5X、Nexus 6P</td>
+ </tr>
+ <tr>
+ <td>N4F26I</td>
+ <td>android-7.1.1_r10</td>
+ <td>Nougat</td>
+ <td>Nexus 5X、Nexus 6P、Pixel C</td>
+ </tr>
+ <tr>
+ <td>NMF26V</td>
+ <td>android-7.1.1_r9</td>
+ <td>Nougat</td>
+ <td>Pixel XL、Pixel</td>
+ </tr>
+ <tr>
+ <td>NMF26U</td>
+ <td>android-7.1.1_r8</td>
+ <td>Nougat</td>
+ <td>Pixel XL、Pixel </td>
+ </tr>
+ <tr>
+ <td>NMF26R</td>
+ <td>android-7.1.1_r7</td>
+ <td>Nougat</td>
+ <td>Nexus Player</td>
+ </tr>
+ <tr>
+ <td>NMF26Q</td>
+ <td>android-7.1.1_r6</td>
+ <td>Nougat</td>
+ <td>Pixel XL、Pixel</td>
+ </tr>
+ <tr>
+ <td>NMF26O</td>
+ <td>android-7.1.1_r4</td>
+ <td>Nougat</td>
+ <td>Pixel XL、Pixel</td>
+ </tr>
+ <tr>
+ <td>NMF26J</td>
+ <td>android-7.1.1_r3</td>
+ <td>Nougat</td>
+ <td>Nexus Player</td>
+ </tr>
+ <tr>
+ <td>NMF26H</td>
+ <td>android-7.1.1_r2</td>
+ <td>Nougat</td>
+ <td>Pixel C</td>
+ </tr>
+ <tr>
+ <td>NMF26F</td>
+ <td>android-7.1.1_r1</td>
+ <td>Nougat</td>
+ <td>Nexus 5X、Nexus 6P、Nexus 9 (volantis/volantisg)</td>
+ </tr>
+ <tr>
+ <td>NDE63X</td>
+ <td>android-7.1.0_r7</td>
+ <td>Nougat</td>
+ <td>Pixel XL、Pixel</td>
+ </tr>
+ <tr>
+ <td>NDE63V</td>
+ <td>android-7.1.0_r6</td>
+ <td>Nougat</td>
+ <td>Pixel XL、Pixel</td>
+ </tr>
+ <tr>
+ <td>NDE63U</td>
+ <td>android-7.1.0_r5</td>
+ <td>Nougat</td>
+ <td>Pixel XL、Pixel</td>
+ </tr>
+ <tr>
+ <td>NDE63P</td>
+ <td>android-7.1.0_r4</td>
+ <td>Nougat</td>
+ <td>Pixel XL、Pixel</td>
+ </tr>
+ <tr>
+ <td>NDE63L</td>
+ <td>android-7.1.0_r2</td>
+ <td>Nougat</td>
+ <td>Pixel XL、Pixel</td>
+ </tr>
+ <tr>
+ <td>NDE63H</td>
+ <td>android-7.1.0_r1</td>
+ <td>Nougat</td>
+ <td>Pixel XL、Pixel</td>
+ </tr>
+ <tr>
+ <td>NBD92E</td>
+ <td>android-7.0.0_r31</td>
+ <td>Nougat</td>
+ <td>Nexus 6</td>
+ </tr><tr>
+ </tr><tr>
+ <td>NBD92D</td>
+ <td>android-7.0.0_r30</td>
+ <td>Nougat</td>
+ <td>Nexus 6</td>
+ </tr><tr>
+ <td>NBD91Z</td>
+ <td>android-7.0.0_r29</td>
+ <td>Nougat</td>
+ <td>Nexus 6</td>
+ </tr><tr>
+ <td>NBD91Y</td>
+ <td>android-7.0.0_r28</td>
+ <td>Nougat</td>
+ <td>Nexus 6</td>
+ </tr>
+ <tr>
+ <td>NBD91X</td>
+ <td>android-7.0.0_r27</td>
+ <td>Nougat</td>
+ <td>Nexus 6</td>
+ </tr>
+ <tr>
+ <td>NBD91U</td>
+ <td>android-7.0.0_r24</td>
+ <td>Nougat</td>
+ <td>Nexus 6</td>
+ </tr>
+ <tr>
+ <td>N5D91L</td>
+ <td>android-7.0.0_r21</td>
+ <td>Nougat</td>
+ <td>Nexus 5X</td>
+ </tr>
+ <tr>
+ <td>NBD91P</td>
+ <td>android-7.0.0_r19</td>
+ <td>Nougat</td>
+ <td>Nexus 6</td>
+ </tr>
+ <tr>
+ <td>NRD91K</td>
+ <td>android-7.0.0_r17</td>
+ <td>Nougat</td>
+ <td>Nexus 6P</td>
+ </tr>
+ <tr>
+ <td>NRD91N</td>
+ <td>android-7.0.0_r15</td>
+ <td>Nougat</td>
+ <td>Nexus 5X、Pixel C、Nexus Player、Nexus 9 (volantis/volantisg)</td>
+ </tr>
+ <tr>
+ <td>NBD90Z</td>
+ <td>android-7.0.0_r14</td>
+ <td>Nougat</td>
+ <td>Nexus 6</td>
+ </tr>
+ <tr>
+ <td>NBD90X</td>
+ <td>android-7.0.0_r13</td>
+ <td>Nougat</td>
+ <td>Nexus 6P</td>
+ </tr>
+ <tr>
+ <td>NBD90W</td>
+ <td>android-7.0.0_r12</td>
+ <td>Nougat</td>
+ <td>Nexus 5X</td>
+ </tr>
+ <tr>
+ <td>NRD91D</td>
+ <td>android-7.0.0_r7</td>
+ <td>Nougat</td>
+ <td>Pixel C、Nexus Player、Nexus 9 (WLAN)</td>
+ </tr>
+ <tr>
+ <td>NRD90U</td>
+ <td>android-7.0.0_r6</td>
+ <td>Nougat</td>
+ <td>Nexus 6P</td>
+ </tr>
+ <tr>
+ <td>NRD90T</td>
+ <td>android-7.0.0_r5</td>
+ <td>Nougat</td>
+ <td>Nexus 6P</td>
+ </tr>
+ <tr>
+ <td>NRD90S</td>
+ <td>android-7.0.0_r4</td>
+ <td>Nougat</td>
+ <td>Nexus 5X</td>
+ </tr>
+ <tr>
+ <td>NRD90R</td>
+ <td>android-7.0.0_r3</td>
+ <td>Nougat</td>
+ <td>Nexus 5X、Nexus 9 (volantis)、Nexus Player、Pixel C</td>
+ </tr>
+ <tr>
+ <td>NRD90M</td>
+ <td>android-7.0.0_r1</td>
+ <td>Nougat</td>
+ <td>Nexus 5X、Nexus 9 (volantis)、Nexus Player、Pixel C</td>
+ </tr>
+ <tr>
+ <td>MOB31T</td>
+ <td>android-6.0.1_r79</td>
+ <td>Marshmallow</td>
+ <td>Nexus 6</td>
+ </tr>
+ <tr>
+ <td>MOB31S</td>
+ <td>android-6.0.1_r78</td>
+ <td>Marshmallow</td>
+ <td>Nexus 6</td>
+ </tr>
+ <tr>
+ <td>M4B30Z</td>
+ <td>android-6.0.1_r77</td>
+ <td>Marshmallow</td>
+ <td>Nexus 5</td>
+ </tr>
+ <tr>
+ <td>MOB31K</td>
+ <td>android-6.0.1_r74</td>
+ <td>Marshmallow</td>
+ <td>Nexus 6</td>
+ </tr>
+ <tr>
+ <td>MMB31C</td>
+ <td>android-6.0.1_r73</td>
+ <td>Marshmallow</td>
+ <td>Nexus 6</td>
+ </tr>
+ <tr>
+ <td>M4B30X</td>
+ <td>android-6.0.1_r72</td>
+ <td>Marshmallow</td>
+ <td>Nexus 5</td>
+ </tr>
+ <tr>
+ <td>MOB31H</td>
+ <td>android-6.0.1_r70</td>
+ <td>Marshmallow</td>
+ <td>Nexus 6</td>
+ </tr>
+ <tr>
+ <td>MMB30Y</td>
+ <td>android-6.0.1_r69</td>
+ <td>Marshmallow</td>
+ <td>Nexus 6</td>
+ </tr>
+ <tr>
+ <td>MTC20K</td>
+ <td>android-6.0.1_r67</td>
+ <td>Marshmallow</td>
+ <td>Nexus 5X</td>
+ </tr>
+ <tr>
+ <td>MOB31E</td>
+ <td>android-6.0.1_r66</td>
+ <td>Marshmallow</td>
+ <td>Nexus 5、Nexus 6、Nexus 9 (volantis)</td>
+ </tr>
+ <tr>
+ <td>MMB30W</td>
+ <td>android-6.0.1_r65</td>
+ <td>Marshmallow</td>
+ <td>Nexus 6</td>
+ </tr>
+ <tr>
+ <td>MXC89L</td>
+ <td>android-6.0.1_r63</td>
+ <td>Marshmallow</td>
+ <td>Pixel C</td>
+ </tr>
+ <tr>
+ <td>MTC20F</td>
+ <td>android-6.0.1_r62</td>
+ <td>Marshmallow</td>
+ <td>Nexus 5X、Nexus 6P</td>
+ </tr>
+ <tr>
+ <td>MOB30Y</td>
+ <td>android-6.0.1_r60</td>
+ <td>Marshmallow</td>
+ <td>Nexus 5</td>
+ </tr>
+ <tr>
+ <td>MOB30X</td>
+ <td>android-6.0.1_r59</td>
+ <td>Marshmallow</td>
+ <td>Nexus 7 (flo/deb)</td>
+ </tr>
+ <tr>
+ <td>MOB30W</td>
+ <td>android-6.0.1_r58</td>
+ <td>Marshmallow</td>
+ <td>Nexus 6、Nexus 9 (volantis/volantisg)、Nexus Player</td>
+ </tr>
+ <tr>
+ <td>MMB30S</td>
+ <td>android-6.0.1_r57</td>
+ <td>Marshmallow</td>
+ <td>Nexus 7 (deb)</td>
+ </tr>
+ <tr>
+ <td>MMB30R</td>
+ <td>android-6.0.1_r56</td>
+ <td>Marshmallow</td>
+ <td>Nexus 6</td>
+ </tr>
+ <tr>
+ <td>MXC89K</td>
+ <td>android-6.0.1_r55</td>
+ <td>Marshmallow</td>
+ <td>Pixel C</td>
+ </tr>
+ <tr>
+ <td>MTC19Z</td>
+ <td>android-6.0.1_r54</td>
+ <td>Marshmallow</td>
+ <td>Nexus 5X</td>
+ </tr>
+ <tr>
+ <td>MTC19X</td>
+ <td>android-6.0.1_r53</td>
+ <td>Marshmallow</td>
+ <td>Nexus 6P</td>
+ </tr>
+ <tr>
+ <td>MOB30P</td>
+ <td>android-6.0.1_r50</td>
+ <td>Marshmallow</td>
+ <td>Nexus 5、Nexus 7 (flo/deb)、Nexus 9 (volantis/volantisg)、Nexus Player</td>
+ </tr>
+ <tr>
+ <td>MOB30O</td>
+ <td>android-6.0.1_r49</td>
+ <td>Marshmallow</td>
+ <td>Nexus 6</td>
+ </tr>
+ <tr>
+ <td>MMB30M</td>
+ <td>android-6.0.1_r48</td>
+ <td>Marshmallow</td>
+ <td>Nexus 7 (deb)</td>
+ </tr>
+ <tr>
+ <td>MMB30K</td>
+ <td>android-6.0.1_r47</td>
+ <td>Marshmallow</td>
+ <td>Nexus 6</td>
+ </tr>
+ <tr>
+ <td>MOB30M</td>
+ <td>android-6.0.1_r46</td>
+ <td>Marshmallow</td>
+ <td>Nexus 5、Nexus 6、Nexus 7 (flo/deb)、Nexus 9 (volantis/volantisg)、Nexus Player</td>
+ </tr>
+ <tr>
+ <td>MTC19V</td>
+ <td>android-6.0.1_r45</td>
+ <td>Marshmallow</td>
+ <td>Nexus 5X、Nexus 6P</td>
+ </tr>
+ <tr>
+ <td>MOB30J</td>
+ <td>android-6.0.1_r43</td>
+ <td>Marshmallow</td>
+ <td>Nexus 7 (flo/deb)</td>
+ </tr>
+ <tr>
+ <td>MOB30I</td>
+ <td>android-6.0.1_r42</td>
+ <td>Marshmallow</td>
+ <td>Nexus 6</td>
+ </tr>
+ <tr>
+ <td>MOB30H</td>
+ <td>android-6.0.1_r41</td>
+ <td>Marshmallow</td>
+ <td>Nexus 5</td>
+ </tr>
+ <tr>
+ <td>MOB30G</td>
+ <td>android-6.0.1_r40</td>
+ <td>Marshmallow</td>
+ <td>Nexus 9 (volantis/volantisg)、Nexus Player</td>
+ </tr>
+ <tr>
+ <td>MXC89H</td>
+ <td>android-6.0.1_r33</td>
+ <td>Marshmallow</td>
+ <td>Pixel C</td>
+ </tr>
+ <tr>
+ <td>MXC89F</td>
+ <td>android-6.0.1_r32</td>
+ <td>Marshmallow</td>
+ <td>Pixel C</td>
+ </tr>
+ <tr>
+ <td>MMB30J</td>
+ <td>android-6.0.1_r28</td>
+ <td>Marshmallow</td>
+ <td>Nexus 6、Nexus 7 (deb)</td>
+ </tr>
+ <tr>
+ <td>MTC19T</td>
+ <td>android-6.0.1_r25</td>
+ <td>Marshmallow</td>
+ <td>Nexus 5X、Nexus 6P</td>
+ </tr>
+<tr>
+ <td>M5C14J</td>
+ <td>android-6.0.1_r31</td>
+ <td>Marshmallow</td>
+ <td>Pixel C</td>
+</tr>
+<tr>
+ <td>MOB30D</td>
+ <td>android-6.0.1_r30</td>
+ <td>Marshmallow</td>
+ <td>Nexus 5、Nexus 6、Nexus 7 (flo/deb)、Nexus 9 (volantis/volantisg)、Nexus Player</td>
+</tr>
+<tr>
+ <td>MHC19Q</td>
+ <td>android-6.0.1_r24</td>
+ <td>Marshmallow</td>
+ <td>Nexus 5X、Nexus 6P</td>
+</tr>
+<tr>
+ <td>MHC19J</td>
+ <td>android-6.0.1_r22</td>
+ <td>Marshmallow</td>
+ <td>Nexus 5X</td>
+</tr>
+<tr>
+ <td>MHC19I</td>
+ <td>android-6.0.1_r21</td>
+ <td>Marshmallow</td>
+ <td>Nexus 6P</td>
+</tr>
+<tr>
+ <td>MMB29X</td>
+ <td>android-6.0.1_r20</td>
+ <td>Marshmallow</td>
+ <td>Nexus 5、Nexus 6、Nexus 7 (deb)、Nexus 9 (volantisg)</td>
+</tr>
+<tr>
+ <td>MXC14G</td>
+ <td>android-6.0.1_r18</td>
+ <td>Marshmallow</td>
+ <td>Pixel C</td>
+</tr>
+<tr>
+ <td>MMB29V</td>
+ <td>android-6.0.1_r17</td>
+ <td>Marshmallow</td>
+ <td>Nexus 5、Nexus 5X、Nexus 6、Nexus 6P、Nexus 7 (flo/deb)、Nexus 9 (volantis/volantisg)</td>
+</tr>
+<tr>
+ <td>MXB48T</td>
+ <td>android-6.0.1_r16</td>
+ <td>Marshmallow</td>
+ <td>Pixel C</td>
+</tr>
+<tr>
+ <td>MMB29U</td>
+ <td>android-6.0.1_r13</td>
+ <td>Marshmallow</td>
+ <td>Nexus Player</td>
+</tr>
+<tr>
+ <td>MMB29R</td>
+ <td>android-6.0.1_r12</td>
+ <td>Marshmallow</td>
+ <td>Nexus 9 (volantis/volantisg)</td>
+</tr>
+<tr>
+ <td>MMB29Q</td>
+ <td>android-6.0.1_r11</td>
+ <td>Marshmallow</td>
+ <td>Nexus 5、Nexus 5X、Nexus 6、Nexus 6P、Nexus 7 (flo/deb)</td>
+</tr>
+<tr>
+ <td>MMB29T</td>
+ <td>android-6.0.1_r10</td>
+ <td>Marshmallow</td>
+ <td>Nexus Player</td>
+</tr>
+<tr>
+ <td>MMB29S</td>
+ <td>android-6.0.1_r9</td>
+ <td>Marshmallow</td>
+ <td>Nexus 5、Nexus 6、Nexus 9 (volantis/volantisg)</td>
+</tr>
+<tr>
+ <td>MMB29P</td>
+ <td>android-6.0.1_r8</td>
+ <td>Marshmallow</td>
+ <td>Nexus 5X、Nexus 6P</td>
+</tr>
+<tr>
+ <td>MMB29O</td>
+ <td>android-6.0.1_r7</td>
+ <td>Marshmallow</td>
+ <td>Nexus 7 (flo/deb)</td>
+</tr>
+<tr>
+ <td>MXB48K</td>
+ <td>android-6.0.1_r5</td>
+ <td>Marshmallow</td>
+ <td>Pixel C</td>
+</tr>
+<tr>
+ <td>MXB48J</td>
+ <td>android-6.0.1_r4</td>
+ <td>Marshmallow</td>
+ <td>Pixel C</td>
+</tr>
+<tr>
+ <td>MMB29M</td>
+ <td>android-6.0.1_r3</td>
+ <td>Marshmallow</td>
+ <td>Nexus 6P、Nexus Player</td>
+</tr>
+<tr>
+ <td>MMB29K</td>
+ <td>android-6.0.1_r1</td>
+ <td>Marshmallow</td>
+ <td>Nexus 5、Nexus 5X、Nexus 6、Nexus 7 (flo/deb)、Nexus 9 (volantis/volantisg)</td>
+</tr>
+<tr>
+ <td>MMB29N</td>
+ <td>android-6.0.0_r41</td>
+ <td>Marshmallow</td>
+ <td>Nexus 6P</td>
+</tr>
+<tr>
+ <td>MDB08M</td>
+ <td>android-6.0.0_r26</td>
+ <td>Marshmallow</td>
+ <td>Nexus 5X、Nexus 6P</td>
+</tr>
+<tr>
+ <td>MDB08L</td>
+ <td>android-6.0.0_r25</td>
+ <td>Marshmallow</td>
+ <td>Nexus 5X、Nexus 6P</td>
+</tr>
+<tr>
+ <td>MDB08K</td>
+ <td>android-6.0.0_r24</td>
+ <td>Marshmallow</td>
+ <td>Nexus 6P</td>
+</tr>
+<tr>
+ <td>MDB08I</td>
+ <td>android-6.0.0_r23</td>
+ <td>Marshmallow</td>
+ <td>Nexus 5X</td>
+</tr>
+<tr>
+ <td>MDA89E</td>
+ <td>android-6.0.0_r12</td>
+ <td>Marshmallow</td>
+ <td>Nexus 5X</td>
+</tr>
+<tr>
+ <td>MDA89D</td>
+ <td>android-6.0.0_r11</td>
+ <td>Marshmallow</td>
+ <td>Nexus 6P</td>
+</tr>
+<tr>
+ <td>MRA59B</td>
+ <td>android-6.0.0_r7</td>
+ <td>Marshmallow</td>
+ <td>Nexus 7 (deb)</td>
+</tr>
+<tr>
+ <td>MRA58X</td>
+ <td>android-6.0.0_r6</td>
+ <td>Marshmallow</td>
+ <td>Nexus 6</td>
+</tr>
+<tr>
+ <td>MRA58V</td>
+ <td>android-6.0.0_r5</td>
+ <td>Marshmallow</td>
+ <td>Nexus 7 (flo/deb)</td>
+</tr>
+<tr>
+ <td>MRA58U</td>
+ <td>android-6.0.0_r4</td>
+ <td>Marshmallow</td>
+ <td>Nexus 7 (flo)</td>
+</tr>
+<tr>
+ <td>MRA58N</td>
+ <td>android-6.0.0_r2</td>
+ <td>Marshmallow</td>
+ <td>Nexus 5、Nexus 6、Nexus 7 (flo/deb)、Nexus 9 (volantis/volantisg)、Nexus Player</td>
+</tr>
+<tr>
+ <td>MRA58K</td>
+ <td>android-6.0.0_r1</td>
+ <td>Marshmallow</td>
+ <td>Nexus 5、Nexus 6、Nexus 7 (flo/deb)、Nexus 9 (volantis/volantisg)、Nexus Player</td>
+</tr>
+<tr>
+ <td>LMY49M</td>
+ <td>android-5.1.1_r38</td>
+ <td>Lollipop</td>
+ <td>Nexus 10</td>
+</tr>
+<tr>
+ <td>LMY49J</td>
+ <td>android-5.1.1_r37</td>
+ <td>Lollipop</td>
+ <td>Nexus 10</td>
+</tr>
+<tr>
+ <td>LMY49I</td>
+ <td>android-5.1.1_r36</td>
+ <td>Lollipop</td>
+ <td>Nexus 10</td>
+</tr>
+<tr>
+ <td>LMY49H</td>
+ <td>android-5.1.1_r35</td>
+ <td>Lollipop</td>
+ <td>Nexus 10</td>
+</tr>
+<tr>
+ <td>LMY49G</td>
+ <td>android-5.1.1_r34</td>
+ <td>Lollipop</td>
+ <td>Nexus 10</td>
+</tr>
+<tr>
+ <td>LMY49F</td>
+ <td>android-5.1.1_r33</td>
+ <td>Lollipop</td>
+ <td>Nexus 9 (volantisg)、Nexus 10</td>
+</tr>
+<tr>
+ <td>LMY48Z</td>
+ <td>android-5.1.1_r30</td>
+ <td>Lollipop</td>
+ <td>Nexus 6、Nexus 7 (deb)、Nexus 9 (volantisg)、Nexus 10</td>
+</tr>
+<tr>
+ <td>LYZ28N</td>
+ <td>android-5.1.1_r28</td>
+ <td>Lollipop</td>
+ <td>Nexus 6(仅面向 T-Mobile)</td>
+</tr>
+<tr>
+ <td>LMY48Y</td>
+ <td>android-5.1.1_r26</td>
+ <td>Lollipop</td>
+ <td>Nexus 6</td>
+</tr>
+<tr>
+ <td>LMY48X</td>
+ <td>android-5.1.1_r25</td>
+ <td>Lollipop</td>
+ <td>Nexus 6、Nexus 7 (deb)、Nexus 9 (volantisg)、Nexus 10</td>
+</tr>
+<tr>
+ <td>LMY48W</td>
+ <td>android-5.1.1_r24</td>
+ <td>Lollipop</td>
+ <td>Nexus 6</td>
+</tr>
+<tr>
+ <td>LVY48H</td>
+ <td>android-5.1.1_r23</td>
+ <td>Lollipop</td>
+ <td>Nexus 6(仅面向 Project Fi)</td>
+</tr>
+<tr>
+ <td>LYZ28M</td>
+ <td>android-5.1.1_r22</td>
+ <td>Lollipop</td>
+ <td>Nexus 6(仅面向 T-Mobile)</td>
+</tr>
+<tr>
+ <td>LMY48U</td>
+ <td>android-5.1.1_r20</td>
+ <td>Lollipop</td>
+ <td>Nexus 7 (deb)</td>
+</tr>
+<tr>
+ <td>LMY48T</td>
+ <td>android-5.1.1_r19</td>
+ <td>Lollipop</td>
+ <td>Nexus 4、Nexus 6、Nexus 9 (volantis/volantisg)、Nexus 10</td>
+</tr>
+<tr>
+ <td>LVY48F</td>
+ <td>android-5.1.1_r18</td>
+ <td>Lollipop</td>
+ <td>Nexus 6(仅面向 Project Fi)</td>
+</tr>
+<tr>
+ <td>LYZ28K</td>
+ <td>android-5.1.1_r17</td>
+ <td>Lollipop</td>
+ <td>Nexus 6(仅面向 T-Mobile)</td>
+</tr>
+<tr>
+ <td>LMY48P</td>
+ <td>android-5.1.1_r16</td>
+ <td>Lollipop</td>
+ <td>Nexus 7 (deb)</td>
+</tr>
+<tr>
+ <td>LMY48N</td>
+ <td>android-5.1.1_r15</td>
+ <td>Lollipop</td>
+ <td>Nexus Player</td>
+</tr>
+<tr>
+ <td>LMY48M</td>
+ <td>android-5.1.1_r14</td>
+ <td>Lollipop</td>
+ <td>Nexus 4、Nexus 5、Nexus 6、Nexus 7 (flo)、Nexus 9 (volantis/volantisg)、Nexus 10</td>
+</tr>
+<tr>
+ <td>LVY48E</td>
+ <td>android-5.1.1_r13</td>
+ <td>Lollipop</td>
+ <td>Nexus 6(仅面向 Project Fi)</td>
+</tr>
+<tr>
+ <td>LYZ28J</td>
+ <td>android-5.1.1_r12</td>
+ <td>Lollipop</td>
+ <td>Nexus 6(仅面向 T-Mobile)</td>
+</tr>
+<tr>
+ <td>LMY48J</td>
+ <td>android-5.1.1_r10</td>
+ <td>Lollipop</td>
+ <td>Nexus Player</td>
+</tr>
+<tr>
+ <td>LMY48I</td>
+ <td>android-5.1.1_r9</td>
+ <td>Lollipop</td>
+ <td>Nexus 4、Nexus 5、Nexus 6、Nexus 7 (flo)、Nexus 9 (volantis/volantisg)、Nexus 10</td>
+</tr>
+<tr>
+ <td>LVY48C</td>
+ <td>android-5.1.1_r8</td>
+ <td>Lollipop</td>
+ <td>Nexus 6(仅面向 Project Fi)</td>
+</tr>
+<tr>
+ <td>LMY48G</td>
+ <td>android-5.1.1_r6</td>
+ <td>Lollipop</td>
+ <td>Nexus 7 (flo)</td>
+</tr>
+<tr>
+ <td>LYZ28E</td>
+ <td>android-5.1.1_r5</td>
+ <td>Lollipop</td>
+ <td>Nexus 6(仅面向 T-Mobile)</td>
+</tr>
+<tr>
+ <td>LMY47Z</td>
+ <td>android-5.1.1_r4</td>
+ <td>Lollipop</td>
+ <td>Nexus 6(面向除 T-Mobile(美国)之外的所有运营商)</td>
+</tr>
+<tr>
+ <td>LMY48B</td>
+ <td>android-5.1.1_r3</td>
+ <td>Lollipop</td>
+ <td>Nexus 5</td>
+</tr>
+<tr>
+ <td>LMY47X</td>
+ <td>android-5.1.1_r2</td>
+ <td>Lollipop</td>
+ <td>Nexus 9 (volantis)</td>
+</tr>
+<tr>
+ <td>LMY47V</td>
+ <td>android-5.1.1_r1</td>
+ <td>Lollipop</td>
+ <td>Nexus 7 (flo/grouper)、Nexus 10、Nexus Player</td>
+</tr>
+<tr>
+ <td>LMY47O</td>
+ <td>android-5.1.0_r5</td>
+ <td>Lollipop</td>
+ <td>Nexus 4、Nexus 7 (flo/deb)</td>
+</tr>
+<tr>
+ <td>LMY47M</td>
+ <td>android-5.1.0_r4</td>
+ <td>Lollipop</td>
+ <td>Nexus 6(仅面向 T-Mobile)</td>
+</tr>
+<tr>
+ <td>LMY47I</td>
+ <td>android-5.1.0_r3</td>
+ <td>Lollipop</td>
+ <td>Nexus 5、Nexus 6</td>
+</tr>
+<tr>
+ <td>LMY47E</td>
+ <td>android-5.1.0_r2</td>
+ <td>Lollipop</td>
+ <td>Nexus 6</td>
+</tr>
+<tr>
+ <td>LMY47D</td>
+ <td>android-5.1.0_r1</td>
+ <td>Lollipop</td>
+ <td>Nexus 5、Nexus 6、Nexus 7 (grouper/tilapia)、Nexus 10、Nexus Player</td>
+</tr>
+<tr>
+ <td>LRX22L</td>
+ <td>android-5.0.2_r3</td>
+ <td>Lollipop</td>
+ <td>Nexus 9 (volantis/volantisg)</td>
+</tr>
+<tr>
+ <td>LRX22G</td>
+ <td>android-5.0.2_r1</td>
+ <td>Lollipop</td>
+ <td>Nexus 7 (flo/deb/grouper/tilapia)、Nexus 10</td>
+</tr>
+<tr>
+ <td>LRX22C</td>
+ <td>android-5.0.1_r1</td>
+ <td>Lollipop</td>
+ <td>Nexus 4、Nexus 5、Nexus 6 (shamu)、Nexus 7 (flo)、Nexus 9 (volantis/volantisg)、Nexus 10</td>
+</tr>
+<tr>
+ <td>LRX21V</td>
+ <td>android-5.0.0_r7.0.1</td>
+ <td>Lollipop</td>
+ <td>Nexus Player (fugu)</td>
+</tr>
+<tr>
+ <td>LRX21T</td>
+ <td>android-5.0.0_r6.0.1</td>
+ <td>Lollipop</td>
+ <td>Nexus 4</td>
+</tr>
+<tr>
+ <td>LRX21R</td>
+ <td>android-5.0.0_r5.1.0.1</td>
+ <td>Lollipop</td>
+ <td>Nexus 9 (volantis)</td>
+</tr>
+<tr>
+ <td>LRX21Q</td>
+ <td>android-5.0.0_r5.0.1</td>
+ <td>Lollipop</td>
+ <td>Nexus 9 (volantis)</td>
+</tr>
+<tr>
+ <td>LRX21P</td>
+ <td>android-5.0.0_r4.0.1</td>
+ <td>Lollipop</td>
+ <td>Nexus 7 (flo/grouper)、Nexus 10</td>
+</tr>
+<tr>
+ <td>LRX21O</td>
+ <td>android-5.0.0_r3.0.1</td>
+ <td>Lollipop</td>
+ <td>Nexus 5 (hammerhead)、Nexus 6 (shamu)</td>
+</tr>
+<tr>
+ <td>LRX21M</td>
+ <td>android-5.0.0_r2.0.1</td>
+ <td>Lollipop</td>
+ <td>Nexus Player (fugu)</td>
+</tr>
+<tr>
+ <td>LRX21L</td>
+ <td>android-5.0.0_r1.0.1</td>
+ <td>Lollipop</td>
+ <td>Nexus 9 (volantis)</td>
+</tr>
+<tr>
+ <td>KTU84Q</td>
+ <td>android-4.4.4_r2</td>
+ <td>KitKat</td>
+ <td>Nexus 5 (hammerhead)(仅面向新西兰的 2Degrees、澳大利亚的 Telstra 和印度)</td>
+</tr>
+<tr>
+ <td>KTU84P</td>
+ <td>android-4.4.4_r1</td>
+ <td>KitKat</td>
+ <td>Nexus 5、Nexus 7 (flo/deb/grouper/tilapia)、Nexus 4、Nexus 10</td>
+</tr>
+<tr>
+ <td>KTU84M</td>
+ <td>android-4.4.3_r1.1</td>
+ <td>KitKat</td>
+ <td>Nexus 5 (hammerhead)</td>
+</tr>
+<tr>
+ <td>KTU84L</td>
+ <td>android-4.4.3_r1</td>
+ <td>KitKat</td>
+ <td>Nexus 7 (flo/deb/grouper/tilapia)、Nexus 4、Nexus 1</td>
+</tr>
+<tr>
+ <td>KVT49L</td>
+ <td>android-4.4.2_r2</td>
+ <td>KitKat</td>
+ <td>Nexus 7 (deb Verizon)</td>
+</tr>
+<tr>
+ <td>KOT49H</td>
+ <td>android-4.4.2_r1</td>
+ <td>KitKat</td>
+ <td>Nexus 5、Nexus 7 (flo/deb/grouper/tilapia)、Nexus 4、Nexus 10</td>
+</tr>
+<tr>
+ <td>KOT49E</td>
+ <td>android-4.4.1_r1</td>
+ <td>KitKat</td>
+ <td>Nexus 5、Nexus 7 (flo/deb/grouper/tilapia)、Nexus 4、Nexus 10</td>
+</tr>
+<tr>
+ <td>KRT16S</td>
+ <td>android-4.4_r1.2</td>
+ <td>KitKat</td>
+ <td>Nexus 7 (flo/deb/grouper/tilapia)、Nexus 4、Nexus 1</td>
+</tr>
+<tr>
+ <td>KRT16M</td>
+ <td>android-4.4_r1</td>
+ <td>KitKat</td>
+ <td>Nexus 5 (hammerhead)</td>
+</tr>
+<tr>
+ <td>JLS36I</td>
+ <td>android-4.3.1_r1</td>
+ <td>Jelly Bean</td>
+ <td>Nexus 7 (deb)</td>
+</tr>
+<tr>
+ <td>JLS36C</td>
+ <td>android-4.3_r3</td>
+ <td>Jelly Bean</td>
+ <td>Nexus 7 (deb)</td>
+</tr>
+<tr>
+ <td>JSS15R</td>
+ <td>android-4.3_r2.3</td>
+ <td>Jelly Bean</td>
+ <td>Nexus 7 (flo)</td>
+</tr>
+<tr>
+ <td>JSS15Q</td>
+ <td>android-4.3_r2.2</td>
+ <td>Jelly Bean</td>
+ <td>Nexus 7 (flo)</td>
+</tr>
+<tr>
+ <td>JSS15J</td>
+ <td>android-4.3_r2.1</td>
+ <td>Jelly Bean</td>
+ <td>Nexus 7 (flo/deb)</td>
+</tr>
+<tr>
+ <td>JSR78D</td>
+ <td>android-4.3_r2</td>
+ <td>Jelly Bean</td>
+ <td>Nexus 7 (deb)</td>
+</tr>
+<tr>
+ <td>JWR66Y</td>
+ <td>android-4.3_r1.1</td>
+ <td>Jelly Bean</td>
+ <td>Galaxy Nexus、Nexus 7 (grouper/tilapia)、Nexus 4、Nexus 10</td>
+</tr>
+<tr>
+ <td>JWR66V</td>
+ <td>android-4.3_r1</td>
+ <td>Jelly Bean</td>
+ <td>Galaxy Nexus、Nexus 7 (grouper/tilapia)、Nexus 4、Nexus 10</td>
+</tr>
+<tr>
+ <td>JWR66N</td>
+ <td>android-4.3_r0.9.1</td>
+ <td>Jelly Bean</td>
+ <td>Galaxy Nexus、Nexus 7 (grouper/tilapia/flo)、Nexus 4、Nexus 10</td>
+</tr>
+<tr>
+ <td>JWR66L</td>
+ <td>android-4.3_r0.9</td>
+ <td>Jelly Bean</td>
+ <td>Nexus 7</td>
+</tr>
+<tr>
+ <td>JDQ39E</td>
+ <td>android-4.2.2_r1.2</td>
+ <td>Jelly Bean</td>
+ <td>Nexus 4</td>
+</tr>
+<tr>
+ <td>JDQ39B</td>
+ <td>android-4.2.2_r1.1</td>
+ <td>Jelly Bean</td>
+ <td>Nexus 7</td>
+</tr>
+<tr>
+ <td>JDQ39</td>
+ <td>android-4.2.2_r1</td>
+ <td>Jelly Bean</td>
+ <td>Galaxy Nexus、Nexus 7、Nexus 4、Nexus 10</td>
+</tr>
+<tr>
+ <td>JOP40G</td>
+ <td>android-4.2.1_r1.2</td>
+ <td>Jelly Bean</td>
+ <td>Nexus 4</td>
+</tr>
+<tr>
+ <td>JOP40F</td>
+ <td>android-4.2.1_r1.1</td>
+ <td>Jelly Bean</td>
+ <td>Nexus 10</td>
+</tr>
+<tr>
+ <td>JOP40D</td>
+ <td>android-4.2.1_r1</td>
+ <td>Jelly Bean</td>
+ <td>Galaxy Nexus、Nexus 7、Nexus 4、Nexus 10</td>
+</tr>
+<tr>
+ <td>JOP40C</td>
+ <td>android-4.2_r1</td>
+ <td>Jelly Bean</td>
+ <td>Galaxy Nexus、Nexus 7、Nexus 4、Nexus 10</td>
+</tr>
+<tr>
+ <td>JZO54M</td>
+ <td>android-4.1.2_r2.1</td>
+ <td>Jelly Bean</td>
+ <td></td>
+</tr>
+<tr>
+ <td>JZO54L</td>
+ <td>android-4.1.2_r2</td>
+ <td>Jelly Bean</td>
+ <td></td>
+</tr>
+<tr>
+ <td>JZO54K</td>
+ <td>android-4.1.2_r1</td>
+ <td>Jelly Bean</td>
+ <td>Nexus S、Galaxy Nexus、Nexus 7</td>
+</tr>
+<tr>
+ <td>JRO03S</td>
+ <td>android-4.1.1_r6.1</td>
+ <td>Jelly Bean</td>
+ <td>Nexus 7</td>
+</tr>
+<tr>
+ <td>JRO03R</td>
+ <td>android-4.1.1_r6</td>
+ <td>Jelly Bean</td>
+ <td>Nexus S 4G</td>
+</tr>
+<tr>
+ <td>JRO03O</td>
+ <td>android-4.1.1_r5</td>
+ <td>Jelly Bean</td>
+ <td>Galaxy Nexus</td>
+</tr>
+<tr>
+ <td>JRO03L</td>
+ <td>android-4.1.1_r4</td>
+ <td>Jelly Bean</td>
+ <td>Nexus S</td>
+</tr>
+<tr>
+ <td>JRO03H</td>
+ <td>android-4.1.1_r3</td>
+ <td>Jelly Bean</td>
+ <td></td>
+</tr>
+<tr>
+ <td>JRO03E</td>
+ <td>android-4.1.1_r2</td>
+ <td>Jelly Bean</td>
+ <td>Nexus S</td>
+</tr>
+<tr>
+ <td>JRO03D</td>
+ <td>android-4.1.1_r1.1</td>
+ <td>Jelly Bean</td>
+ <td>Nexus 7</td>
+</tr>
+<tr>
+ <td>JRO03C</td>
+ <td>android-4.1.1_r1</td>
+ <td>Jelly Bean</td>
+ <td>Galaxy Nexus</td>
+</tr>
+<tr>
+ <td>IMM76L</td>
+ <td>android-4.0.4_r2.1</td>
+ <td>Ice Cream Sandwich</td>
+ <td> </td>
+</tr>
+<tr>
+ <td>IMM76K</td>
+ <td>android-4.0.4_r2</td>
+ <td>Ice Cream Sandwich</td>
+ <td>Galaxy Nexus</td>
+</tr>
+<tr>
+ <td>IMM76I</td>
+ <td>android-4.0.4_r1.2</td>
+ <td>Ice Cream Sandwich</td>
+ <td>Galaxy Nexus</td>
+</tr>
+<tr>
+ <td>IMM76D</td>
+ <td>android-4.0.4_r1.1</td>
+ <td>Ice Cream Sandwich</td>
+ <td>Nexus S、Nexus S 4G、Galaxy Nexus</td>
+</tr>
+<tr>
+ <td>IMM76</td>
+ <td>android-4.0.4_r1</td>
+ <td>Ice Cream Sandwich</td>
+ <td></td>
+</tr>
+<tr>
+ <td>IML77</td>
+ <td>android-4.0.3_r1.1</td>
+ <td>Ice Cream Sandwich</td>
+ <td></td>
+</tr>
+<tr>
+ <td>IML74K</td>
+ <td>android-4.0.3_r1</td>
+ <td>Ice Cream Sandwich</td>
+ <td>Nexus S</td>
+</tr>
+<tr>
+ <td>ICL53F</td>
+ <td>android-4.0.2_r1</td>
+ <td>Ice Cream Sandwich</td>
+ <td>Galaxy Nexus</td>
+</tr>
+<tr>
+ <td>ITL41F</td>
+ <td>android-4.0.1_r1.2</td>
+ <td>Ice Cream Sandwich</td>
+ <td>Galaxy Nexus</td>
+</tr>
+<tr>
+ <td>ITL41D</td>
+ <td>android-4.0.1_r1.1</td>
+ <td>Ice Cream Sandwich</td>
+ <td>Galaxy Nexus</td>
+</tr>
+<tr>
+ <td>ITL41D</td>
+ <td>android-4.0.1_r1</td>
+ <td>Ice Cream Sandwich</td>
+ <td>Galaxy Nexus</td>
+</tr>
+<tr>
+ <td>GWK74</td>
+ <td>android-2.3.7_r1</td>
+ <td>Gingerbread</td>
+ <td>Nexus S 4G</td>
+</tr>
+<tr>
+ <td>GRK39F</td>
+ <td>android-2.3.6_r1</td>
+ <td>Gingerbread</td>
+ <td>Nexus One、Nexus S</td>
+</tr>
+<tr>
+ <td>GRK39C</td>
+ <td>android-2.3.6_r0.9</td>
+ <td>Gingerbread</td>
+ <td>Nexus S</td>
+</tr>
+<tr>
+ <td>GRJ90</td>
+ <td>android-2.3.5_r1</td>
+ <td>Gingerbread</td>
+ <td>Nexus S 4G</td>
+</tr>
+<tr>
+ <td>GRJ22</td>
+ <td>android-2.3.4_r1</td>
+ <td>Gingerbread</td>
+ <td>Nexus One、Nexus S、Nexus S 4G</td>
+</tr>
+<tr>
+ <td>GRJ06D</td>
+ <td>android-2.3.4_r0.9</td>
+ <td>Gingerbread</td>
+ <td>Nexus S 4G</td>
+</tr>
+<tr>
+ <td>GRI54</td>
+ <td>android-2.3.3_r1.1</td>
+ <td>Gingerbread</td>
+ <td>Nexus S</td>
+</tr>
+<tr>
+ <td>GRI40</td>
+ <td>android-2.3.3_r1</td>
+ <td>Gingerbread</td>
+ <td>Nexus One、Nexus S</td>
+</tr>
+<tr>
+ <td>GRH78C</td>
+ <td>android-2.3.2_r1</td>
+ <td>Gingerbread</td>
+ <td>Nexus S</td>
+</tr>
+<tr>
+ <td>GRH78</td>
+ <td>android-2.3.1_r1</td>
+ <td>Gingerbread</td>
+ <td>Nexus S</td>
+</tr>
+<tr>
+ <td>GRH55</td>
+ <td>android-2.3_r1</td>
+ <td>Gingerbread</td>
+ <td>使用 Gingerbread 最早期版本的设备、Nexus S</td>
+</tr>
+<tr>
+ <td>FRK76C</td>
+ <td>android-2.2.3_r2</td>
+ <td>Froyo</td>
+ <td> </td>
+</tr>
+<tr>
+ <td>FRK76</td>
+ <td>android-2.2.3_r1</td>
+ <td>Froyo</td>
+ <td></td>
+</tr>
+<tr>
+ <td>FRG83G</td>
+ <td>android-2.2.2_r1</td>
+ <td>Froyo</td>
+ <td>Nexus One</td>
+</tr>
+<tr>
+ <td>FRG83D</td>
+ <td>android-2.2.1_r2</td>
+ <td>Froyo</td>
+ <td>Nexus One</td>
+</tr>
+<tr>
+ <td>FRG83</td>
+ <td>android-2.2.1_r1</td>
+ <td>Froyo</td>
+ <td>Nexus One</td>
+</tr>
+<tr>
+ <td>FRG22D</td>
+ <td>android-2.2_r1.3</td>
+ <td>Froyo</td>
+ <td></td>
+</tr>
+<tr>
+ <td>FRG01B</td>
+ <td>android-2.2_r1.2</td>
+ <td>Froyo</td>
+ <td></td>
+</tr>
+<tr>
+ <td>FRF91</td>
+ <td>android-2.2_r1.1</td>
+ <td>Froyo</td>
+ <td>Nexus One</td>
+</tr>
+<tr>
+ <td>FRF85B</td>
+ <td>android-2.2_r1</td>
+ <td>Froyo</td>
+ <td>Nexus One</td>
+</tr>
+<tr>
+ <td>EPF21B</td>
+ <td>android-2.1_r2.1p2</td>
+ <td>Eclair</td>
+ <td> </td>
+</tr>
+<tr>
+ <td>ESE81</td>
+ <td>android-2.1_r2.1s</td>
+ <td>Eclair</td>
+ <td></td>
+</tr>
+<tr>
+ <td>EPE54B</td>
+ <td>android-2.1_r2.1p</td>
+ <td>Eclair</td>
+ <td>Nexus One</td>
+</tr>
+<tr>
+ <td>ERE27</td>
+ <td>android-2.1_r2</td>
+ <td>Eclair</td>
+ <td>Nexus One</td>
+</tr>
+<tr>
+ <td>ERD79</td>
+ <td>android-2.1_r1</td>
+ <td>Eclair</td>
+ <td>Nexus One</td>
+</tr>
+<tr>
+ <td>ESD56</td>
+ <td>android-2.0.1_r1</td>
+ <td>Eclair</td>
+ <td></td>
+</tr>
+<tr>
+ <td>ESD20</td>
+ <td>android-2.0_r1</td>
+ <td>Eclair</td>
+ <td> </td>
+</tr>
+<tr>
+ <td>DMD64</td>
+ <td>android-1.6_r1.5</td>
+ <td>Donut</td>
+ <td> </td>
+</tr>
+<tr>
+ <td>DRD20</td>
+ <td>android-1.6_r1.4</td>
+ <td></td>
+ <td></td>
+</tr>
+<tr>
+ <td>DRD08</td>
+ <td>android-1.6_r1.3</td>
+ <td></td>
+ <td></td>
+</tr>
+<tr>
+ <td>DRC92</td>
+ <td>android-1.6_r1.2</td>
+ <td></td>
+ <td></td>
+</tr>
+</tbody>
+</table>
+<p>froyo、gingerbread、ics-mr0、ics-mr1、jb-dev、jb-mr1-dev、jb-mr1.1-dev、jb-mr2-dev 和 kitkat-dev 等分支代表与经过 Google 测试的配置不完全一致的开发分支。除官方命名的版本之外,它们可能还包含尚未经过全面测试的各种更改。</p>
+
+<p>要区分各个版本,您可以发出以下命令并指定两个分支标记,以获取与每个项目相关联的更改列表:</p>
+
+<pre><code>$ repo forall -pc 'git log --no-merges --oneline branch-1..branch-2'</code></pre>
+
+<p>例如:</p>
+
+<pre><code>$ repo forall -pc 'git log --no-merges --oneline android-4.4.2_r2..android-4.4.2_r1'</code></pre>
+
+<p>要输出到文本文件,请运行以下命令:</p>
+
+<pre><code>repo forall -pc 'git log --no-merges --oneline android-4.4.2_r2..android-4.4.2_r1' &gt; /tmp/android-4.4.2_r2-android-4.4.2_r1-diff.txt</code></pre>
+
+<h2 id="honeycomb-gpl-modules">Honeycomb GPL 模块</h2>
+<p>Honeycomb 的整个平台源代码未对外公开。不过,遵循 GPL 和 LGPL 许可的某些 Honeycomb 模块已对外公开,对应于如下的标记:</p>
+
+<table>
+<thead>
+<tr>
+<th>细分版本</th>
+<th>标记</th>
+<th>备注</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>HRI39</td>
+<td>android-3.0_r1</td>
+<td>Honeycomb 最早期版本</td>
+</tr>
+<tr>
+<td>HRI66</td>
+<td>android-3.0_r1.1</td>
+<td></td>
+</tr>
+<tr>
+<td>HWI69</td>
+<td>android-3.0_r1.2</td>
+<td></td>
+</tr>
+<tr>
+<td>HRI83</td>
+<td>android-3.0_r1.3</td>
+<td></td>
+</tr>
+<tr>
+<td>HMJ37</td>
+<td>android-3.1_r1</td>
+<td></td>
+</tr>
+<tr>
+<td>HTJ85B</td>
+<td>android-3.2_r1</td>
+<td></td>
+</tr>
+<tr>
+<td>HTK55D</td>
+<td>android-3.2.1_r1</td>
+<td></td>
+</tr>
+<tr>
+<td>HTK75D</td>
+<td>android-3.2.1_r2</td>
+<td></td>
+</tr>
+<tr>
+<td>HLK75C</td>
+<td>android-3.2.2_r1</td>
+<td></td>
+</tr>
+<tr>
+<td>HLK75D</td>
+<td>android-3.2.2_r2</td>
+<td></td>
+</tr>
+<tr>
+<td>HLK75F</td>
+<td>android-3.2.4_r1</td>
+<td></td>
+</tr>
+<tr>
+<td>HLK75H</td>
+<td>android-3.2.6_r1</td>
+<td>Honeycomb 的最新版本</td>
+</tr>
+</tbody>
+</table>
+<p>请注意,我们未提供刚好包含以上模块的清单。不过,我们提供的有些清单允许构建这些组件。以下命令适用于 3.0_r1.1,您可以通过切换 git checkout 参数来使用其他版本,还可以在必要时使用 repo init 中的 -m 参数。对于非 GPL 项目,git checkout 命令会返回错误,因为它找不到相应的标记。</p>
+<pre><code>$ repo init -b master -m base-for-3.0-gpl.xml
+$ repo sync
+$ repo forall -c git checkout android-3.0_r1.1
+</code></pre>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/building-kernels.html b/zh-cn/source/building-kernels.html
new file mode 100644
index 00000000..a9644ab9
--- /dev/null
+++ b/zh-cn/source/building-kernels.html
@@ -0,0 +1,243 @@
+<html devsite><head>
+ <title>编译内核</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>本页详细介绍了如何仅编译内核。以下说明假设您尚未下载整个 AOSP;如果您已完成下载,则可以跳过 <code>git clone</code> 对应的步骤,但下载内核源代码的步骤除外。</p>
+
+<p>本部分中的所有示例均使用 <a href="/source/devices.html#hikey-boards">hikey</a> 内核。</p>
+
+<h2 id="figuring-out-which-kernel-to-build">选择内核</h2>
+<p>此表列出了内核源代码和二进制文件的名称及所在位置:<table>
+ <tbody><tr>
+ <th>设备</th>
+ <th>二进制文件所在的位置</th>
+ <th>源代码所在的位置</th>
+ <th>编译配置</th>
+ </tr>
+ <tr>
+ <td>marlin</td>
+ <td>device/google/marlin-kernel</td>
+ <td>kernel/msm</td>
+ <td>marlin_defconfig</td>
+ </tr>
+ <tr>
+ <td>sailfish</td>
+ <td>device/google/marlin-kernel</td>
+ <td>kernel/msm</td>
+ <td>marlin_defconfig</td>
+ </tr>
+ <tr>
+ <td>hikey</td>
+ <td>device/linaro/hikey-kernel</td>
+ <td>kernel/hikey-linaro</td>
+ <td>hikey_defconfig</td>
+ </tr>
+ <tr>
+ <td>angler</td>
+ <td>device/huawei/angler-kernel</td>
+ <td>kernel/msm</td>
+ <td>angler_defconfig</td>
+ </tr>
+ <tr>
+ <td>bullhead</td>
+ <td>device/lge/bullhead-kernel</td>
+ <td>kernel/msm</td>
+ <td>bullhead_defconfig</td>
+ </tr>
+ <tr>
+ <td>shamu</td>
+ <td>device/moto/shamu-kernel</td>
+ <td>kernel/msm</td>
+ <td>shamu_defconfig</td>
+ </tr>
+ <tr>
+ <td>fugu</td>
+ <td>device/asus/fugu-kernel</td>
+ <td>kernel/x86_64</td>
+ <td>fugu_defconfig</td>
+ </tr>
+ <tr>
+ <td>volantis</td>
+ <td>device/htc/flounder-kernel</td>
+ <td>kernel/tegra</td>
+ <td>flounder_defconfig</td>
+ </tr>
+ <tr>
+ <td>hammerhead</td>
+ <td>device/lge/hammerhead-kernel</td>
+ <td>kernel/msm</td>
+ <td>hammerhead_defconfig</td>
+ </tr>
+ <tr>
+ <td>flo</td>
+ <td>device/asus/flo-kernel/kernel</td>
+ <td>kernel/msm</td>
+ <td>flo_defconfig</td>
+ </tr>
+ <tr>
+ <td>deb</td>
+ <td>device/asus/flo-kernel/kernel</td>
+ <td>kernel/msm</td>
+ <td>flo_defconfig</td>
+ </tr>
+ <tr>
+ <td>manta</td>
+ <td>device/samsung/manta/kernel</td>
+ <td>kernel/exynos</td>
+ <td>manta_defconfig</td>
+ </tr>
+ <tr>
+ <td>mako</td>
+ <td>device/lge/mako-kernel/kernel</td>
+ <td>kernel/msm</td>
+ <td>mako_defconfig</td>
+ </tr>
+ <tr>
+ <td>grouper</td>
+ <td>device/asus/grouper/kernel</td>
+ <td>kernel/tegra</td>
+ <td>tegra3_android_defconfig</td>
+ </tr>
+ <tr>
+ <td>tilapia</td>
+ <td>device/asus/grouper/kernel</td>
+ <td>kernel/tegra</td>
+ <td>tegra3_android_defconfig</td>
+ </tr>
+ <tr>
+ <td>maguro</td>
+ <td>device/samsung/tuna/kernel</td>
+ <td>kernel/omap</td>
+ <td>tuna_defconfig</td>
+ </tr>
+ <tr>
+ <td>toro</td>
+ <td>device/samsung/tuna/kernel</td>
+ <td>kernel/omap</td>
+ <td>tuna_defconfig</td>
+ </tr>
+ <tr>
+ <td>panda</td>
+ <td>device/ti/panda/kernel</td>
+ <td>kernel/omap</td>
+ <td>panda_defconfig</td>
+ </tr>
+ <tr>
+ <td>stingray</td>
+ <td>device/moto/wingray/kernel</td>
+ <td>kernel/tegra</td>
+ <td>stingray_defconfig</td>
+ </tr>
+ <tr>
+ <td>wingray</td>
+ <td>device/moto/wingray/kernel</td>
+ <td>kernel/tegra</td>
+ <td>stingray_defconfig</td>
+ </tr>
+ <tr>
+ <td>crespo</td>
+ <td>device/samsung/crespo/kernel</td>
+ <td>kernel/samsung</td>
+ <td>herring_defconfig</td>
+ </tr>
+ <tr>
+ <td>crespo4g</td>
+ <td>device/samsung/crespo/kernel</td>
+ <td>kernel/samsung</td>
+ <td>herring_defconfig</td>
+ </tr>
+</tbody></table>
+
+</p><p>确定要使用的设备项目之后,请查看内核二进制文件的 Git 日志。设备项目采用 <code>device/&lt;vendor&gt;/&lt;name&gt;</code> 形式。</p>
+
+<pre><code>$ git clone https://android.googlesource.com/kernel/hikey-linaro
+$ cd hikey-linaro
+$ git log --max-count=1 kernel
+</code></pre>
+
+<p>内核二进制文件的提交消息中包含用于编译二进制文件的内核源代码的部分 Git 日志。该日志中的第一个条目是最新内容(也即用于编译内核的条目)。请记下提交消息,因为您在后续步骤中会用得到该消息。</p>
+
+<h2 id="id-version">确定内核版本</h2>
+
+<p>要确定系统映像中使用的内核版本,请对内核文件运行以下命令:</p>
+
+<pre><code>$ dd if=kernel bs=1 skip=$(LC_ALL=C grep -a -b -o $'\x1f\x8b\x08\x00\x00\x00\x00\x00' kernel | cut -d ':' -f 1) | zgrep -a 'Linux version'
+</code></pre>
+
+<p>对于 Nexus 5 (hammerhead),请运行以下命令:</p>
+<pre><code>$ dd if=zImage-dtb bs=1 skip=$(LC_ALL=C od -Ad -x -w2 zImage-dtb | grep 8b1f | cut -d ' ' -f1 | head -1) | zgrep -a 'Linux version'
+</code></pre>
+
+<h2 id="downloading-sources">下载源代码</h2>
+<p>使用适当的 <code>git clone</code> 命令为您要编译的内核下载源代码:</p>
+
+<pre><code>$ git clone https://android.googlesource.com/kernel/common.git
+$ git clone https://android.googlesource.com/kernel/hikey-linaro
+$ git clone https://android.googlesource.com/kernel/x86_64.git
+$ git clone https://android.googlesource.com/kernel/exynos.git
+$ git clone https://android.googlesource.com/kernel/goldfish.git
+$ git clone https://android.googlesource.com/kernel/msm.git
+$ git clone https://android.googlesource.com/kernel/omap.git
+$ git clone https://android.googlesource.com/kernel/samsung.git
+$ git clone https://android.googlesource.com/kernel/tegra.git
+</code></pre>
+
+<ul>
+<li><code>goldfish</code> 项目包含适用于所模拟的平台的内核源代码。</li>
+<li><code>msm</code> 项目包含适用于 ADP1、ADP2、Nexus One、Nexus 4、Nexus 5、Nexus 6、Nexus 5X、Nexus 6P、Nexus 7 (2013)、Pixel 和 Pixel XL 的源代码,可用作使用 Qualcomm MSM 芯片组的起点。</li>
+<li><code>omap</code> 项目用于 PandaBoard 和 Galaxy Nexus,可用作使用 TI OMAP 芯片组的起点。</li>
+<li><code>samsung</code> 项目用于 Nexus S,可用作使用 Samsung Hummingbird 芯片组的起点。</li>
+<li><code>tegra</code> 项目用于 Xoom、Nexus 7 (2012)、Nexus 9,可用作使用 NVIDIA Tegra 芯片组的起点。</li>
+<li><code>exynos</code> 项目包含适用于 Nexus 10 的内核源代码,可用作使用 Samsung Exynos 芯片组的起点。</li>
+<li><code>x86_64</code> 项目包含适用于 Nexus Player 的内核源代码,可用作使用 Intel x86_64 芯片组的起点。</li>
+<li><code>hikey-linaro</code> 项目用于 HiKey 参考板,可用作使用 HiSilicon 620 芯片组的起点。</li>
+</ul>
+
+<h2 id="downloading-a-prebuilt-gcc">下载预编译 gcc</h2>
+<p>确保预编译工具链位于您的以下路径中:</p>
+<pre>$ export PATH=$(pwd)/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin:$PATH</pre>
+<p>或</p>
+<pre>$ export PATH=$(pwd)/prebuilts/gcc/darwin-x86/arm/arm-eabi-4.6/bin:$PATH</pre>
+
+<p>在 Linux 主机上,如果您没有 Android 源代码树,则可以从以下路径下载预编译工具链:</p><pre>$ git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6</pre>
+
+<h2 id="building">编译内核</h2>
+<p>当您了解了内核的最后一条提交消息并已成功下载内核源代码和预编译的 gcc 后,就可以编译内核了。以下编译命令使用了 hikey 内核:</p>
+<pre><code>$ export ARCH=arm64
+$ export CROSS_COMPILE=aarch64-linux-android-
+$ cd hikey-linaro
+$ git checkout -b android-hikey-linaro-4.1 origin/android-hikey-linaro-4.1
+$ make hikey_defconfig
+$ make
+</code></pre>
+
+<p>要编译不同的内核,只需将 <code>hikey-linaro</code> 替换为您要编译的内核的名称即可。</p>
+
+<p>映像会输出到 <code>arch/arm64/boot/Image</code> 目录;内核二进制文件会输出到 <code>arch/arm64/boot/dts/hisilicon/hi6220-hikey.dtb</code> 文件。请将 <code>Image</code> 目录和 <code>hi6220-hikey.dtb</code> 文件复制到 <code>hikey-kernel</code> 目录。</p>
+
+<p>或者,您可以在使用 <code>make bootimage</code>(或编译启动映像的任何其他 <code>make</code> 命令行)时添加 <code>TARGET_PREBUILT_KERNEL</code> 变量。所有设备均支持该变量,因为它是通过 <code>device/common/populate-new-device.sh</code> 进行设置的。例如:</p>
+
+<pre><code>$ export TARGET_PREBUILT_KERNEL=$your_kernel_path/arch/arm/boot/zImage-dtb
+</code></pre>
+
+<p class="note"><strong>注意</strong>:内核名称因设备而异。要找到内核的正确文件名,请参阅内核源代码中的 <code>device/&lt;vendor&gt;/&lt;name&gt;</code>。</p>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/building.html b/zh-cn/source/building.html
new file mode 100644
index 00000000..cbca024a
--- /dev/null
+++ b/zh-cn/source/building.html
@@ -0,0 +1,164 @@
+<html devsite><head>
+ <title>编译准备工作</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>以下关于编译 Android 源代码树的说明适用于所有分支,包括 <code>master</code>。编译命令的基本顺序如下:</p>
+
+<p class="note"><strong>注意</strong>:如果您要编译 Android 6.0 或更高版本,请参阅<a href="jack.html">使用 Jack 编译</a>,了解这种新的默认工具链。</p>
+
+<h2 id="obtaining-proprietary-binaries">下载专有二进制文件</h2>
+
+<p>您不能仅通过纯源代码来使用 AOSP,要运行 AOSP,还需要与硬件相关的其他专有库,例如用于硬件图形加速的专有库。如需其他资源的下载链接和<a href="requirements.html#binaries">设备二进制文件要求</a>,请参阅以下各部分。</p>
+
+<h3 id="downloading-proprietary-binaries">下载专有二进制文件</h3>
+
+<p>对于运行带标记的 AOSP 版本分支的受支持设备,您可以从 <a href="https://developers.google.com/android/nexus/drivers">Google 的 Nexus 驱动程序页面</a>下载相关的官方二进制文件。有了这些二进制文件,您将有权使用采用非开放源代码的其他硬件功能。要编译 AOSP 的 master 分支,请使用 <a href="https://developers.google.com/android/nexus/blobs-preview">Nexus 设备的二进制文件预览</a>。在针对某种设备编译 master 分支时,请使用适用于<a href="/source/build-numbers.html">最新编号版本</a>的二进制文件或具有最新日期的二进制文件。</p>
+
+<h3 id="extracting-proprietary-binaries">解压专有二进制文件</h3>
+
+<p>每组二进制文件都是压缩包中的一个自解压脚本。解压每个压缩包,从源代码树的根目录运行附带的自解压脚本,然后确认您同意附带的许可协议的条款。二进制文件及其对应的 Makefile 将会安装在源代码树的 <code>vendor/</code> 层次结构中。</p>
+
+<h3 id="cleaning-up">清理</h3>
+
+<p>为了确保新安装的二进制文件在解压后会被适当考虑在内,请使用以下命令删除所有以前编译操作的已有输出:</p>
+<pre><code>$ make clobber
+</code></pre>
+
+<h2 id="initialize">设置环境</h2>
+<p>使用 <code>envsetup.sh</code> 脚本初始化环境。请注意,将 <code>source</code> 替换成 <code>.</code>(一个点)可以省去一些字符,这种简写形式在文档中更为常用。</p>
+<pre><code>$ source build/envsetup.sh
+</code></pre>
+<p>或</p>
+<pre><code>$ . build/envsetup.sh
+</code></pre>
+
+<h2 id="choose-a-target">选择目标</h2>
+<p>使用 <code>lunch</code> 选择要编译的目标。确切的配置可作为参数进行传递。例如以下命令:</p>
+<pre><code>$ lunch aosp_arm-eng
+</code></pre>
+<p>该命令表示针对模拟器进行完整编译,并且所有调试功能均处于启用状态。</p>
+<p>如果您没有提供任何参数就运行命令,<code>lunch</code> 将提示您从菜单中选择一个目标。</p>
+<p>所有编译目标都采用 <code>BUILD-BUILDTYPE</code> 形式,其中 <code>BUILD</code> 是表示特定功能组合的代号。</p>
+
+<p>BUILDTYPE 是以下类型之一:</p>
+<table>
+<thead>
+<tr>
+<th>编译类型</th>
+<th>使用情况</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>user</td>
+<td>权限受限;适用于生产环境</td>
+</tr>
+<tr>
+<td>userdebug</td>
+<td>与“user”类似,但具有 root 权限和可调试性;是进行调试时的首选编译类型</td>
+</tr>
+<tr>
+<td>eng</td>
+<td>具有额外调试工具的开发配置</td>
+</tr>
+</tbody>
+</table>
+<p>要详细了解如何针对实际硬件进行编译以及如何在实际硬件上运行版本,请参阅<a href="running.html">运行版本</a>。</p>
+
+<h2 id="build-the-code">编译代码</h2>
+
+<p>请注意,本部分只是一个摘要,用于确保设置已完成。如需关于编译 Android 的详细说明,请参阅<a href="running.html">运行编译系统</a>。</p>
+
+<p>您可以使用 <code>make</code> 编译任何代码。GNU Make 可以借助 <code>-jN</code> 参数处理并行任务,通常使用的任务数 N 介于编译时所用计算机上硬件线程数的 1-2 倍之间。例如,在一台双核 E5520 计算机(2 个 CPU,每个 CPU 4 个内核,每个内核 2 个线程)上,要实现最快的编译速度,可以使用介于 <code>make -j16</code> 到 <code>make -j32</code> 之间的命令。</p>
+
+<pre>
+$ make -j4
+</pre>
+
+<h2 id="run-it">开始运行!</h2>
+
+<p>您可以在模拟器上运行自己的版本,也可以将其刷到设备上。请注意,因为您之前已使用 <code>lunch</code> 选择编译目标,因此很可能无法在编译目标之外的目标上运行您的版本。</p>
+
+<p class="note"><strong>注意</strong>:请记得<a href="#obtaining-proprietary-binaries">下载专有二进制文件</a>,否则您的版本将无法在目标硬件上成功启动。如果您在此时下载二进制 Blob,则需要将其解压、<code>make clobber</code> 并重新编译。</p>
+
+<h3 id="flash-a-device">使用 fastboot 刷机</h3>
+
+<p>要对设备进行刷机,您需要使用 <code>fastboot</code>(编译成功后,它应该会包含在您的路径中)。如需相关说明,请参阅<a href="running.html#flashing-a-device">对设备进行刷机</a>。</p>
+
+<h3 id="emulate-an-android-device">模拟 Android 设备</h3>
+
+<p>编译流程会自动将模拟器添加到您的路径中。要运行模拟器,请输入以下命令:</p>
+
+<pre>
+$ emulator
+</pre>
+
+<h2 id="troubleshooting-common-build-errors">排查常见编译错误</h2>
+
+<h3 id="wrong-java-version">Java 版本不正确</h3>
+
+<p>如果您尝试编译的 Android 版本与您的 Java 版本不一致,<code>make</code> 将会终止并显示诸如以下消息:</p>
+<pre>
+************************************************************
+You are attempting to build with the incorrect version
+of java.
+
+Your version is: WRONG_VERSION.
+The correct version is: RIGHT_VERSION.
+
+Please follow the machine setup instructions at
+ https://source.android.com/source/initializing.html
+************************************************************
+</pre>
+
+<p>这可能是由以下原因引起的:</p>
+
+<ul>
+<li>未能安装 <a href="requirements.html#jdk">JDK 要求</a>中指定的正确 JDK。</li>
+<li>之前安装的另一个 JDK 出现在您的路径中。将正确的 JDK 附加到路径开头,或者移除有问题的 JDK。</li>
+</ul>
+
+<h3 id="python-version-3">Python 版本 3</h3>
+
+<p>Repo 是基于 Python 2.x 中的特定功能构建的,但遗憾的是与 Python 3 不兼容。要使用 Repo,请安装 Python 2.x:</p>
+
+<pre>
+$ apt-get install python
+</pre>
+
+<h3 id="case-insensitive-filesystem">不区分大小写的文件系统</h3>
+
+<p>您在 Mac OS 中的 HFS 文件系统上进行编译时,可能会遇到诸如以下错误:</p>
+<pre>
+************************************************************
+You are building on a case-insensitive filesystem.
+Please move your source tree to a case-sensitive filesystem.
+************************************************************
+</pre>
+<p>请按照<a href="initializing.html">初始化编译环境</a>中的相关说明创建区分大小写的磁盘映像。</p>
+
+<h3 id="no-usb-permission">没有 USB 权限</h3>
+
+<p>在大多数 Linux 系统中,无特权的用户默认情况下无法使用 USB 端口。如果您看到权限遭拒错误,请按照<a href="initializing.html">初始化编译环境</a>中的相关说明配置 USB 使用权限。</p>
+
+<p>如果 adb 已在运行,并且在这些规则设置完成后无法连接到设备,您可以使用 <code>adb kill-server</code> 将其终止。这将使 adb 采用新的配置重启。</p>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/code-lines.html b/zh-cn/source/code-lines.html
new file mode 100644
index 00000000..0e0648e2
--- /dev/null
+++ b/zh-cn/source/code-lines.html
@@ -0,0 +1,109 @@
+<html devsite><head>
+ <title>代码流水线、分支和版本</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>
+Android 开放源代码项目 (AOSP) 维护着一个全面的软件堆栈,原始设备制造商 (OEM) 和其他设备实现者可移植并在自己的硬件上运行该堆栈。为了维持 Android 项目的质量,Google 分派了全职工程师、产品经理、界面设计师、质量保证测试人员以及更多相关人员(将新型设备推向市场所需的所有其他角色)来负责相关工作。
+</p>
+
+<p>
+相应地,我们还维护着多个“代码流水线”,以便明确区分当前稳定版 Android 与不稳定的实验性版本。我们将 Android 代码流水线的开放源代码管理和维护工作纳入到了更大的产品开发周期中。
+</p>
+
+<p>
+下图从概念层面显示了 AOSP 如何管理代码和版本。我们将它们称为“代码流水线”而不是“分支”,只是因为在任何特定时刻,特定“代码流水线”都可能有多个分支。例如,当某个版本定型时,它可能会(也可能不会)根据当前需要变为新的分支。
+</p>
+<ol>
+ <li>
+ <p>在任何特定时刻,Android 平台都有一个当前最新版本。该版本通常作为树中的一个分支。
+ </p>
+ </li>
+ <li>
+ <p>设备制造商和贡献者会以当前最新版本为基础来修复错误、发布新设备、试验新功能等。
+ </p>
+ </li>
+ <li>
+ <p>与此同时,Google 会根据产品的需求和目标,在内部开发下一版 Android 平台和框架。开发下一版 Android 时,我们会与设备合作伙伴协作,在旗舰设备上推出新版 Android,旗舰设备的规格经过深思熟虑,旨在推动 Android 朝着我们希望的方向发展。
+ </p>
+ </li>
+ <li>
+ <p>当第“n+1”版准备就绪时,它就会发布到公开源代码树,并成为新的最新版本。
+ </p>
+ </li>
+</ol>
+ <img src="/images/code-lines.png" alt="code-line diagram" id="figure1"/>
+<p class="img-caption">
+ <strong>图 1.</strong> AOSP 代码和版本</p>
+<h2 id="terms-and-caveats">条款和注意事项</h2>
+<ul>
+ <li>
+ <p><em></em>一个版本对应一个正式版 Android 平台,如 1.5、2.1 等等。一般来说,一个平台版本对应于 AndroidManifest.xml 文件 <code>SdkVersion</code> 字段中的版本(如源代码树的 <code>frameworks/base/api</code> 中所定义)。
+ </p>
+ </li>
+ <li>
+ <p><em></em>上游项目是指 Android 堆栈从中提取代码的开放源代码项目。这包括一些著名的项目,如 Linux 内核和 WebKit。随着发展,我们也在引入一些半自主性 Android 项目(如 ART、Android SDK 工具、Bionic 等)作为“上游”项目进行开发。一般情况下,这些项目完全是在公开树中开发的。对于某些上游项目,开发是通过直接为上游项目本身做贡献来完成的。如需了解详情,请参阅<a href="submit-patches.html#upstream-projects">上游项目</a>。在这两种情况下,快照会定期纳入版本中。
+ </p>
+ </li>
+ <li>
+ <p>在任何时候,版本代码流水线(实际上可能由 Git 中的多个真实存在的分支组成)都被视为给定 Android 平台版本的唯一规范源代码。原始设备制造商 (OEM) 和开发设备的其他组织应该仅从版本分支中获取源代码。
+ </p>
+ </li>
+ <li>
+ <p>“实验性”代码流水线是为了收集社区带来的更改,从而在保持稳定性的基础上反复进行改进。
+ </p>
+ </li>
+ <li>
+ <p>被认定为稳定的更改最终会提取到版本分支中。请注意,这仅适用于错误修复、应用改进和不影响平台 API 的其他更改。
+ </p>
+ </li>
+ <li>
+ <p>在必要时,更改将从上游项目(包括 Android“上游”项目)提取到版本分支中。
+ </p>
+ </li>
+ <li>
+ <p>第“n+1”版(即框架和平台 API 的下一个重大版本)将由 Google 在内部开发。如需了解详情,请参阅<a href="#about-private-code-lines">私密代码流水线简介</a>。
+ </p>
+ </li>
+ <li>
+ <p>在必要时,更改将从上游、版本和实验性分支提取到 Google 的私密分支。
+ </p>
+ </li>
+ <li>
+ <p>当下一版本的平台 API 已经稳定并经过全面测试后,Google 会针对下一版平台定型一个版本。(具体来说,这指的是一个新的 <code>SdkVersion</code>。)这个版本也将对应于作为公开版本分支的内部代码流水线和新的当前平台代码流水线。
+ </p>
+ </li>
+ <li>
+ <p>当某个新的平台版本定型时,Google 会同时创建相应的实验性代码流水线。
+ </p>
+ </li>
+</ul>
+
+<h2 id="about-private-code-lines">不公开代码流水线简介</h2>
+<p>上述源代码管理策略谈到了 Google 会维护一个不公开的代码流水线。这样做是为了将注意力集中在 Android 的当前公开版本上。
+</p>
+<p>原始设备制造商 (OEM) 和其他设备制造商自然希望发布搭载最新版 Android 的设备。同样,如非必要,应用开发者也不希望处理更多个平台版本。与此同时,Google 要负责把握 Android 作为平台和产品的战略方向。我们的方法侧重于在少量旗舰设备上推进功能的演化,同时确保与 Android 相关的知识产权得到妥善保护。
+</p>
+<p>如此一来,Google 经常掌握有来自第三方的机密信息。在确保采取适当的保护措施之前,我们必须避免泄露敏感功能。此外,同时存在太多平台版本会给平台带来真正的风险。考虑到这些因素,我们构建了开放源代码项目(包含第三方贡献的内容),以专注于目前公开的稳定版 Android。下一版平台的“深度开发”将会私下进行,直到一切就绪,最终成为正式版本。
+</p>
+<p>我们意识到,许多贡献者不同意这种做法。我们尊重其他人可能有不同的观点;但这是我们认为的最佳方式,我们也选择这种方法来进行实现。
+</p>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/code-style.html b/zh-cn/source/code-style.html
new file mode 100644
index 00000000..1460d3f4
--- /dev/null
+++ b/zh-cn/source/code-style.html
@@ -0,0 +1,461 @@
+<html devsite><head>
+ <title>面向贡献者的代码样式指南</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>以下代码样式都是应严格遵守的规则(而非指南或建议)。如果所贡献的 Android 代码没有遵守以下规则,我们通常不会接受此类代码。<em></em>我们知道,并非所有的现有代码都遵守了这些规则,但我们希望所有新代码都能遵守这些规则。</p>
+
+<h2 id="java-language-rules">Java 语言规则</h2>
+<p>Android 遵循标准 Java 编码规范以及下文所述的其他规则。</p>
+
+<h3 id="dont-ignore-exceptions">请勿忽略异常</h3>
+<p>开发者可能会倾向于编写完全忽略异常的代码,例如:</p>
+<pre><code>void setServerPort(String value) {
+ try {
+ serverPort = Integer.parseInt(value);
+ } catch (NumberFormatException e) { }
+}
+</code></pre>
+<p>千万不要这样做。虽然您可能认为自己的代码永远不会遇到这种错误,或者无需费心处理这种错误,但像上例那样忽略异常会在您的代码中埋下隐患,这种错误总有一天会被他人触发。您必须有原则地处理代码中的每个异常;具体处理方式因情况而异。</p>
+<p><em>无论何时,只要遇到空的 catch 子句,就应该保持警惕。当然,在某些时候,空的 catch 语句确实没什么问题,但至少你得想一想。在 Java 中,你怎么小心都不为过。</em>-<a href="http://www.artima.com/intv/solid4.html">James Gosling</a></p>
+<p>可接受的替代方案(按优先顺序排列)包括:</p>
+<ul>
+<li>将异常抛给方法调用者。
+<pre><code>void setServerPort(String value) throws NumberFormatException {
+ serverPort = Integer.parseInt(value);
+}
+</code></pre>
+</li>
+<li>抛出一个适合您的抽象级别的新异常。
+<pre><code>void setServerPort(String value) throws ConfigurationException {
+ try {
+ serverPort = Integer.parseInt(value);
+ } catch (NumberFormatException e) {
+ throw new ConfigurationException("Port " + value + " is not valid.");
+ }
+}
+</code></pre>
+</li>
+<li>妥善处理错误,并替换 catch {} 块中的相应值。
+<pre><code>/** Set port. If value is not a valid number, 80 is substituted. */
+
+void setServerPort(String value) {
+ try {
+ serverPort = Integer.parseInt(value);
+ } catch (NumberFormatException e) {
+ serverPort = 80; // default port for server
+ }
+}
+</code></pre>
+</li>
+<li>捕获异常并抛出一个新的 <code>RuntimeException</code>。这样做比较危险,因此请仅在下述情况下采用这种方案:您确定,如果发生此错误,最适当的处理方式就是让应用崩溃。
+<pre><code>/** Set port. If value is not a valid number, die. */
+
+void setServerPort(String value) {
+ try {
+ serverPort = Integer.parseInt(value);
+ } catch (NumberFormatException e) {
+ throw new RuntimeException("port " + value " is invalid, ", e);
+ }
+}
+</code></pre>
+<p class="note"><strong>注意</strong>:原始异常会传递到 RuntimeException 的构造函数。如果您的代码必须采用 Java 1.3 进行编译,则必须忽略表示原因的异常。</p>
+</li>
+<li>最后一种方案:如果您确信忽略异常是合适的处理方式,那么您可以忽略异常,但您必须添加备注以充分说明理由:<pre><code>/** If value is not a valid number, original port number is used. */
+void setServerPort(String value) {
+ try {
+ serverPort = Integer.parseInt(value);
+ } catch (NumberFormatException e) {
+ // Method is documented to just ignore invalid user input.
+ // serverPort will just be unchanged.
+ }
+}
+</code></pre>
+</li>
+</ul>
+
+<h3 id="dont-catch-generic-exception">请勿捕获常规异常</h3>
+<p>在捕获异常时,开发者可能会为了偷懒而倾向于采用以下处理方式:</p>
+<pre><code>try {
+ someComplicatedIOFunction(); // may throw IOException
+ someComplicatedParsingFunction(); // may throw ParsingException
+ someComplicatedSecurityFunction(); // may throw SecurityException
+ // phew, made it all the way
+} catch (Exception e) { // I'll just catch all exceptions
+ handleError(); // with one generic handler!
+}
+</code></pre>
+<p>千万不要这样做。几乎所有情况下都不适合捕获常规异常或 Throwable(最好不要捕获 Throwable,因为它包含 Error 异常)。这样做非常危险,因为这意味着系统会在处理应用级错误期间捕获到您从未预料到的异常(包括 ClassCastException 之类的 RuntimeException)。它掩盖了代码的故障处理属性,也就是说,如果有人在您所调用的代码中添加了一种新类型的异常,编译器不会帮助您意识到您需要采取不同的方式来处理该错误。在大多数情况下,您不应以相同的方式处理不同类型的异常。</p>
+<p>这条规则的特例是:在测试代码和顶级代码中,您希望捕获所有类型的错误(以防它们显示在界面中或者以便一直进行批处理作业)。在这些情况下,您可以捕获常规异常(或 Throwable)并适当地处理错误。但在这样做之前,请务必三思,然后添加备注以说明为何在此处执行这类操作是安全之举。</p>
+<p>捕获常规异常的替代方案:</p>
+<ul>
+<li>
+<p>在单个 try 之后将每个异常作为单独的 catch 块分别进行捕获。这样做可能显得比较笨拙,但仍比捕获所有异常更可取。请注意,不要在 catch 块中过多地重复使用代码。</p></li><p></p>
+
+<li>
+<p>通过多个 try 块重构您的代码,使得错误处理过程更精细。从解析中分离出 IO,然后分别处理每种情况下的错误。</p>
+</li>
+<li>
+<p>重新抛出异常。很多时候,您无需在该级别捕获异常,只需让相应方法抛出异常即可。</p>
+</li>
+</ul>
+<p>请谨记:异常是您的朋友!当编译器抱怨您没有捕获异常时,别闷闷不乐!您应该微笑:因为编译器让您能够更加轻松地捕获代码中的运行时错误。</p>
+<h3 id="dont-use-finalizers">请勿使用终结器</h3>
+<p>终结器可以在对象被垃圾回收器回收时执行一段代码。虽然终结器非常便于进行资源清理(尤其是外部资源),但并不能保证终结器何时被调用(甚至根本不会被调用)。</p>
+<p>Android 不使用终结器。在大多数情况下,您可以通过良好的异常处理流程实现终结器功能。如果您的确需要终结器,请定义一个 close() 方法(或类似方法),并注明需要调用该方法的确切时间(有关示例,请参阅 InputStream)。这种情况下,可以(但并非必须)在终结器中输出简短的日志消息,前提是不会输出大量日志消息。</p>
+
+<h3 id="fully-qualify-imports">完全合格的导入</h3>
+<p>当您想要使用 foo 包中的 Bar 类时,可以使用以下两种方式导入:</p>
+<ul>
+<li><code>import foo.*;</code>
+<p>可能会减少 import 语句的数量。</p></li>
+<li><code>import foo.Bar;</code>
+<p>明确指出实际使用了哪些类,而且代码对于维护者来说更易读。</p></li></ul>
+<p>使用 <code>import foo.Bar;</code> 导入所有 Android 代码。在 Java 标准库(<code>java.util.*</code>、<code>java.io.*</code> 等)和单元测试代码 (<code>junit.framework.*</code>) 中创建显式异常。</p>
+
+<h2 id="java-library-rules">Java 库规则</h2>
+<p>使用 Android 的 Java 库和工具需要遵守相关规范。在某些情况下,具体规范发生了一些重大变化,旧代码可能使用的是已弃用的模式或库。使用此类代码时,可以继续遵循现有样式。不过,在创建新组件时,请不要再使用已弃用的库。</p>
+
+<h2 id="java-style-rules">Java 样式规则</h2>
+
+<h3 id="use-javadoc-standard-comments">使用 Javadoc 标准备注</h3>
+<p>每个文件都应该在顶部放置版权声明,其后是 package 和 import 语句(各个块之间用空行分隔),最后是类或接口声明。在 Javadoc 备注中说明类或接口的作用。</p>
+<pre><code>/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.foo;
+
+import android.os.Blah;
+import android.view.Yada;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+/**
+ * Does X and Y and provides an abstraction for Z.
+ */
+
+public class Foo {
+ ...
+}
+</code></pre>
+<p><em></em>您编写的每个类和重要的公开方法都必须包含 Javadoc 备注,至少用一句话说明类或方法的用途。句式应以第三人称描述性动词开头。</p>
+<p>示例:</p>
+<pre><code>/** Returns the correctly rounded positive square root of a double value. */
+static double sqrt(double a) {
+ ...
+}
+</code></pre>
+<p>或</p>
+<pre><code>/**
+ * Constructs a new String by converting the specified array of
+ * bytes using the platform's default character encoding.
+ */
+public String(byte[] bytes) {
+ ...
+}
+</code></pre>
+<p>对于普通的 get 和 set 方法(如 <code>setFoo()</code>),您无需编写 Javadoc,要写也不过是“设置 Foo”。如果该方法执行更复杂的操作(例如强制实施约束条件或具有重大副作用),那么您必须添加备注。如果属性“Foo”的意思不明确,您也应该添加备注。
+</p><p>您所编写的每一种方法(无论是公开方法还是其他方法)都将受益于 Javadoc。公开方法是 API 的一部分,因此需要 Javadoc。Android 目前并不强制要求采用特定样式来编写 Javadoc 备注,但建议您参照<a href="http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html">如何为 Javadoc 工具编写文档备注</a>中的说明。</p>
+
+<h3 id="write-short-methods">编写简短方法</h3>
+<p>在可行的情况下,尽量编写短小精炼的方法。我们了解,有些情况下较长的方法是恰当的,因此对方法的代码长度没有做出硬性限制。如果某个方法的代码超出 40 行,请考虑是否可以在不破坏程序结构的前提下对其拆解。</p>
+
+<h3 id="define-fields-in-standard-places">在标准位置定义字段</h3>
+<p>在文件的顶部或者在使用它们的方法之前定义字段。</p>
+
+<h3 id="limit-variable-scope">限制变量的作用域</h3>
+<p>尽可能缩小局部变量的作用域。这样做有助于提高代码的可读性和可维护性,并降低出错的可能性。每个变量应该在包含变量所有使用场合的最内层的块中进行声明。</p>
+<p>局部变量应该在首次使用时声明。几乎每个局部变量声明都应该包含一个初始化程序。如果您还没有足够的信息来合理地初始化某个变量,请推迟到信息充足时再进行声明。</p>
+<p>try-catch 语句是例外情况。如果通过一个会抛出受检异常的方法的返回值来初始化变量,则必须在 try 块中进行初始化。如果该值必须在 try 块之外使用,那么您必须在 try 块之前对其进行声明,因为它在 try 块中尚无法合理地初始化:</p>
+<pre><code>// Instantiate class cl, which represents some sort of Set
+Set s = null;
+try {
+ s = (Set) cl.newInstance();
+} catch(IllegalAccessException e) {
+ throw new IllegalArgumentException(cl + " not accessible");
+} catch(InstantiationException e) {
+ throw new IllegalArgumentException(cl + " not instantiable");
+}
+
+// Exercise the set
+s.addAll(Arrays.asList(args));
+</code></pre>
+<p>不过,即使是这种情况,也可以通过将 try-catch 块封装在某个方法中来避免:</p>
+<pre><code>Set createSet(Class cl) {
+ // Instantiate class cl, which represents some sort of Set
+ try {
+ return (Set) cl.newInstance();
+ } catch(IllegalAccessException e) {
+ throw new IllegalArgumentException(cl + " not accessible");
+ } catch(InstantiationException e) {
+ throw new IllegalArgumentException(cl + " not instantiable");
+ }
+}
+
+...
+
+// Exercise the set
+Set s = createSet(cl);
+s.addAll(Arrays.asList(args));
+</code></pre>
+<p>循环变量应该在 for 语句本身中进行声明,除非有令人信服的理由不这么做:</p>
+<pre><code>for (int i = 0; i &lt; n; i++) {
+ doSomething(i);
+}
+</code></pre>
+<p>和</p>
+<pre><code>for (Iterator i = c.iterator(); i.hasNext(); ) {
+ doSomethingElse(i.next());
+}
+</code></pre>
+
+<h3 id="order-import-statements">为 import 语句排序</h3>
+<p>import 语句的顺序为:</p>
+<ol>
+<li>
+<p>导入 Android 包</p>
+</li>
+<li>
+<p>导入第三方包(<code>com</code>、<code>junit</code>、<code>net</code>、<code>org</code>)</p>
+</li>
+<li>
+<p><code>java</code> 和 <code>javax</code></p>
+</li>
+</ol>
+<p>要完全符合 IDE 设置,导入顺序应为:</p>
+<ul>
+<li>
+<p>每个分组内按字母顺序排序,其中大写字母开头的语句位于小写字母开头的语句前面(例如 Z 在 a 前面)。</p>
+</li>
+<li>
+<p>每个主要分组(<code>android</code>、<code>com</code>、<code>junit</code>、<code>net</code>、<code>org</code>、<code>java</code>、<code>javax</code>)之间用空行隔开。</p>
+</li>
+</ul>
+<p>最初对于语句顺序并没有样式要求,这意味着 IDE 经常会改变顺序,或者 IDE 开发者必须停用自动导入管理功能并手动维护导入语句。这样相当不方便。当提及 Java 样式时,开发者们喜欢的样式五花八门,最终针对 Android 简单归结为“选择一种兼容一致的排序方式”。因此我们选择了一种样式,更新了样式指南,并让 IDE 遵循该指南。我们希望 IDE 用户在编写代码时,系统对所有软件包的导入都符合此模式,无需再进行额外的工程处理。</p>
+<p>这种样式是按以下原则选取的:</p>
+<ul>
+<li>
+<p>用户希望先看到的导入往往位于顶部 (<code>android</code>)。</p>
+</li>
+<li>
+<p>用户最不希望看到的导入往往位于底部 (<code>java</code>)。</p>
+</li>
+<li>
+<p>用户可以轻松遵循的样式。</p>
+</li>
+<li>
+<p>IDE 可以遵循的样式。</p>
+</li>
+</ul>
+<p>静态导入的使用和位置一直都存在争议。有些人希望静态导入穿插在其他导入语句之间,而有些人更希望其位于其他所有导入语句的上方或下方。此外,我们还没有确定如何让所有 IDE 都使用同一种顺序。由于许多人认为这个问题不太重要,因此您只需在保持一致的前提下自行决定即可。</p>
+
+<h3 id="use-spaces-for-indentation">使用空格缩进</h3>
+<p>我们使用四 (4) 个空格来缩进块,而不要使用制表符。如果您有疑问,请与周围的代码保持一致。</p>
+<p>我们使用八 (8) 个空格来缩进自动换行,包括函数调用和赋值。正确示例如下:</p>
+<pre><code>Instrument i =
+ someLongExpression(that, wouldNotFit, on, one, line);
+</code></pre>
+<p>错误示例如下:</p>
+<pre><code>Instrument i =
+ someLongExpression(that, wouldNotFit, on, one, line);
+</code></pre>
+
+<h3 id="follow-field-naming-conventions">遵循字段命名规范</h3>
+<ul>
+<li>
+<p>非公开且非静态字段的名称以 m 开头。</p>
+</li>
+<li>
+<p>静态字段的名称以 s 开头。</p>
+</li>
+<li>
+<p>其他字段以小写字母开头。</p>
+</li>
+<li>
+<p>公开静态 final 字段(常量)为全部大写并用下划线连接 (ALL_CAPS_WITH_UNDERSCORES)。</p>
+</li>
+</ul>
+<p>例如:</p>
+<pre><code>public class MyClass {
+ public static final int SOME_CONSTANT = 42;
+ public int publicField;
+ private static MyClass sSingleton;
+ int mPackagePrivate;
+ private int mPrivate;
+ protected int mProtected;
+}
+</code></pre>
+<h3 id="use-standard-brace-style">使用标准大括号样式</h3>
+<p>左大括号不单独占一行,与其前面的代码位于同一行:</p>
+<pre><code>class MyClass {
+ int func() {
+ if (something) {
+ // ...
+ } else if (somethingElse) {
+ // ...
+ } else {
+ // ...
+ }
+ }
+}
+</code></pre>
+<p>我们需要在条件语句周围添加大括号。例外情况:如果整个条件语句(条件和主体)适合放在同一行,那么您可以(但不是必须)将其全部放在一行上。例如,我们接受以下样式:</p>
+<pre><code>if (condition) {
+ body();
+}
+</code></pre>
+<p>同样也接受以下样式:</p>
+<pre><code>if (condition) body();
+</code></pre>
+<p>但不接受以下样式:</p>
+<pre><code>if (condition)
+ body(); // bad!
+</code></pre>
+
+<h3 id="limit-line-length">限制代码行长度</h3>
+<p>您的代码中每一行文本的长度都应该不超过 100 个字符。<em></em>虽然关于此规则存在很多争论,但最终决定仍是以 100 个字符为上限,不过存在以下例外情况:</p>
+<ul>
+<li>如果备注行包含长度超过 100 个字符的示例命令或文字网址,那么为了便于剪切和粘贴,该行可以超过 100 个字符。</li>
+<li>导入语句行可以超出此限制,因为用户很少会看到它们(这也简化了工具编写流程)。</li>
+</ul>
+
+<h3 id="use-standard-java-annotations">使用标准 Java 注释</h3>
+<p>注释应该位于同一语言元素的其他修饰符之前。简单的标记注释(例如 @Override)可以与语言元素列在同一行。如果有多个注释或参数化注释,则应各占一行并按字母顺序排列。</p>
+<p>Java 中 3 个预定义注释的 Android 标准做法如下:</p>
+<ul>
+<li><code>@Deprecated</code>:在不建议使用注释元素时,必须使用 @Deprecated 注释。如果您使用 @Deprecated 注释,则还必须为其添加 @deprecated Javadoc 标记,并且该标记应该指定一个替代实现方案。另外请注意,@Deprecated 方法应该仍然可以使用。<em></em>如果您看到带有 @deprecated Javadoc 标记的旧代码,请添加 @Deprecated 注释。
+</li>
+<li><code>@Override</code>:当某个方法替换了超类中的声明或实现时,必须使用 @Override 注释。例如,如果您使用 @inheritdocs Javadoc 标记,并且派生于某个类(而非接口),则必须再为方法添加 @Override 注释,说明该方法替换了父类的方法。</li>
+<li><code>@SuppressWarnings</code>:@SuppressWarnings 注释应该仅在无法消除警告的情况下使用。<em></em>如果某个警告通过了“无法消除”测试,则必须使用 @SuppressWarnings 注释,以确保所有警告都会反映出代码中的实际问题。
+<p>当需要 @SuppressWarnings 注释时,必须在前面添加一个 TODO 备注,用于说明“无法消除”情况。这通常会标识出是哪个违规类使用了糟糕的接口。例如:</p>
+<pre><code>// TODO: The third-party class com.third.useful.Utility.rotate() needs generics
+@SuppressWarnings("generic-cast")
+List&lt;String&gt; blix = Utility.rotate(blax);
+</code></pre>
+<p>当需要 @SuppressWarnings 注释时,您应该重构代码以分离出需要使用该注释的软件元素。</p>
+</li>
+</ul>
+
+<h3 id="treat-acronyms-as-words">将首字母缩写词视为字词</h3>
+<p>在为变量、方法和类命名时,请将首字母缩写词和缩写形式视为字词,使名称更具可读性:</p>
+<table>
+<thead>
+<tr>
+<th>良好</th>
+<th>不佳</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>XmlHttpRequest</td>
+<td>XMLHTTPRequest</td>
+</tr>
+<tr>
+<td>getCustomerId</td>
+<td>getCustomerID</td>
+</tr>
+<tr>
+<td>class Html</td>
+<td>class HTML</td>
+</tr>
+<tr>
+<td>String url</td>
+<td>String URL</td>
+</tr>
+<tr>
+<td>long id</td>
+<td>long ID</td>
+</tr>
+</tbody>
+</table>
+<p>由于 JDK 和 Android 代码库在首字母缩写词上非常不一致,几乎也不可能与周围的代码保持一致。因此,请务必将首字母缩写词视为字词。</p>
+
+<h3 id="use-todo-comments">使用 TODO 备注</h3>
+<p>为代码使用 TODO 备注是短期的临时解决方案,或者说足够好但并不完美。TODO 备注应该以全部大写的字符串 TODO 开头,后跟一个冒号:</p>
+<pre><code>// TODO: Remove this code after the UrlTable2 has been checked in.
+</code></pre>
+<p>和</p>
+<pre><code>// TODO: Change this to use a flag instead of a constant.
+</code></pre>
+<p>如果您的 TODO 采用“在未来的某个日期做某事”的形式,请确保在其中包含一个非常具体的日期(“在 2005 年 11 月前修复”)或者一个非常具体的事件(“在所有生产环境合成器都可处理 V7 协议后移除此代码”)。</p>
+
+<h3 id="log-sparingly">谨慎使用日志记录</h3>
+<p>虽然日志记录非常有必要,但对性能却有明显的负面影响,如果不能保持一定程度的简洁性,就会迅速失去其实用性。日志记录工具提供以下 5 种不同级别的日志记录:</p>
+<ul>
+<li><code>ERROR</code>:在出现极其严重的情况时使用。例如,某些事件会导致用户可见的后果,如果不明确删除某些数据、卸载应用、清除数据分区或重写整个设备(或更糟),则无法恢复。系统一直会记录此级别的日志。一般情况下,最好向统计信息收集服务器报告能够说明 ERROR 级别的一些日志记录情况的问题。</li>
+<li><code>WARNING</code>:在出现比较严重和意外的情况时使用。例如,某些事件会导致用户可见的后果,但是通过执行某些明确的操作(从等待或重启应用,一直到重新下载新版应用或重新启动设备)可在不丢失数据的情况下恢复。系统一直会记录此级别的日志。可以考虑向统计信息收集服务器报告能够说明 WARNING 级别的一些日志记录情况的问题。</li>
+<li><code>INFORMATIVE:</code>用于记录大多数人感兴趣的信息。例如,当检测到某种情况会造成广泛的影响时,尽管不一定是错误,系统也会记录下来。这种情况应该仅由一个被视为该领域最具权威性的模块来记录(避免由非权威组件重复记录)。系统一直会记录此级别的日志。
+</li>
+<li><code>DEBUG</code>:用于进一步记录设备上发生的可能与调查和调试意外行为相关的情况。您应该只记录收集有关组件的足够信息所需的信息。如果您的调试日志是主要日志,那么您可能应采用 VERBOSE 级别的日志记录。
+<p>系统会记录此级别的日志(即使在发布版本中),并且周围要有 <code>if (LOCAL_LOG)</code> 或 <code>if (LOCAL_LOGD)</code> 块,其中 <code>LOCAL_LOG[D]</code> 在您的类或子组件中定义。这样一来,系统有可能停用所有此类日志记录。因此,<code>if (LOCAL_LOG)</code> 块中不得包含有效逻辑。为日志编译的所有字符串也需要放在 <code>if
+(LOCAL_LOG)</code> 块中。如果日志记录调用会导致字符串编译在 <code>if (LOCAL_LOG)</code> 块之外发生,则不应将其重构为方法调用。</p>
+<p>有些代码仍然在使用 <code>if (localLOGV)</code>。虽然名称并不规范,但也可接受。</p>
+</li>
+<li><code>VERBOSE</code>:用于记录其他所有信息。系统仅针对调试版本记录此级别的日志,并且周围要有 <code>if (LOCAL_LOGV)</code> 块(或同类块),以便能够默认编译。所有字符串编译都将从发布版本中删除,并且需要在 <code>if (LOCAL_LOGV)</code> 块中显示。
+</li>
+</ul>
+<p><em>注意事项:</em> </p>
+<ul>
+<li>在指定模块中,除了 VERBOSE 级别之外,一个错误应该只报告一次(如果可能的话)。在模块内的单个函数调用链中,只有最内层的函数应当返回错误,同一模块中的调用者只能添加一些明显有助于隔离问题的日志记录。</li>
+<li>在一个模块链中,除了 VERBOSE 级别之外,当较低级别的模块检测到来自较高级别模块的无效数据时,低级模块应该只在 DEBUG 日志中记录该情况,并且仅当该日志提供的信息对调用者来说无法获取时进行记录。具体来说,当抛出异常(异常中应该会包含所有相关信息)或者所记录的所有信息都包含在错误代码中时,则不需要记录此类情况。这在框架和应用之间的交互中尤为重要,而且由第三方应用造成的情况经过框架妥善处理后,不应该触发高于 DEBUG 级别的日志记录。应该触发 INFORMATIVE 级别或更高级别日志记录的唯一情况是,模块或应用在其自身级别或更低级别检测到错误。</li>
+<li>当事实证明某些日志记录可能会发生多次时,最好实施一种频率限制机制来防止出现具有相同(或非常相似)信息的大量重复日志副本。</li>
+<li>失去网络连接属于完全在预期之内的常见情况,没必要记录下来。如果失去网络连接后导致在应用内出现某种后果,则应该记录为 DEBUG 或 VERBOSE 级别(具体取决于后果是否足够严重以及足够意外,足以记录在发布版本中)。</li>
+<li>如果在第三方应用可访问或代表第三方应用的文件系统上拥有完整的文件系统,则不应该记录高于 INFORMATIVE 级别的日志。</li>
+<li>来自任何不受信任来源(包括共享存储空间中的任何文件或通过任何网络连接获取的数据)的无效数据被视为符合预期,在被检测到无效时不应触发高于 DEBUG 级别的任何日志记录(甚至应该尽可能地限制日志记录)。</li>
+<li>请注意,在对 String 使用 <code>+</code> 运算符时,它会隐式创建一个具有默认缓冲区(大小为 16 个字符)的 <code>StringBuilder</code>,还可能会创建其他临时 String 对象。例如,显式创建 StringBuilder 并不比依赖默认的“+”运算符成本更高(实际上可能更高效)。请注意,即使没有读取日志信息,调用 <code>Log.v()</code> 的代码也会在发布版本中进行编译和执行,包括编译字符串。</li>
+<li>任何供其他人阅读并且在发布版本中提供的日志记录都应当简洁明了、合理易懂。这包括一直到 DEBUG 级别的所有日志记录。</li>
+<li>在内容有意义的情况下尽可能使日志记录在一行之内。一行长度在 80 到 100 个字符内是完全可以接受的,应当尽可能避免长度超过 130 或 160 个字符(包括标记的长度)。</li>
+<li>绝不能使用高于 VERBOSE 级别的日志记录报告成功事件。</li>
+<li>用于诊断难以重现的问题的临时日志记录应采用 DEBUG 或 VERBOSE 级别,并且应当包裹在 if 块中,以便在编译期间将其完全停用。</li>
+<li>请务必谨慎,避免在日志中泄露安全方面的信息。应避免提供个人信息,且必须避免提供有关受保护内容的信息。这在编写框架代码时尤为重要,因为事先无法轻易得知哪些是个人信息或受保护的内容,哪些不是。</li>
+<li>请勿使用 <code>System.out.println()</code>(或针对原生代码使用 <code>printf()</code>)。System.out 和 System.err 会重定向到 /dev/null,因此您的 print 语句不会产生可见效果。不过,为这些调用编译的所有字符串仍会得以执行。</li>
+<li><em>日志记录的黄金法则是,您的日志不一定要将其他日志排挤出缓冲区,正如其他日志不会这样对您的日志一样。</em></li>
+</ul>
+
+<h3 id="be-consistent">保持一致</h3>
+<p>总而言之:保持一致。如果您正在修改代码,请花几分钟时间看一下周围的代码并确定其样式。如果该代码在 if 语句周围使用空格,那么您也应该这样做。如果代码备注的周围是用星号组成的小方框,您也应该将备注放在这样的小方框内。</p>
+<p>制定样式规范的目的是整理出通用的编码词汇表,以便人们可以专注于您所说的内容,而不是您表达的方式。我们在此提出整体样式规则,让用户都知道这一词汇表,但局部样式也很重要。如果您添加到文件的代码看起来与其周围的现有代码明显不同,那么当读者读到此处时,这些代码会打乱他们的节奏。请尽量避免这种情况。</p>
+
+<h2 id="javatests-style-rules">Javatests 样式规则</h2>
+<p>请遵循测试方法的命名规范,并使用下划线将被测试的内容与被测试的具体情况区分开来。这种样式可让您更容易看出正在测试的情况。例如:</p>
+<pre><code>testMethod_specificCase1 testMethod_specificCase2
+
+void testIsDistinguishable_protanopia() {
+ ColorMatcher colorMatcher = new ColorMatcher(PROTANOPIA)
+ assertFalse(colorMatcher.isDistinguishable(Color.RED, Color.BLACK))
+ assertTrue(colorMatcher.isDistinguishable(Color.X, Color.Y))
+}
+</code></pre>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/community.html b/zh-cn/source/community.html
new file mode 100644
index 00000000..deb48422
--- /dev/null
+++ b/zh-cn/source/community.html
@@ -0,0 +1,235 @@
+<html devsite><head>
+ <title>Android 社区</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>我们诚邀您加入 Android 社区!</p>
+
+<p>任何社区取得成功的关键都是良好的沟通。和大多数项目一样,Android 项目也是通过论坛进行沟通。由于 Android 是一个非常大的项目,包含很多组件,因此我们开设了许多论坛,而且每个论坛所侧重的主题都各不相同。您可以查看我们开设的<a href="#open-source-project-discussions">网上论坛</a>,并可以加入任何您感兴趣的论坛。您还可以在 <a href="#android-on-irc">IRC</a> 上讨论 Android。</p>
+
+<p>如果您需要 Android 界面或 Android 设备方面的帮助、想要详细了解 Android 更新或安全问题,或想要了解如何构建适用于 Android 平台的应用,请参阅下文中列出的<a href="#resources">资源</a>。</p>
+
+<h2 id="resources">资源</h2>
+
+<p>本网站中介绍了如何创建自定义 Android 堆栈、如何为设备和配件移植 Android,以及如何满足兼容性要求。Android 操作系统是用于存储文件的 Git 存储库,而不是可供下载的单个文件(.zip、.tar、.exe 等)。您可以按照<a href="downloading.html">下载源代码</a>页面中的说明开始进行 Android 源代码方面的事情。如需关于 Android 的其他信息,请参阅以下资源。</p>
+
+<table class="columns">
+
+<tbody><tr><td>
+<h4>使用 Android</h4>
+
+<h5>帮助中心</h5>
+<a href="https://support.google.com/android/">概述</a><br />
+<a href="https://support.google.com/pixelphone/">Pixel 手机</a><br />
+<a href="https://support.google.com/nexus/">Nexus 手机/平板电脑</a><br />
+<a href="https://support.google.com/playedition">Google Play 版</a><br />
+<a href="https://support.google.com/androidauto/">Auto</a><br />
+<a href="https://support.google.com/androidtv/">TV</a><br />
+<a href="https://support.google.com/androidwear/">Wear</a><br />
+<a href="https://support.google.com/android/answer/3123680">应用</a>
+<p></p>
+
+<h5>社区</h5>
+<a href="#open-source-project-discussions">AOSP 社区</a><br />
+<a href="http://developer.android.com/support.html">开发者社区</a>
+<p></p>
+
+<h5>发送反馈</h5>
+<a href="/source/report-bugs.html">报告 AOSP 错误</a><br />
+<a href="https://code.google.com/p/android/issues/entry?template=Feature%20request">提出功能建议</a>
+<p></p>
+
+</td>
+<td>
+
+<h4>更新和安全</h4>
+
+<h5>Android 版本</h5>
+<a href="https://www.android.com/history/#/marshmallow">Android 发展历程</a><br />
+<a href="https://www.android.com/versions/nougat-7-0/">当前版本</a>
+<p></p>
+
+<h5>设备图片</h5>
+<a href="https://developers.google.com/android/images">Nexus 和 Pixel 设备</a><br />
+<a href="https://support.google.com/android/answer/3094742">其他设备</a>
+<p></p>
+
+<h5>安全方面的帮助</h5>
+<a href="https://www.google.com/safetycenter/everyone/start/">Google 安全中心</a><br />
+<a href="https://support.google.com/android/answer/6215472">针对用户的提示</a><br />
+<a href="http://developer.android.com/training/articles/security-tips.html">针对开发者的提示</a><br />
+<a href="/security/index.html">平台安全</a>
+<p></p>
+
+<h5>安全公告</h5>
+<a href="/security/enhancements/index.html">版本增强功能</a><br />
+<a href="/security/bulletin/index.html">公告</a>
+<p></p>
+
+</td>
+<td>
+
+<h4>参与其中</h4>
+
+<h5>开发者资源</h5>
+<a href="http://developer.android.com/">Developer.android.com</a><br />
+<a href="http://developer.android.com/support.html">开发者支持</a><br />
+<a href="http://android-developers.blogspot.com/">Android 开发者博客</a><br />
+<a href="https://developers.google.com/groups/">Google Developer Groups (GDG)</a><br />
+<a href="https://www.android.com/gms/">Google 移动服务 (GMS)</a>
+<p></p>
+
+<h5>培训</h5>
+<a href="https://developer.android.com/training/index.html">Google</a><br />
+<a href="https://www.udacity.com/google">Udacity</a>
+
+</td></tr><tr>
+</tr></tbody></table>
+
+<h2 id="open-source-project-discussions">开放源代码项目论坛</h2>
+<ul>
+<li>
+<p><em></em>android-platform:此论坛用于围绕 Android 开放源代码项目或平台技术进行一般讨论。</p>
+<ul>
+<li>通过 Google 网上论坛订阅:<a href="https://groups.google.com/forum/?fromgroups#!forum/android-platform">android-platform</a></li>
+<li>通过电子邮件订阅:<a href="mailto:android-platform+subscribe@googlegroups.com">android-platform</a></li>
+</ul>
+</li>
+<li>
+<p><em></em>android-building:订阅此论坛后,您可以获取/提供编译 Android 源代码以及 Android 编译系统方面的讨论内容和帮助。如果您刚刚校验了源代码,并对如何将其转换为二进制文件有疑问,那就从这里开始吧!</p>
+<ul>
+<li>通过 Google 网上论坛订阅:<a href="https://groups.google.com/forum/?fromgroups#!forum/android-building">android-building</a></li>
+<li>通过电子邮件订阅:<a href="mailto:android-building+subscribe@googlegroups.com">android-building</a></li>
+</ul>
+</li>
+<li>
+<p><em></em>android-porting:此论坛适合希望将 Android 移植到新设备的开发者。如果您想知道如何将 Android 源代码与硬件结合起来,该论坛非常适合您。您可以在此处讨论将 Android 移植到各种设备的细节,例如获取工具链、合并内核驱动程序、根据您的具体配置来设置或修改应用,等等。</p>
+<ul>
+<li>通过 Google 网上论坛订阅:<a href="https://groups.google.com/forum/?fromgroups#!forum/android-porting">android-porting</a></li>
+<li>通过电子邮件订阅:<a href="mailto:android-porting+subscribe@googlegroups.com">android-porting</a>
+</li>
+</ul>
+</li>
+<li>
+<p><em></em>android-contrib:此论坛适合想要为 Android 贡献代码的开发者。这是一个工作论坛,不适合进行一般讨论。要进行一般讨论,请前往 android-platform(有关为 Android 内核做贡献方面的讨论,请前往 android-kernel)。</p>
+<ul>
+<li>通过 Google 网上论坛订阅:<a href="https://groups.google.com/forum/?fromgroups#!forum/android-contrib">android-contrib</a></li>
+<li>通过电子邮件订阅:<a href="mailto:android-contrib+subscribe@googlegroups.com">android-contrib</a>
+</li>
+</ul>
+</li>
+<li>
+<p><em></em>android-kernel:此论坛适合想要为 Android 设备使用的 Linux 内核做贡献的开发者。如果您已下载内核代码,知道如何对其进行编译,并希望编写内核代码来支持 Android,这里非常适合您。<em></em>此论坛不适合讨论用户空间方面的主题(请参阅 android-platform);如果您在这里询问用户空间方面的问题,其他人将会制止您,让您不要再捣乱。</p>
+<ul>
+<li>通过 Google 网上论坛订阅:<a href="https://groups.google.com/forum/?fromgroups#!forum/android-kernel">android-kernel</a></li>
+<li>通过电子邮件订阅:<a href="mailto:android-kernel+subscribe@googlegroups.com">android-kernel</a>
+</li>
+</ul>
+</li><li>
+<p><em></em>android-ota:此论坛适合研究 Android OTA 系统(生成 OTA 的恢复映像和脚本)的开发者。</p>
+<ul>
+<li>通过 Google 网上论坛订阅:<a href="https://groups.google.com/forum/?fromgroups#!forum/android-ota">android-ota</a></li>
+<li>通过电子邮件订阅:<a href="mailto:android-ota+subscribe@googlegroups.com">android-ota</a></li>
+</ul>
+</li>
+</ul>
+
+<h3 id="audience">受众群体</h3>
+<p>这些论坛适合使用 Android 平台的开发者。我们欢迎每个人加入论坛,但前提是要遵守下述社区政策。我们的用户会互相帮助,包括“开放手机联盟”(Open Handset Alliance) 成员在内的很多专家也会在这些论坛中发帖。</p>
+<p>只要主题在某种程度上与 Android 相关,我们都不会加以限制。不过,由于这些论坛非常繁忙,因此在发帖提问之前请先在归档内容中搜索一下,您也许会发现自己的问题已经有人解答过了。</p>
+
+<h3 id="getting-the-most-from-our-lists">充分利用我们的论坛</h3>
+<p>在我们的论坛中发帖之前,请注意以下事项:</p>
+<ul>
+<li>
+<p><em>阅读<a href="#mailing">我们的论坛章程</a>。</em> 该章程阐述了我们社区为数不多的规则和指南。</p>
+</li>
+<li>
+<p><em>在论坛归档内容中搜索一下,看看您的问题是不是已经讨论过了。</em> 这有助于避免耗时的重复讨论。</p>
+</li>
+<li>
+<p><em>使用明确、相关的内容主题。</em> 这对每个人都会有所帮助,包括那些尝试回答您问题的人,以及可能在日后查找相关信息的人。</p>
+</li>
+<li>
+<p><em>在您的帖子中提供充足的详细信息。</em> 提供代码或日志片段、屏幕截图提示以及类似的详细信息有助于获得更理想的结果,并能促成更有效的讨论。要获得关于提问时如何措辞的实用指导,请参阅<a href="http://www.catb.org/%7Eesr/faqs/smart-questions.html">提问的智慧</a>。</p>
+</li>
+</ul>
+
+<h3 id="mailing">论坛规则</h3>
+<p>我们喜欢简单,讨厌各种限制,因此我们的政策极其简要。以下规则说明了我们对 Android 论坛订阅者的要求。
+
+</p><ul>
+<li><em></em>请保持友善的态度:对他人保持礼貌和尊重是 Android 文化的重要组成部分,我们希望参与 Android 社区的每个人都和我们一样毫无保留地接受这一点。保持礼貌并不意味着我们彼此之间不能以具有建设性的方式表达异议,但我们在表达异议时必须要有礼貌。无论出于任何原因,都不能敌视或轻视任何人;如果您认为自己有这种情绪,那么在发帖之前请三思。移动开发是一项非常严肃的业务,但也有很多乐趣。让我们保持这种状态,努力打造最友善的开放源代码社区之一。
+</li>
+<li><em></em>允许讨论的主题:我们的大多数论坛都用于讨论 Android 方面的技术内容或方便用户互相帮助。一般情况下,我们不会对在论坛中讨论的主题进行严格限制:只要主题在某种程度上与 Android 相关,都可以在我们的论坛中进行讨论。我们欢迎大家公布和讨论与 Android 相关的产品、库、出版物和其他有趣的新闻,但请不要同时在多个论坛中发帖。请仅在与您的内容最相关的论坛中发帖。我们甚至欢迎讨论批判 Android 的文章和想法(但请保持礼貌!)- 毕竟,如果我们不听取意见,就无法改进。
+</li>
+<li><em></em>工作论坛:我们的某些论坛被视为“工作论坛”(即旨在用于支持完成特定任务的论坛)。在这些论坛中,我们不欢迎与主题无关的讨论。如果您要进行一般讨论,我们通常会要求您使用其他论坛。由于人们会利用这些论坛来尝试完成相关工作,因此我们会采取积极的举措来减少无关的内容。我们希望您能够尊重贡献者们的宝贵时间,并使用适当的论坛进行一般讨论。
+</li>
+<li><em></em>垃圾内容:我们非常讨厌垃圾内容,这种心情正如我们崇尚礼貌和尊重一样强烈,因此我们保留限制垃圾讨论内容的权利。如果有人发布纯属垃圾的内容,我们会立即并永久禁止发布者使用相应论坛。
+</li>
+</ul>
+<p>友善是最重要的规则。请谨记:在任何情况下,我们的社区都不欢迎不尊重他人和粗鲁的行为。我们没有制定正式的政策来对付捣乱者,也希望永远都不需要制定这样的政策。也就是说,我们承诺会尽最大努力保证公平,并且我们始终会先尝试警告对方,警告无果后再禁止其使用相应论坛。</p>
+
+<h3 id="contacting">与管理员联系</h3>
+<p>如果您发现有人言行粗鲁,请制止他们。您也是相应论坛的一份子,因此您不必因为他人的无礼行为不是针对您而予以容忍。切记要有礼有节!请勿火上浇油。</p>
+<p>不过,如果您发现难以容忍的违规行为,想要举报垃圾内容,对某些事物有强烈情绪或只是想聊天,请与论坛所有者联系。这是我们的职责所在!</p>
+
+<h3 id="using-email-with-google-groups">使用电子邮件参与 Google 网上论坛</h3>
+<p>您可以使用选择的电子邮件客户端参与论坛,而不是使用 <a href="https://groups.google.com/">Google 网上论坛</a>网站。要在不使用 Google 网上论坛网站的情况下订阅某个论坛,请使用上述论坛中“通过电子邮件订阅”后的链接。</p>
+<p>要设置如何通过电子邮件接收论坛帖子,请执行以下操作:</p>
+<ol>
+<li>
+<p>通过 Google 网上论坛网站登录到相应论坛。例如,对于 android-platform 论坛,请使用 <a href="https://groups.google.com/forum/?fromgroups#!forum/android-platform">https://groups.google.com/forum/?fromgroups#!forum/android-platform</a>。</p>
+</li>
+<li>
+<p>点击右侧的“我的成员资格”。</p>
+</li>
+<li>
+<p>在“How do you want to read this group?”(您想如何阅读该论坛)下选择一个电子邮件选项。</p>
+</li>
+</ol>
+<h2 id="android-on-irc">IRC 上的 Android</h2>
+<p>Android 在 <a href="http://freenode.net/">freenode</a> 上有 IRC 频道。我们在 <a href="irc://irc.freenode.net/">irc.freenode.net</a> 上维护着两个官方 IRC 频道(通过该网站的 <a href="http://webchat.freenode.net/">freenode webchat</a> 部分访问)</p>
+<ul>
+<li>
+<p><a href="irc://irc.freenode.net/android">#android</a> - 专门用于进行一般 Android 讨论以及讨论移植问题</p>
+</li>
+<li>
+<p><a href="irc://irc.freenode.net/android-dev">#android-dev</a> - 专门用于讨论编写 Android 应用方面的问题</p>
+</li>
+</ul>
+<p><em></em>该社区还使用了几个未进行正式管理的非官方频道。“开放手机联盟”不为非官方频道背书,并且我们不提供任何明示或暗示的保证,因此使用这些频道时您要自行承担风险。下面列出了几个非官方频道(可能还有更多):</p>
+
+<ul>
+<li>
+<p><a href="irc://irc.freenode.net/android-firehose">#android-firehose</a> - 实时显示提交到 Android 开放源代码项目的内容</p>
+</li>
+<li>
+<p><a href="irc://irc.freenode.net/android-fr">#android-fr</a> - pour discuter d'Android en français</p>
+</li>
+<li>
+<p><a href="irc://irc.freenode.net/android-offtopic">#android-offtopic</a> - 用于进行题外话讨论</p>
+</li>
+<li>
+<p><a href="irc://irc.freenode.net/android-root">#android-root</a> - 用于讨论与超出说明书范围使用硬件有关的问题</p>
+</li>
+</ul>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/contributing.html b/zh-cn/source/contributing.html
new file mode 100644
index 00000000..5a10f4e6
--- /dev/null
+++ b/zh-cn/source/contributing.html
@@ -0,0 +1,39 @@
+<html devsite><head>
+ <title>做出贡献</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>感谢您对 Android 的关注!您可以通过以下几种方式进入 Android 的世界并帮助我们改进 Android。如需了解 Android 项目的背景和我们的目标,请查看<a href="/source/index.html">概览</a>页面。</p>
+<h2 id="report-bugs">报告错误</h2>
+
+<p>您可以帮助我们改进 Android 的最简单和最有效的方式之一是提交错误。如需了解详情,请访问<a href="report-bugs.html">报告错误</a>页面。</p>
+<p>请注意,我们无法保证会在任何特定版本中修复任何特定错误。要了解在您报告错误之后会出现什么情况,请阅读<a href="life-of-a-bug.html">错误的生命周期</a>。</p>
+
+<h2 id="develop-apps">开发应用</h2>
+<p>我们构建 Android 的一个目标就是方便所有开发者通过一个开放的平台向用户分发应用。您可以帮助 Android 的最佳方式之一就是编写用户喜欢的超酷应用!</p>
+
+<p>要开始开发应用,请访问 <a href="https://developer.android.com">developer.android.com</a>。该网站为您提供了使用 SDK 编写适用于 Android 兼容设备的应用所需的信息和工具。</p>
+
+<h2 id="contribute-to-the-code">贡献代码</h2>
+<p>代码是一切的基础。我们很乐意审核您提交的任何更改,因此请检查我们的源代码,找出错误或功能方面的可改进之处,然后开始编码。请注意,您提交的补丁程序越小、越有针对性,就越方便我们进行审核。</p>
+
+<p>要开始帮助改进 Android,您可以通过左侧的链接了解<a href="life-of-a-patch.html">补丁程序的生命周期</a>、<code>git</code>、<code>repo</code> 以及其他工具。您还可以在我们的 <a href="https://android-review.googlesource.com/">Gerrit 服务器</a>上查看所有贡献的动态。如果您在此过程中需要帮助,可以加入我们的<a href="/source/community.html">论坛</a>。</p>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/developing.html b/zh-cn/source/developing.html
new file mode 100644
index 00000000..cf146cc0
--- /dev/null
+++ b/zh-cn/source/developing.html
@@ -0,0 +1,153 @@
+<html devsite><head>
+ <title>开发</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>要处理 Android 代码,您需要同时使用 Git 和 Repo。在大多数情况下,您可以仅使用 Git(不必使用 Repo),或结合使用 Repo 和 Git 命令以组成复杂的命令。不过,使用 Repo 执行基本的跨网络操作可大大简化您的工作。</p>
+<p><strong>Git</strong> 是一个开放源代码的版本控制系统,专用于处理分布在多个代码库上的大型项目。在 Android 环境中,我们会使用 Git 执行本地操作,例如建立本地分支、提交、查看更改、修改。打造 Android 项目所面临的挑战之一就是确定如何最好地支持外部社区 - 从业余爱好者社区到生产大众消费类设备的大型原始设备制造商 (OEM)。我们希望组件可以替换,并希望有趣的组件能够在 Android 之外自行发展。我们最初决定使用一种分布式修订版本控制系统,经过筛选,最后选中了 Git。</p>
+<p><strong>Repo</strong> 是我们以 Git 为基础构建的代码库管理工具。Repo 可以在必要时整合多个 Git 代码库,将相关内容上传到我们的<a href="https://android-review.googlesource.com/">修订版本控制系统</a>,并自动执行 Android 开发工作流程的部分环节。Repo 并非用来取代 Git,只是为了让您在 Android 环境中更轻松地使用 Git。Repo 命令是一段可执行的 Python 脚本,您可以将其放在路径中的任何位置。使用 Android 源代码文件时,您可以使用 Repo 执行跨网络操作。例如,您可以借助单个 Repo 命令,将文件从多个代码库下载到本地工作目录。</p>
+<p><strong>Gerrit</strong> 是一个基于网页的代码审核系统,适用于使用 Git 的项目。Gerrit 允许所有授权用户提交更改(如果通过代码审核,这些更改会自动纳入项目中),以此鼓励他们更集中地使用 Git。此外,Gerrit 可以在浏览器中并排显示更改,并支持代码内注释,使得审核工作变得更轻松。</p>
+<p><strong>Android Studio</strong> 是用于开发 Android 应用的官方集成开发环境 (IDE)。如需了解详情,请参阅 <a href="http://developer.android.com/tools/studio/index.html">Android Studio 概览</a>。
+
+</p><h2 id="basic-workflow">基本工作流程</h2>
+<div class="attempt-right" style="width:200px">
+ <img src="/images/submit-patches-0.png" alt="基本工作流程示意图" height="153px"/>
+ <p class="img-caption">
+ <strong>图 1.</strong> Android 基本工作流程</p>
+</div>
+
+<p>与代码库进行交互的基本模式如下:</p>
+<ol>
+<li>
+<p>使用 <code>repo start</code> 新建一个主题分支。</p>
+</li>
+<li>
+<p>修改文件。</p>
+</li>
+<li>
+<p>使用 <code>git add</code> 暂存更改。</p>
+</li>
+<li>
+<p>使用 <code>git commit</code> 提交更改。</p>
+</li>
+<li>
+<p>使用 <code>repo upload</code> 将更改上传到审核服务器。</p>
+</li>
+</ol>
+<h2 id="task-reference">任务参考</h2>
+<p>以下任务列表简要总结了如何执行常见的 Repo 和 Git 任务。要了解如何使用 Repo 下载源代码,请参阅<a href="/source/downloading.html">下载源代码</a>和<a href="/source/using-repo.html">使用 Repo</a>。</p>
+<h2 id="synchronizing-your-client">同步客户端</h2>
+<p>要同步所有可用项目的文件,请运行以下命令:</p>
+<pre><code>$ repo sync
+</code></pre>
+<p>要同步所选项目的文件,请运行以下命令:</p>
+<pre><code>$ repo sync PROJECT0 PROJECT1 PROJECT2 ...
+</code></pre>
+<h2 id="creating-topic-branches">创建主题分支</h2>
+<p>当您开始进行更改(例如当您开始处理错误或使用新功能)时,请在本地工作环境中新建一个主题分支。主题分支不是原始文件的副本;它代表着特定提交。这样一来,您可以轻松创建本地分支并在这些分支之间切换。通过使用分支,您可以将工作的某个方面与其他方面分隔开来。请参阅<a href="http://www.kernel.org/pub/software/scm/git/docs/howto/separating-topic-branches.txt">分隔主题分支</a>(一篇有关使用主题分支的趣味文章)。</p>
+<p>要使用 Repo 新建一个主题分支,请转到要修改的项目并运行以下命令:</p>
+<pre><code>$ repo start BRANCH_NAME .
+</code></pre>
+<p>请注意,句点代表当前工作目录中的项目。要验证您的新分支是否已创建,请运行以下命令:</p>
+<pre><code>$ repo status .
+</code></pre>
+<h2 id="using-topic-branches">使用主题分支</h2>
+<p>要将分支分配给特定项目,请运行以下命令:</p>
+<pre><code>$ repo start BRANCH_NAME PROJECT_NAME
+</code></pre>
+<p>要查看所有项目的列表,请访问 <a href="https://android.googlesource.com/">android.googlesource.com</a>。再次提醒,如果您已转到特定的项目目录,可以简单地使用一个句点来表示当前项目。</p>
+
+<p>要切换到您已在本地工作环境中创建的另一个分支,请运行以下命令:</p>
+<pre><code>$ git checkout BRANCH_NAME
+</code></pre>
+<p>要查看现有分支的列表,请运行以下命令:</p>
+<pre><code>$ git branch
+</code></pre>
+<p>或</p>
+<pre><code>$ repo branches
+</code></pre>
+<p>当前分支的名称前面将标注星号。</p>
+<p class="note"><strong>注意</strong>:错误可能会导致 <code>repo sync</code> 重置本地主题分支。如果在您运行 <code>repo sync</code> 之后,<code>git branch</code> 显示 *(无分支),请再次运行 <code>git checkout</code>。</p>
+<h2 id="staging-files">暂存文件</h2>
+<p>默认情况下,Git 会检测到您在项目中所做的更改,但不会跟踪这些更改。要让 Git 保存您的更改,您必须将更改标记为包含在提交中。这也称为“暂存”。</p>
+<p>您可以通过运行以下命令来暂存更改:</p>
+<pre><code>git add
+</code></pre>
+<p>对于此命令,项目目录中的任何文件或目录都可作为参数。<code>git add</code> 并不像其名称表示的这样只是简单地将文件添加到 Git 代码库,它还可以用于暂存文件的修改和删除的内容。</p>
+<h2 id="viewing-client-status">查看客户端状态</h2>
+<p>要列出文件的状态,请运行以下命令:</p>
+<pre><code>$ repo status
+</code></pre>
+<p>要查看未提交的修改,请运行以下命令:</p>
+<pre><code>$ repo diff
+</code></pre>
+<p>如果您准备立即提交,运行 <code>repo diff</code> 命令可让系统显示您所做的不会包含在提交中的每一项本地更改。<em></em>如果您准备立即提交,要查看将包含在提交中的每一项更改,您需要运行 Git 命令 <code>git diff</code>。在运行该命令之前,请确保您已转到项目目录下:</p>
+<pre><code>$ cd ~/WORKING_DIRECTORY/PROJECT
+$ git diff --cached
+</code></pre>
+<h2 id="committing-changes">提交更改</h2>
+<p>在 Git 中,提交是修订版本控制的基本单位,包含目录结构的快照以及整个项目的文件内容。在 Git 中创建提交很简单,只需输入以下命令即可:</p>
+<pre><code>git commit
+</code></pre>
+<p>系统会提示您使用惯用的编辑器提供一条提交消息;请为您提交到 AOSP 的所有更改都提供一条会有帮助作用的消息。如果您没有添加日志消息,提交将会终止。</p>
+<h2 id="uploading-changes-to-gerrit">将更改上传到 Gerrit</h2>
+<p>上传之前,请先更新为最新修订版本:</p>
+<pre><code>repo sync
+</code></pre>
+<p>然后运行以下命令:</p>
+<pre><code>repo upload
+</code></pre>
+<p>运行此命令后,系统会随即列出您已提交的更改,并提示您选择要上传到审核服务器的分支。如果只有一个分支,您会看到一个简单的 <code>y/n</code> 提示符。</p>
+<h2 id="recovering-sync-conflicts">恢复同步冲突</h2>
+<p>如果 <code>repo sync</code> 显示同步冲突,请执行以下操作:</p>
+<ul>
+<li>查看未合并的文件(状态代码 = U)。</li>
+<li>根据需要修改存在冲突的地方。</li>
+<li>
+<p>在相关项目目录中进行更改,为相关文件运行 <code>git add</code> 和 <code>git commit</code>,然后对这些更改执行“衍合”(rebase) 命令。例如:</p>
+<pre><code>$ git add .
+$ git commit
+$ git rebase --continue
+</code></pre>
+</li>
+<li>
+<p>当衍合完成后,再一次开始整个同步过程:</p>
+<pre><code>$ repo sync PROJECT0 PROJECT1 ... PROJECTN
+</code></pre>
+</li>
+</ul>
+<h2 id="cleaning-up-your-client-files">清理您的客户端文件</h2>
+<p>要在更改合并到 Gerrit 中后更新您的本地工作目录,请运行以下命令:</p>
+<pre><code>$ repo sync
+</code></pre>
+<p>要安全移除已过时的主题分支,请运行以下命令:</p>
+<pre><code>$ repo prune
+</code></pre>
+<h2 id="deleting-a-client">删除客户端</h2>
+<p>由于所有状态信息都会存储在客户端中,您只需从文件系统中删除相应目录即可:</p>
+<pre><code>$ rm -rf WORKING_DIRECTORY
+</code></pre>
+<p><em></em>删除客户端将永久删除您尚未上传以供审核的任何更改。</p>
+<h2 id="git-and-repo-cheatsheet">Git 和 Repo 快速参考表</h2>
+<img src="/images/git-repo-1.png" alt="基本 Git 和 Repo 命令列表" id="figure2"/>
+<p class="img-caption">
+ <strong>图 2.</strong> 基本 Git 和 Repo 命令</p>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/devices.html b/zh-cn/source/devices.html
new file mode 100644
index 00000000..d796fa3e
--- /dev/null
+++ b/zh-cn/source/devices.html
@@ -0,0 +1,113 @@
+<html devsite><head>
+ <title>选择设备</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>您可以使用 Android 开放源代码项目 (AOSP) 版本和针对特定硬件的相关二进制文件来开发适用于 Nexus 设备的版本。要查看可用的 Android 版本和针对的 Nexus 设备,请参阅<a href="/source/build-numbers.html#source-code-tags-and-builds">源代码、标记和版本</a>。</p>
+
+<p class="note"><b>注意</b>:由于硬件差异,切勿在原本搭载 Android 4.1.2 或更高版本销售的 Nexus 7 上使用 Android 4.1.1。</p>
+
+<p>您也可以开发适用于 <a href="https://android.googlesource.com/device/linaro/hikey/">HiKey</a> Android 参考开发板(如下所述)的版本。参考开发板旨在协助非 Nexus 组件供应商开发驱动程序并将其移植到各 Android 版本。使用参考开发板可以简化升级工作,缩短将新 Android 设备推向市场所需的时间,降低设备成本(因为使用参考开发板时,原始设计制造商 (ODM)/原始设备制造商 (OEM) 可以从更多兼容组件中进行选择),并加快组件供应商的创新速度。</p>
+
+<h2 id="hikey-boards">HiKey 开发板</h2>
+
+<p>Google 支持使用 <a href="https://www.96boards.org/products/ce/hikey/">HiKey</a>(经认证的 <a href="http://www.96boards.org/">96Board</a>)作为 Android 参考开发板。AOSP 可为 HiKey 提供内核源代码和开发板支持,让开发者能够轻松开发和调试新的及现有的外围设备驱动程序,进行内核开发,并以更少的原始设备制造商 (OEM) 费用执行其他任务。</p>
+
+<p>HiKey 开发板由 <a href="http://www.lenovator.com">Lenovator</a> 提供,有 <a href="http://www.lenovator.com/product/86.html">1GB RAM</a> 和 <a href="http://www.lenovator.com/product/90.html">2GB RAM</a> 配置可供选择:</p>
+
+<img src="images/hikey-board.png" alt="HiKey 开发板图片"/>
+<p class="img-caption"><strong>图 1.</strong> Lenovator 提供的 HiKey 开发板</p>
+
+<p>其他资源:</p>
+<ul>
+<li>
+<a href="https://www.96boards.org/wp-content/uploads/2015/02/96Boards-Hikey-Rev-A1.pdf">HiKey 示意图</a></li>
+<li>
+<a href="https://www.96boards.org/wp-content/uploads/2015/02/HiKey_User_Guide_Rev0.2.pdf">HiKey 用户指南</a></li>
+<li>
+<a href="https://github.com/96boards/documentation/wiki/HiKey-Home">HiKey Wiki</a></li>
+</ul>
+
+<h2 id="running-android-hikey">在 HiKey 上运行 Android</h2>
+
+<p>您可以使用以下命令下载、编译 Android 并在 HiKey 开发板上运行 Android。</p>
+
+<h3 id="compiling-userspace">编译用户空间</h3>
+<ol>
+<li>下载 Android 源代码树:<br />
+<pre><code>$ repo init -u <a href="https://android.googlesource.com/platform/manifest">https://android.googlesource.com/platform/manifest</a> -b master<br />
+$ repo sync -j24</code></pre></li>
+<li>下载 HDMI 二进制文件,并将其解压到 Android 源代码树中:<br />
+<pre><code>$ wget <a href="https://dl.google.com/dl/android/aosp/linaro-hikey-20160226-67c37b1a.tgz">https://dl.google.com/dl/android/aosp/linaro-hikey-20160226-67c37b1a.tgz</a><br />
+$ tar xzf linaro-hikey-20160226-67c37b1a.tgz<br />
+$ ./extract-linaro-hikey.sh</code></pre></li>
+<li>安装 mcopy 实用工具:<br />
+<pre><code>$ apt-get install mtools</code></pre></li>
+<li>编译:<br />
+<pre><code>$ . ./build/envsetup.sh<br />
+$ lunch hikey-userdebug<br />
+$ make -j32</code></pre></li>
+</ol>
+
+<p class="note"><b>注意</b>:如果是 4GB eMMC,请不要使用 <code>$ make -j32</code>,而是要使用 <code>$ make -j32 TARGET_USERDATAIMAGE_4GB=true</code>。</p>
+
+<h3 id="installing-fastboot-ptable">安装初始 fastboot 和 ptable</h3>
+<ol>
+<li>连接 J15 1-2 和 3-4 引脚,从而选择特殊的引导加载程序模式(有关详情,请参阅 <a href="https://www.96boards.org/wp-content/uploads/2015/02/HiKey_User_Guide_Rev0.2.pdf">HiKey 用户指南</a>)。</li>
+<li>将 USB 连接到 PC,以获取 ttyUSB 设备(例如:<code>/dev/ttyUSB1</code>)。</li>
+<li>为开发板接通电源:<br />
+<pre><code>$ cd device/linaro/hikey/installer/hikey<br />
+$ ./flash-all.sh /dev/ttyUSB1 [4g]</code></pre></li>
+<li>取下跳线 3-4,并为开发板接通电源。</li>
+</ol>
+
+<h3 id="flashing-images">将映像刷到设备上</h3>
+<ol>
+<li>连接 J15 1-2 和 5-6 引脚,从而进入 fastboot 模式。</li>
+<li>运行以下命令:<br />
+<pre><code>$ fastboot flash boot out/target/product/hikey/boot.img<br />
+$ fastboot flash -w system out/target/product/hikey/system.img</code></pre></li>
+<li>取下跳线 5-6,并为开发板接通电源。</li>
+</ol>
+
+<h3 id="building-kernel">编译内核</h3>
+<ol>
+<li>运行以下命令:<br />
+<pre><code>$ git clone <a href="https://android.googlesource.com/kernel/hikey-linaro">https://android.googlesource.com/kernel/hikey-linaro</a><br />
+$ cd hikey-linaro<br />
+$ git checkout -b android-hikey-linaro-4.9 origin/android-hikey-linaro-4.9<br />
+$ make ARCH=arm64 hikey_defconfig<br />
+$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-android- -j24</code></pre></li>
+<li>将输出复制到 HiKey 内核目录 (<code>/kernel/hikey-linaro</code>):<ol style="list-style-type:lower-alpha">
+<li>将 hi6220-hikey.dtb (<code>arch/arm64/boot/dts/hisilicon/hi6220-hikey.dtb</code>) 复制到 HiKey 内核目录,并将其重命名为 hi6220-hikey.dtb-4.9。</li>
+<li>将映像文件 <code>(arch/arm64/boot/Image-dtb</code>) 复制到 HiKey 内核目录,并将其重命名为 Image-dtb-4.9。</li></ol>
+</li><li>制作启动映像:<pre>
+$ make bootimage -j24
+</pre>
+</li>
+</ol>
+
+<h3 id="setting-resolution">设置显示器分辨率</h3>
+<p>修改 <code>device/linaro/hikey/hikey/BoardConfig.mk</code> 参数 <code>BOARD_KERNEL_CMDLINE</code>,并配置 <code>video</code> 设置。以下是 24 英寸显示器的示例设置:<code>video=HDMI-A-1:1280x800@60</code>。</p>
+
+<h3 id="configuring-output">配置内核串行输出 (uart3)</h3>
+<p>将 J2 低速扩展连接器设为 1 - Gnd、11 - Rx、13 - Tx。有关详情,请参阅 <a href="https://www.96boards.org/wp-content/uploads/2015/02/HiKey_User_Guide_Rev0.2.pdf">HiKey 用户指南</a>。</p>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/downloading.html b/zh-cn/source/downloading.html
new file mode 100644
index 00000000..ca66a612
--- /dev/null
+++ b/zh-cn/source/downloading.html
@@ -0,0 +1,187 @@
+<html devsite><head>
+ <title>下载源代码</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>Android 源代码树位于由 Google 托管的 Git 代码库中。Git 代码库中包含 Android 源代码的元数据,其中包括与对源代码进行的更改以及更改日期相关的元数据。本文档介绍了如何下载特定 Android 代码流水线的源代码树。
+</p>
+<p>要从特定设备的出厂映像开始,请参阅<a href="running.html#selecting-device-build">选择设备版本</a>。
+</p>
+<h2 id="installing-repo">安装 Repo</h2>
+<p>Repo 是一款工具,可让您在 Android 环境中更轻松地使用 Git。要详细了解 Repo,请参阅<a href="developing.html">开发</a>部分。
+</p>
+<p>要安装 Repo,请执行以下操作:</p>
+<ol>
+ <li>
+ <p>确保主目录下有一个 bin/ 目录,并且该目录包含在路径中:</p>
+ <pre>
+<code>$ mkdir ~/bin
+$ PATH=~/bin:$PATH
+</code>
+</pre>
+ </li>
+ <li>
+ <p>下载 Repo 工具,并确保它可执行:</p>
+ <pre>
+$ curl https://storage.googleapis.com/git-repo-downloads/repo &gt; ~/bin/repo
+$ chmod a+x ~/bin/repo
+</pre>
+ </li>
+</ol>
+<p>对于 1.21 版,Repo 的 SHA-1 校验和为 b8bd1804f432ecf1bab730949c82b93b0fc5fede</p>
+<p>对于 1.22 版,Repo 的 SHA-1 校验和为 da0514e484f74648a890c0467d61ca415379f791</p>
+<p>对于 1.23 版,Repo 的 SHA-1 校验和为 ac9d646f6d699f6822a6bc787d3e7338ae7ab6ed</p>
+<h2 id="initializing-a-repo-client">初始化 Repo 客户端</h2>
+<p>安装 Repo 后,设置您的客户端以访问 Android 源代码代码库:</p>
+<ol>
+ <li>
+ <p>创建一个空目录来存放您的工作文件。如果您使用的是 MacOS,必须在区分大小写的文件系统中创建该目录。为其指定一个您喜欢的任意名称:</p>
+<pre>
+$ mkdir WORKING_DIRECTORY
+$ cd WORKING_DIRECTORY
+</pre>
+ </li>
+ <li>
+ <p>使用您的真实姓名和电子邮件地址配置 Git。要使用 Gerrit 代码审核工具,您需要一个与<a href="https://www.google.com/accounts">已注册的 Google 帐号</a>关联的电子邮件地址。确保这是您可以接收邮件的有效地址。您在此处提供的姓名将显示在您提交的代码的提供方信息中。
+ </p>
+<pre>
+$ git config --global user.name "Your Name"
+$ git config --global user.email "you@example.com"
+</pre>
+ </li>
+
+ <li>
+ <p>运行 <code>repo init</code> 以获取最新版本的 Repo 及其最近的所有错误更正内容。您必须为清单指定一个网址,该网址用于指定 Android 源代码中包含的各个代码库将位于工作目录中的什么位置。
+ </p>
+<pre>
+$ repo init -u https://android.googlesource.com/platform/manifest
+</pre>
+ <p>要对“master”以外的分支进行校验,请使用 <code>-b</code> 来指定相应分支。要查看分支列表,请参阅<a href="build-numbers.html#source-code-tags-and-builds">源代码标记和版本</a>。
+ </p>
+<pre>
+$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1
+</pre>
+ </li>
+</ol>
+<p>初始化成功后,系统将显示一条消息,告诉您 Repo 已在工作目录中完成初始化。客户端目录中现在应包含一个 <code>.repo</code> 目录,清单等文件将保存在该目录下。
+</p>
+<h2 id="getting-the-files">下载 Android 源代码树</h2>
+<p>要将 Android 源代码树从默认清单中指定的代码库下载到工作目录,请运行以下命令:</p>
+<pre>$ repo sync</pre>
+<p>Android 源代码文件将位于工作目录中对应的项目名称下。初始同步操作将需要 1 个小时或更长时间才能完成。要详细了解 <code>repo
+ sync</code> 和其他 Repo 命令,请参阅<a href="developing.html">开发</a>部分。
+</p>
+<h2 id="using-authentication">使用身份验证</h2>
+<p>默认情况下,访问 Android 源代码均为匿名操作。为了防止服务器被过度使用,每个 IP 地址都有一个相关联的配额。
+</p>
+<p>当与其他用户共用一个 IP 地址时(例如,在越过 NAT 防火墙访问源代码代码库时),系统甚至会针对常规使用模式(例如,许多用户在短时间内从同一个 IP 地址同步新客户端)触发配额。
+</p>
+<p>在这种情况下,可以使用进行身份验证的访问方式,此类访问方式会对每位用户使用单独的配额,而不考虑 IP 地址。
+</p>
+<p>第一步是使用<a href="https://android.googlesource.com/new-password">密码生成器</a>生成密码,然后按照密码生成器页面中的说明进行操作。
+</p>
+<p>第二步是通过使用以下清单 URI,强制使用进行身份验证的访问方式:<code>https://android.googlesource.com/a/platform/manifest</code>。请注意 <code>/a/</code> 目录前缀如何触发强制性身份验证。您可以通过以下命令将现有客户端转换为使用强制性身份验证:</p>
+<pre>
+$ repo init -u https://android.googlesource.com/a/platform/manifest
+</pre>
+<h2 id="troubleshooting-network-issues">排查网络问题</h2>
+<p>在使用代理的情况下下载内容(在一些企业环境中很常见)时,您可能需要明确指定 Repo 随后使用的代理:</p>
+<pre>
+$ export HTTP_PROXY=http://&lt;proxy_user_id&gt;:&lt;proxy_password&gt;@&lt;proxy_server&gt;:&lt;proxy_port&gt;
+$ export HTTPS_PROXY=http://&lt;proxy_user_id&gt;:&lt;proxy_password&gt;@&lt;proxy_server&gt;:&lt;proxy_port&gt;
+</pre>
+<p>一种比较少见的情况是,Linux 客户端遇到连接问题,在下载期间(通常是在“正在接收对象”期间)被卡住。有人曾报告称,调整 TCP/IP 堆栈的设置并使用非并行命令可以改善这种情况。您需要拥有 root 权限才能修改 TCP 设置:</p>
+<pre>
+$ sudo sysctl -w net.ipv4.tcp_window_scaling=0
+$ repo sync -j1
+</pre>
+<h2 id="using-a-local-mirror">使用本地镜像</h2>
+<p>当您使用多个客户端时(尤其是在带宽不足的情况下),最好为所有服务器内容创建一个本地镜像,并从该镜像同步客户端(不需要访问网络)。一个完整镜像的下载文件比两个客户端的下载文件要小一些,而且包含更多信息。
+</p>
+<p>以下说明假定在 <code>/usr/local/aosp/mirror</code> 中创建镜像。第一步是创建并同步镜像本身。请注意 <code>--mirror</code> 标志,该标志只能在创建新客户端时指定:</p>
+<pre>
+$ mkdir -p /usr/local/aosp/mirror
+$ cd /usr/local/aosp/mirror
+$ repo init -u https://android.googlesource.com/mirror/manifest --mirror
+$ repo sync
+</pre>
+<p>同步镜像后,您就可以从镜像创建新客户端了。请注意,务必要指定一个绝对路径:</p>
+<pre>$ mkdir -p /usr/local/aosp/master
+$ cd /usr/local/aosp/master
+$ repo init -u /usr/local/aosp/mirror/platform/manifest.git
+$ repo sync
+</pre>
+<p>最后,要将客户端与服务器同步,您需要将镜像与服务器同步,然后再将客户端与镜像同步:</p>
+<pre>
+$ cd /usr/local/aosp/mirror
+$ repo sync
+$ cd /usr/local/aosp/master
+$ repo sync
+</pre>
+<p>您可以将镜像存储在 LAN 服务器上,然后通过 NFS、SSH 或 Git 访问它。您还可以将其存储在移动存储盘上,并在用户之间或计算机之间传用该存储盘。
+</p>
+<h2 id="verifying-git-tags">验证 Git 标记</h2>
+<p>将以下公钥加载到您的 GnuPG 密钥数据库中。该密钥用于签署代表各版本的带批注标记。
+</p>
+<pre>
+$ gpg --import
+</pre>
+<p>复制并粘贴以下密钥,然后输入 EOF (Ctrl-D) 以结束输入并处理密钥。
+</p>
+<pre>
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.2.2 (GNU/Linux)
+
+mQGiBEnnWD4RBACt9/h4v9xnnGDou13y3dvOx6/t43LPPIxeJ8eX9WB+8LLuROSV
+lFhpHawsVAcFlmi7f7jdSRF+OvtZL9ShPKdLfwBJMNkU66/TZmPewS4m782ndtw7
+8tR1cXb197Ob8kOfQB3A9yk2XZ4ei4ZC3i6wVdqHLRxABdncwu5hOF9KXwCgkxMD
+u4PVgChaAJzTYJ1EG+UYBIUEAJmfearb0qRAN7dEoff0FeXsEaUA6U90sEoVks0Z
+wNj96SA8BL+a1OoEUUfpMhiHyLuQSftxisJxTh+2QclzDviDyaTrkANjdYY7p2cq
+/HMdOY7LJlHaqtXmZxXjjtw5Uc2QG8UY8aziU3IE9nTjSwCXeJnuyvoizl9/I1S5
+jU5SA/9WwIps4SC84ielIXiGWEqq6i6/sk4I9q1YemZF2XVVKnmI1F4iCMtNKsR4
+MGSa1gA8s4iQbsKNWPgp7M3a51JCVCu6l/8zTpA+uUGapw4tWCp4o0dpIvDPBEa9
+b/aF/ygcR8mh5hgUfpF9IpXdknOsbKCvM9lSSfRciETykZc4wrRCVGhlIEFuZHJv
+aWQgT3BlbiBTb3VyY2UgUHJvamVjdCA8aW5pdGlhbC1jb250cmlidXRpb25AYW5k
+cm9pZC5jb20+iGAEExECACAFAknnWD4CGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIX
+gAAKCRDorT+BmrEOeNr+AJ42Xy6tEW7r3KzrJxnRX8mij9z8tgCdFfQYiHpYngkI
+2t09Ed+9Bm4gmEO5Ag0ESedYRBAIAKVW1JcMBWvV/0Bo9WiByJ9WJ5swMN36/vAl
+QN4mWRhfzDOk/Rosdb0csAO/l8Kz0gKQPOfObtyYjvI8JMC3rmi+LIvSUT9806Up
+hisyEmmHv6U8gUb/xHLIanXGxwhYzjgeuAXVCsv+EvoPIHbY4L/KvP5x+oCJIDbk
+C2b1TvVk9PryzmE4BPIQL/NtgR1oLWm/uWR9zRUFtBnE411aMAN3qnAHBBMZzKMX
+LWBGWE0znfRrnczI5p49i2YZJAjyX1P2WzmScK49CV82dzLo71MnrF6fj+Udtb5+
+OgTg7Cow+8PRaTkJEW5Y2JIZpnRUq0CYxAmHYX79EMKHDSThf/8AAwUIAJPWsB/M
+pK+KMs/s3r6nJrnYLTfdZhtmQXimpoDMJg1zxmL8UfNUKiQZ6esoAWtDgpqt7Y7s
+KZ8laHRARonte394hidZzM5nb6hQvpPjt2OlPRsyqVxw4c/KsjADtAuKW9/d8phb
+N8bTyOJo856qg4oOEzKG9eeF7oaZTYBy33BTL0408sEBxiMior6b8LrZrAhkqDjA
+vUXRwm/fFKgpsOysxC6xi553CxBUCH2omNV6Ka1LNMwzSp9ILz8jEGqmUtkBszwo
+G1S8fXgE0Lq3cdDM/GJ4QXP/p6LiwNF99faDMTV3+2SAOGvytOX6KjKVzKOSsfJQ
+hN0DlsIw8hqJc0WISQQYEQIACQUCSedYRAIbDAAKCRDorT+BmrEOeCUOAJ9qmR0l
+EXzeoxcdoafxqf6gZlJZlACgkWF7wi2YLW3Oa+jv2QSTlrx4KLM=
+=Wi5D
+-----END PGP PUBLIC KEY BLOCK-----
+</pre>
+<p>导入密钥后,您可以通过以下命令验证任何标记:</p>
+<pre>
+$ git tag -v TAG_NAME
+</pre>
+<p>如果您尚未<a href="initializing.html#ccache">设置 ccache</a>,现在是设置它的最佳时机。
+</p>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/faqs.html b/zh-cn/source/faqs.html
new file mode 100644
index 00000000..4b23549d
--- /dev/null
+++ b/zh-cn/source/faqs.html
@@ -0,0 +1,126 @@
+<html devsite><head>
+ <title>常见问题解答</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<a name="top"></a>
+<p>要查看关于其他常见问题的解答,请参阅 developer.android.com 上的 <a href="http://developer.android.com/guide/faq/index.html">Android 常见问题解答</a>。
+
+</p><h2 id="open-source">开放源代码</h2>
+<h3 id="what-is-the-android-open-source-project">Android 开放源代码项目是什么?</h3>
+<p>我们使用“Android 开放源代码项目”或“AOSP”来表示 Android 涉及的人员、流程和源代码。</p>
+<p>人员负责监督该项目并开发实际的源代码。流程指我们为了管理该软件的开发而使用的工具和程序。该项目的最终结果是您可以用来打造手机和其他设备的源代码。</p>
+<h3 id="why-did-we-open-the-android-source-code">我们为什么开放了 Android 源代码?</h3>
+<p>根据我们自己在发布移动应用方面的经验,Google 启动了 Android 项目。我们希望确保始终有开放的平台可供运营商、原始设备制造商 (OEM) 和开发者使用,以便他们将创新的想法变为现实。我们还希望确保不存在任何集中瓶颈,这样的话,就没有任何行业参与者可以一手限制或控制任何其他参与者开展创新。Android 开放源代码项目 (AOSP) 有一个最重要的目标,就是确保尽可能广泛、尽可能兼容地实施 Android 开放源代码软件,使每个人都能从中受益。</p>
+<h3 id="what-kind-of-open-source-project-is-android">Android 是哪种开放源代码项目?</h3>
+<p>Google 负责监督 Android 开放源代码平台核心部分的开发工作,并致力于打造卓越的开发者和用户社区。在大多数情况下,Android 源代码都是根据宽松的 Apache Software License 2.0(而非“Copyleft”许可)授权用户使用。这主要是因为我们最重要的目标是让用户广泛采用该软件,而我们认为 ASL2.0 许可有助于最好地实现这一目标。</p>
+<p>您可以在我们的<a href="/source/licenses.html">许可</a>页面中找到关于此主题的更多信息。</p>
+<h3 id="why-is-google-in-charge-of-android">为什么由 Google 主管 Android 项目?</h3>
+<p>发布软件平台非常复杂。开放性对于平台长期取得成功至关重要,这是因为要吸引开发者投入到其中并确保公平的竞争环境,必须具备开放性。不过,平台本身也必须是对用户极具吸引力的产品。</p>
+<p>正是因为这个原因,Google 调配了必需的专业工程资源,以确保 Android 是具备充分竞争力的软件平台。Google 将 Android 项目视为一个全方位的产品开发运营项目,并致力于实现必要的业务交易,以确保运行 Android 的卓越设备能够确确实实地将其推向市场。</p>
+<p>通过确保 Android 在用户那里获得成功,我们可以帮助确保 Android 作为平台和开放源代码项目的活力。毕竟,谁不希望 Android 源代码成为一款成功的产品呢?</p>
+<p>Google 的目标是确保围绕 Android 打造一个成功的生态系统。当然,没有哪个人必须参与其中。我们开放了 Android 源代码,以便任何人都可以修改和分发该软件来满足自己的需求。</p>
+<h3 id="what-is-googles-overall-strategy-for-android-product-development">Google 在 Android 产品开发方面的总体策略是什么?</h3>
+<p>我们致力于向竞争激烈的市场推出卓越的设备。有鉴于此,我们会将开发的创新技术和增强功能纳入到下一版本的核心平台中。</p>
+<p>在实践中,这意味着 Android 工程团队通常只侧重于少数“旗舰”设备,并负责开发下一版 Android 软件来为这些产品的发布提供支持。这些旗舰设备可以消化很多产品风险,并为广泛的原始设备制造商 (OEM) 社区开辟新的道路,让他们接下来能够推出更多充分利用新功能的设备。通过这种方式,我们可以确保 Android 平台能够根据现实设备的实际需求不断发展完善。</p>
+<h3 id="how-is-the-android-software-developed">Android 软件的开发方式是怎样的?</h3>
+<p>Android 的每个平台版本(例如 1.5、1.6 等)在开放源代码树中都有对应的分支。在任何指定的时刻,最新的此类分支将被视为“当前稳定”的分支版本。这个当前稳定的分支是制造商移植到其设备的分支。该分支会始终保持适合发布的状态。</p>
+<p>同时,每个版本还有一个“当前实验性”分支,开发者可以在其中开发实验性贡献内容,例如大量的下一代功能。在适当情况下,实验性分支中的错误更正内容和其他贡献内容可以纳入到当前稳定分支中。</p>
+<p>最后,Google 会在开发旗舰设备的同时致力于研究下一版 Android 平台。在适当情况下,该分支将纳入实验性分支和稳定分支中的更改。</p>
+<p>您可以在我们的<a href="/source/code-lines.html">代码行、分支和版本</a>页面中找到关于此主题的更多信息。</p>
+<h3 id="why-are-parts-of-android-developed-in-private">为什么 Android 的部分内容是在私下开发的?</h3>
+<p>将一款设备推向市场通常需要超过一年的时间。设备制造商无疑希望植入他们可以植入的最新 Android 软件。与此同时,开发者也不希望在编写应用时还要不断追用该平台的新版本。制造商和开发者都会面临及时推出自家产品与追用最新版本难以两全的状况。</p>
+<p>为了解决这个问题,下一版 Android 的部分内容(包括核心平台 API)会在私有分支中进行开发。这些 API 将纳入到下一版 Android 中。我们的目标是,在我们开发下一版平台的同时,让其他人将注意力放在当前稳定版 Android 源代码上。这样一来,开发者和原始设备制造商 (OEM) 便可以使用单个版本,而无需为了跟上 Android 开发步伐而追用尚不完善的未来版本。不过,Android 系统中与应用兼容性无关的其他部分是在开放环境中开发的。我们打算逐渐将其中更多的部分转移到开放的开发环境中。</p>
+<h3 id="when-are-source-code-releases-made">何时发布源代码?</h3>
+<p>当源代码准备就绪时发布。发布源代码是一个相当复杂的过程。Android 的某些部分是在开放环境中开发的,因此相应的源代码始终可用。还有一些部分最初是在私有树中开发的,并且相应的源代码会在下一个平台版本准备就绪时发布。</p>
+<p>对于某些版本,核心平台 API 会提前足够长的时间准备就绪,这样我们就可以在设备发布之前推出源代码,以便提前了解一下相关情况;不过,对于另外一些版本,我们无法做到这一点。在所有情况下,当我们认为相应版本已足够稳定并且开发流程允许时,我们就会发布平台源代码。</p>
+<h3 id="what-is-involved-in-releasing-the-source-code-for-a-new-android-version">发布新版 Android 的源代码涉及哪些流程?</h3>
+<p>发布新版 Android 平台的源代码是一个非常重要的过程。首先,该软件要移植到设备的系统映像中,并通过各种形式的认证,包括手机销售区域的政府监管机构认证。另外,该软件还需要通过运营商测试。这是发布过程的一个重要阶段,因为这项测试有助于发现大量的软件错误。</p><p></p>
+<p>在发布事宜得到监管机构和运营商的批准后,制造商将开始大批量生产设备,并且我们将着手发布源代码。</p>
+<p>在制造商大批量生产设备的同时,Google 团队将开始为发布开放源代码做一些准备工作。这些准备工作包括进行最终的 API 更改、更新文档(例如,反映在合格性测试期间进行的任何修改)、为新版本准备 SDK,以及发布平台兼容性信息。</p>
+<p>此外,准备工作还包括一项最终法定签核程序,以同意将代码发布到开放源代码中。正如开放源代码贡献者需要签署《贡献者许可协议》来证明其拥有所贡献内容的知识产权一样,Google 也必须证明自己在做贡献。</p>
+<p>从制造商开始大批量生产设备算起,软件发布过程通常需要大约一个月的时间。这样一来,源代码的发布时间与设备到达用户手中的时间通常差不多。</p>
+<h3 id="how-does-the-aosp-relate-to-the-android-compatibility-program">AOSP 与 Android 兼容性计划有何关联?</h3>
+<p>Android 开放源代码项目旨在维护 Android 软件以及开发新版本。由于是开放源代码,因此该软件可用于任何用途,包括开发与基于同一源代码的其他设备不兼容的设备。</p>
+<p>Android 兼容性计划旨在为 Android 制定与开发者编写的第三方应用兼容的基准实施方式。“与 Android 兼容”的设备可以参与 Android 生态系统,包括 Google Play;不符合兼容性要求的设备将无法参与该生态系统。</p>
+<p>也就是说,Android 兼容性计划规定了我们如何区分“与 Android 兼容的设备”与只是运行 Android 源代码衍生品的设备。我们欢迎各种 Android 源代码使用方式,但只有与 Android 兼容的设备(符合 Android 兼容性计划的定义并通过该计划的测试)才可以参与 Android 生态系统。</p>
+<h3 id="how-can-i-contribute-to-android">如何为 Android 做贡献?</h3>
+<p>您可以通过多种方式为 Android 做贡献。您可以报告错误、编写适用于 Android 平台的应用,或者为 Android 开放源代码项目贡献源代码。</p>
+<p>关于我们愿意或能够接受哪些类型的代码贡献内容,有一些限制。例如,有人可能想要贡献替代应用 API,比如完全基于 C++- 的环境。我们会拒绝这种贡献内容,因为 Android 鼓励开发在 ART 运行时中运行的应用。同样,我们也不会接受与我们的许可目标不符的贡献内容(例如 GPL 或 LGPL 库)。</p>
+<p>如果您有意贡献源代码,我们建议您在开始任何相关工作前先通过 <a href="/source/community.html">Android 社区</a>页面中列出的方式与我们联系。您可以在<a href="/source/contributing.html">贡献</a>页面中找到关于此主题的更多信息。</p>
+<h3 id="how-do-i-become-an-android-committer">如何成为 Android 代码提交者?</h3>
+<p>Android 开放源代码项目其实并没有“提交者”这一概念。所有贡献内容(包括由 Google 员工创作的内容)都是通过一个称为“Gerrit”的基于网页的系统提交的,该系统是 Android 工程流程的一部分。该系统与 Git 源代码管理系统协同工作,以便明晰地管理源代码贡献内容。</p>
+<p>提交之后,相应更改需要获得指定审批者的批准。审批者通常是 Google 员工,但这些审批者还要负责所有提交内容,不论其来源为何。</p>
+<p>您可以在<a href="submit-patches.html">提交补丁程序</a>页面中找到关于此主题的更多信息。</p>
+<a href="#top">返回页首</a>
+<h2 id="compatibility">兼容性</h2>
+<h3 id="what-does-compatibility-mean">“兼容性”是什么意思?</h3>
+<p>我们将“与 Android 兼容的设备”定义为可以运行由第三方开发者使用 Android SDK 和 NDK 编写的任何应用的设备。我们将此作为过滤条件来区分可以参与和无法参与 Android 应用生态系统的设备。与 Android 妥善兼容的设备可以请求获准使用 Android 商标。不兼容的设备只不过是 Android 源代码的衍生产品,不能使用 Android 商标。</p>
+<p>也就是说,兼容性是参与 Android 应用生态系统的前提条件。我们欢迎任何人使用 Android 源代码。但如果设备与 Android 不兼容,则不会被视为 Android 生态系统的一部分。</p>
+<h3 id="what-is-the-role-of-google-play-in-compatibility">Google Play 在兼容性方面发挥什么作用?</h3>
+<p>与 Android 兼容的设备可以请求获得 Google Play 客户端软件使用许可。获得该许可后,这些设备便成为了 Android 应用生态系统的一部分,其用户将能够从所有与 Android 兼容的设备共享的目录中下载开发者的应用。与 Android 不兼容的设备无法获得该许可。</p>
+<h3 id="what-kinds-of-devices-can-be-android-compatible">哪些类型的设备可与 Android 兼容?</h3>
+<p>Android 软件可以移植到许多不同类型的设备上,包括第三方应用无法在其中正常运行的某些设备。<a href="/compatibility/index.html">Android 兼容性定义文档</a> (CDD) 中详细说明了将被视为与 Android 兼容的具体设备配置。</p>
+<p>例如,虽然可以将 Android 源代码移植到没有摄像头的手机上,但兼容性定义文档要求所有手机都要有摄像头。该要求使得开发者在编写应用时可以采用一系列一致的功能。</p>
+<p>兼容性定义文档将会不时进行修订,以反映市场实际情况。例如,1.6 版兼容性定义文档仅支持手机。但 2.1 版兼容性定义文档允许设备不包含电话硬件,这使得平板式音乐播放器等非手机设备也可以是兼容的设备。在修订兼容性定义文档的同时,我们还将改进 Google Play,以便开发者可以控制在哪些地区提供其应用。让我们继续以电话为例,某个用于管理短信的应用在媒体播放器上并没有什么用处,因此 Google Play 允许开发者将该应用限制为专用于手机设备。</p>
+<h3 id="if-my-device-is-compatible-does-it-automatically-have-access-to-google-play-and-branding">如果我的设备与 Android 兼容,它是否会自动获得 Google Play 和品牌标识的使用权限?</h3>
+<p>Google Play 是由 Google 运营的服务。实现兼容性是获得 Google Play 软件和品牌标识使用权限的前提条件。要获得 Google Play 使用权限,设备制造商应发送电子邮件至 <a href="mailto:android-partnerships@google.com">android-partnerships@google.com</a> 与我们联系。虽然我们会阅读发送到该地址的所有电子邮件,但我们无法一一进行回复。请注意,如果我们可以为您提供帮助,将会与您联系。</p>
+<h3 id="if-i-am-not-a-manufacturer-how-can-i-get-google-play">如果我不是制造商,如何获得 Google Play 使用权限?</h3>
+<p>我们只会向在设备中植入 Android 的手机制造商授予 Google Play 使用许可。如有关于具体情况方面的问题,请发送电子邮件至 <a href="mailto:android-partnerships@google.com">android-partnerships@google.com</a> 与我们联系。</p>
+<h3 id="how-can-i-get-access-to-the-google-apps-for-android-such-as-maps">如何获得 Android 版 Google 应用(例如 Google 地图)使用权限?</h3>
+<p>Android 版 Google 应用(例如 YouTube、Google 地图、Gmail 等)属于 Google 产品和服务,并不是 Android 的一部分,需要单独授予许可。如有关于这些应用方面的问题,请发送电子邮件至 <a href="mailto:android-partnerships@google.com">android-partnerships@google.com</a> 与我们联系。</p>
+<h3 id="is-compatibility-mandatory">兼容性是否为强制要求?</h3>
+<p>不是,您可以自行选择是否参与 Android 兼容性计划。由于 Android 源代码是开放源代码,因此任何人都可以使用它来打造任何类型的设备。不过,如果制造商希望在其产品中使用 Android 名称,或希望获得 Google Play 使用权限,则必须要先证明其设备与 Android 兼容。</p>
+<h3 id="how-much-does-compatibility-certification-cost">兼容性认证的费用是多少?</h3>
+<p>设备的 Android 兼容性认证无需任何费用。兼容性测试套件为开放源代码,可供任何人用于设备测试。</p>
+<h3 id="how-long-does-compatibility-take">兼容性认证需要多长时间?</h3>
+<p>该过程是自动进行的。兼容性测试套件会生成一份报告,您可以将该报告提供给 Google 来证明兼容性。我们终归打算提供一些用于将这些报告上传到公共数据库的自助服务工具。</p>
+<h3 id="who-determines-what-will-be-part-of-the-compatibility-definition">谁负责决定兼容性定义的内容?</h3>
+<p>由于 Google 负责把握 Android 作为平台和产品的总体发展方向,因此 Google 会为每个版本维护兼容性定义文档。在为 Android 新版本起草兼容性定义文档时,我们会咨询各种原始设备制造商 (OEM),他们将为该文档的内容提供建议。</p>
+<h3 id="how-long-will-each-android-version-be-supported-for-new-devices">各 Android 版本可用于开发新设备的时间有多长?</h3>
+<p>由于 Android 的代码为开放源代码,因此我们无法阻止任何人使用旧版本来推出设备。不过,Google 将不会授予在被视为已过时的版本上使用 Google Play 客户端软件的许可。这样一来,虽然任何人都可以继续植入旧版 Android,但这些设备将不能使用 Android 名称,并且无法参与 Android 应用生态系统,这同设备与 Android 不兼容的情况类似。</p>
+<h3 id="can-a-device-have-a-different-user-interface-and-still-be-compatible">设备是否可以采用不同的界面但仍保持与 Android 兼容?</h3>
+<p>Android 兼容性计划旨在决定某种设备是否可以运行第三方应用。设备附带的界面组件(例如主屏幕、拨号器、配色方案等)一般对第三方应用的影响不大。因此,设备制造商可以根据自己的喜好随意定制界面。兼容性定义文档确实规定了原始设备制造商 (OEM) 可在多大程度内更改系统界面中会影响第三方应用的区域。</p>
+<h3 id="when-are-compatibility-definitions-released-for-new-android-versions">何时发布 Android 新版本的兼容性定义?</h3>
+<p>我们的目标是,一旦相应的 Android 平台版本已涵盖足够多的内容,允许发布新版 Android 兼容性定义文档,我们就会进行发布。虽然我们无法在植入相应 Android 软件的首款旗舰设备之前发布该软件版本的兼容性定义文档终稿,但我们一定会在这一首款设备之后发布兼容性定义文档终稿。不过,无论实际情况如何,我们都将提供兼容性定义文档的草稿版本。</p>
+<h3 id="how-are-device-manufacturers-compatibility-claims-validated">如何验证设备制造商的兼容性声明?</h3>
+<p>我们并没有针对 Android 设备兼容性的验证流程。不过,如果相应设备要添加 Google Play,Google 通常会先验证设备的兼容性,设备通过验证后,才会同意为其授予 Google Play 客户端软件使用许可。</p>
+<h3 id="what-happens-if-a-device-that-claims-compatibility-is-later-found-to-have-compatibility-problems">如果之后发现声称兼容的设备存在兼容性问题,会怎样?</h3>
+<p>通常情况下,Google 与 Google Play 被许可人之间保持着良好的关系,这使得我们可以要求他们发布更新后解决了相关问题的系统映像。</p>
+<a href="#top">返回页首</a>
+<h2 id="compatibility-test-suite">兼容性测试套件</h2>
+<h3 id="what-is-the-purpose-of-the-cts">兼容性测试套件的用途是什么?</h3>
+<p>兼容性测试套件是一种工具,设备制造商可以借助该工具来确保其设备与 Android 兼容,以及报告测试结果供 Google 验证。原始设备制造商 (OEM) 应在整个工程流程中频繁运行兼容性测试套件,以便尽早发现兼容性问题。</p>
+<h3 id="what-kinds-of-things-does-the-cts-test">兼容性测试套件会测试哪些类型的内容?</h3>
+<p>目前,兼容性测试套件会测试所有受支持的 Android 强类型 API 是否存在以及行为是否正常。此外,它还会测试其他非 API 系统行为,例如应用生命周期和性能。我们计划在未来的兼容性测试套件版本中扩大支持范围,以便同时测试 Intent 等“软”API。</p>
+<h3 id="will-the-cts-reports-be-made-public">兼容性测试套件报告会公开吗?</h3>
+<p>会。虽然目前尚未实施,但 Google 打算为原始设备制造商 (OEM) 提供基于网络的自助服务工具来发布兼容性测试套件报告,以供任何人查看。制造商可在任意范围内分享兼容性测试套件报告。</p>
+<h3 id="how-is-the-cts-licensed">兼容性测试套件采用哪种许可方式?</h3>
+<p>兼容性测试套件是根据大多数 Android 使用的 Apache Software License 2.0 授权用户使用。</p>
+<h3 id="does-the-cts-accept-contributions">兼容性测试套件接受贡献内容吗?</h3>
+<p>接受,而且非常欢迎!Android 开放源代码项目接受贡献内容,以便采用与任何其他组件相同的方式来改进兼容性测试套件。事实上,提高兼容性测试套件测试案例的覆盖范围和质量是协助 Android 的最佳方式之一。</p>
+<h3 id="can-anyone-use-the-cts-on-existing-devices">任何人都可以在现有设备上使用兼容性测试套件吗?</h3>
+<p>兼容性定义文档要求与 Android 兼容的设备实施“adb”调试实用工具。这意味着,任何与 Android 兼容的设备(包括零售的设备)都必须能够运行兼容性测试套件测试。</p>
+<h3 id="are-codecs-verified">编解码器需要通过兼容性测试套件验证吗?</h3>
+<p>需要。所有必需的编解码器都要通过兼容性测试套件验证。</p>
+
+<a href="#top">返回页首</a>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/git-resources.html b/zh-cn/source/git-resources.html
new file mode 100644
index 00000000..c69a5ca2
--- /dev/null
+++ b/zh-cn/source/git-resources.html
@@ -0,0 +1,42 @@
+<html devsite><head>
+ <title>了解 Git</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>如需关于 Git 的更多信息,请参阅以下非常实用的站外资源:</p>
+<ul>
+<li>
+<p><a href="https://training.github.com/">GitHub 培训</a></p>
+</li>
+<li>
+<p><a href="http://book.git-scm.com">Git Community Book</a>(由 Scott Chacon 维护)</p>
+</li>
+<li>
+<p><a href="http://git.or.cz/gitwiki/FrontPage">Git Wiki</a></p>
+</li>
+<li>
+<p><a href="http://www.kernel.org/pub/software/scm/git/docs">Git 手册页面</a> </p>
+</li>
+<li>
+<p><a href="https://www.youtube.com/playlist?list=PLttwD7NyH3omQLyVtan0CFOX_UWItX_yG">GitCasts</a>(Git 教程视频)</p>
+</li>
+</ul>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/index.html b/zh-cn/source/index.html
new file mode 100644
index 00000000..1c95cd12
--- /dev/null
+++ b/zh-cn/source/index.html
@@ -0,0 +1,44 @@
+<html devsite><head>
+ <title>Android 源代码</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>Android 是一个针对多种不同设备类型打造的开放源代码软件堆栈。Android 的主要目的是为运营商、原始设备制造商 (OEM) 和开发者创造一个开放的软件平台,使他们能够将创新理念变为现实,并推出能够卓有成效地改善用户移动体验的真实产品。
+</p>
+
+<p>此外,我们还希望确保 Android 平台不存在一个集中瓶颈(意即没有任何行业参与者可一手限制或控制其他参与者的创新)。这样,我们不但可以打造功能完善的高品质消费类产品,而且可以完全开放源代码,供第三方自由定制和移植。
+</p>
+
+<div style="width:700px">
+ <img src="/images/android_framework_details.png" alt="Android 框架详情" height="483px"/>
+ <p class="img-caption">
+ <strong>图 1.</strong> Android 堆栈</p>
+</div>
+
+<h2 id="governance-philosophy">管理理念</h2>
+<p>Android 源自于 Google 牵头并联合众多企业成立的“开放手机联盟”(Open Handset Alliance,以下简称 OHA)。如今,许多企业(包括 OHA 的创始成员以及其他企业)都在 Android 上投入了大量资金和人力。这些企业投入了大量工程资源来改进 Android,使用户能够享用搭载 Android 的出色设备。
+</p>
+<p>出于对 Android 本身的认同,这些企业才投入了资金和人力,因为我们都相信有必要打造一个开放的平台。我们的用意是将 Android 打造成一个开放源代码(而非免费软件)平台,显然,Android 也确实做到了这一点;众多志同道合的组织投入了大量的资源,携手打造了一个共用的平台。Android 的首要理念是务实。目标是打造一个每个贡献者都可以调整和定制的共用产品。</p>
+
+<p>不受约束的定制必然会导致不兼容。为了避免这种情况,Android 开放源代码项目还推出了 <a href="/compatibility/index.html">Android 兼容性计划</a>,该计划制定了有关“Android 兼容性”的规范以及设备制造商实现兼容性需要满足的要求。任何人都能够(并且会)将 Android 源代码用于任何用途,我们欢迎一切合法的使用。不过,要参与我们正在围绕 Android 构建的共通应用生态系统,设备制造商必须加入 Android 兼容性计划。</p>
+
+<p>作为 Android 开放源代码项目的主导者,Google 负责着 Android 的维护和后续开发工作。虽然 Android 由多个子项目组成,但严格意义上,这只是出于项目管理的需要。我们将 Android 整体视为一个软件产品(而不是可更换部件的“发行版”、规范或集合),并依此原则进行管理。我们希望设备制造商要做的只是将 Android 移植到其设备上,而无需实现一个规范或构建一个“发行版”。</p>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/initializing.html b/zh-cn/source/initializing.html
new file mode 100644
index 00000000..93f615ef
--- /dev/null
+++ b/zh-cn/source/initializing.html
@@ -0,0 +1,364 @@
+<html devsite><head>
+ <title>搭建编译环境</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>本部分介绍了如何设置本地工作环境来编译 Android 源文件。您需要使用 Linux 或 Mac OS。目前不支持在 Windows 环境下进行编译。</p>
+<p>要简要了解代码审核和代码更新的整个过程,请参阅<a href="life-of-a-patch.html">补丁程序的生命周期</a>。</p>
+<h2 id="choosing-a-branch">选择分支</h2>
+<p>针对编译环境的某些要求是由您打算编译的源代码的版本决定的。要查看您可以选择的分支的完整列表,请参阅<a href="build-numbers.html">版本号</a>。您还可以选择下载并编译最新的源代码(称为 <code>master</code>)。如果您选择这么做,请在初始化存储库时直接忽略分支规范。</p>
+<p>选择分支后,请按照下面的相应说明来设置编译环境。</p>
+<h2 id="setting-up-a-linux-build-environment">设置 Linux 编译环境</h2>
+<p>以下说明适用于所有分支(包括 <code>master</code>)。</p>
+<p>我们会定期在最近推出的一些 Ubuntu LTS (14.04) 版本中对 Android 编译过程进行内部测试,但大多数 Ubuntu 分发版本都应该有所需的编译工具。欢迎向我们报告在其他分发版本中的测试结果(无论结果是成功还是失败)。</p>
+<p>如果是 Gingerbread (2.3.x) 及更高版本(包括 <code>master</code> 分支),需要使用 64 位环境。如果是较低的版本,则可以在 32 位系统中进行编译。</p>
+<p class="note"><strong>注意</strong>:要查看完整的硬件和软件要求列表,请参阅相关<a href="requirements.html">要求</a>。然后,请按照下方适用于 Ubuntu 和 Mac OS 的详细说明进行操作。</p>
+
+<h3 id="installing-the-jdk">安装 JDK</h3>
+<p><a href="https://android.googlesource.com/">Android 开放源代码项目 (AOSP)</a> 中 Android 的 <code>master</code> 分支需要使用 Java 8。在 Ubuntu 中则需要使用 <a href="http://openjdk.java.net/install/">OpenJDK</a>。</p>
+<p>对于较低的版本,请参阅 <a href="requirements.html#jdk">JDK 要求</a>。</p>
+
+<h4 id="for-ubuntu-15-04">如果 Ubuntu &gt;= 15.04</h4>
+<p>请运行以下命令:</p>
+<pre>
+$ sudo apt-get update
+$ sudo apt-get install openjdk-8-jdk
+</pre>
+
+<h4 id="for-ubuntu-14-04">如果是 Ubuntu LTS 14.04</h4>
+<p>目前没有适用于 Ubuntu 14.04 的受支持 OpenJDK 8 程序包。<strong>Ubuntu 15.04 OpenJDK 8</strong> 程序包能够在 Ubuntu 14.04 中成功使用。<em>我们发现,按照以下说明操作时,更高的程序包版本(例如适合 15.10、16.04 的版本)在 Ubuntu 14.04 中无法正常工作。</em></p>
+<ol>
+<li>
+<p>从 <a href="http://archive.ubuntu.com/ubuntu/pool/universe/o/openjdk-8/">archive.ubuntu.com</a> 下载适合 64 位架构的 <code>.deb</code> 程序包:</p>
+<ul>
+<li><a href="http://archive.ubuntu.com/ubuntu/pool/universe/o/openjdk-8/openjdk-8-jre-headless_8u45-b14-1_amd64.deb">openjdk-8-jre-headless_8u45-b14-1_amd64.deb</a>
+(SHA256:<code>0f5aba8db39088283b51e00054813063173a4d8809f70033976f83e214ab56c0</code>)</li>
+<li><a href="http://archive.ubuntu.com/ubuntu/pool/universe/o/openjdk-8/openjdk-8-jre_8u45-b14-1_amd64.deb">openjdk-8-jre_8u45-b14-1_amd64.deb</a>
+(SHA256:<code>9ef76c4562d39432b69baf6c18f199707c5c56a5b4566847df908b7d74e15849</code>)</li>
+<li><a href="http://archive.ubuntu.com/ubuntu/pool/universe/o/openjdk-8/openjdk-8-jdk_8u45-b14-1_amd64.deb">openjdk-8-jdk_8u45-b14-1_amd64.deb</a>
+(SHA256:<code>6e47215cf6205aa829e6a0a64985075bd29d1f428a4006a80c9db371c2fc3c4c</code>)</li>
+</ul>
+</li>
+<li>
+<p>(可选)对照随以上每个程序包列出的 SHA256 字符串,确认已下载文件的校验和。</p>
+<p>例如,使用 <code>sha256sum</code> 工具:</p>
+<pre>
+$ sha256sum {downloaded.deb file}
+</pre>
+</li>
+<li>
+<p>安装程序包:</p>
+<pre>
+$ sudo apt-get update
+</pre>
+<p>为下载的每个 .deb 文件运行 <code>dpkg</code>。运行过程中可能会因缺少依赖项而出现错误:</p>
+<pre>
+$ sudo dpkg -i {downloaded.deb file}
+</pre>
+<p>解决缺少依赖项的问题:</p>
+<pre>
+$ sudo apt-get -f install
+</pre>
+</li>
+</ol>
+
+<h4 id="default-java-version">更新默认的 Java 版本 - 可选</h4>
+
+<p>(可选)对于以上 Ubuntu 版本,您可以通过运行以下命令来更新默认的 Java 版本:</p>
+<pre>
+$ sudo update-alternatives --config java
+$ sudo update-alternatives --config javac
+</pre>
+
+<p>在编译过程中,如果您遇到 Java 版本错误,请按照<a href="building.html#wrong-java-version">错误的 Java 版本</a>部分中的说明设置其路径。</p>
+
+<h3 id="installing-required-packages-ubuntu-1404">安装所需的程序包 (Ubuntu 14.04)</h3>
+
+<p>您将需要 64 位版本的 Ubuntu。建议您使用 Ubuntu 14.04。</p>
+
+<pre>
+$ sudo apt-get install git-core gnupg flex bison gperf build-essential \
+ zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \
+ lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache \
+ libgl1-mesa-dev libxml2-utils xsltproc unzip
+</pre>
+
+<p class="note"><strong>注意</strong>:要使用 SELinux 工具进行政策分析,您还需要安装 <code>python-networkx</code> 程序包。</p>
+
+<p class="note"><strong>注意</strong>:如果您使用 LDAP 并且希望运行 ART 主机测试,则还需要安装 <code>libnss-sss:i386</code> 程序包。</p>
+
+<h3 id="installing-required-packages-ubuntu-1204">安装所需的程序包 (Ubuntu 12.04)</h3>
+
+<p>您可以使用 Ubuntu 12.04 来编译较低版本的 Android。master 或最近推出的一些版本不支持 Ubuntu 12.04。</p>
+
+<pre>
+$ sudo apt-get install git gnupg flex bison gperf build-essential \
+ zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \
+ libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \
+ libgl1-mesa-dev g++-multilib mingw32 tofrodos \
+ python-markdown libxml2-utils xsltproc zlib1g-dev:i386
+$ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
+</pre>
+
+<h3 id="installing-required-packages-ubuntu-1004-1110">安装所需的程序包 (Ubuntu 10.04 - 11.10)</h3>
+<p>不再支持在 Ubuntu 10.04-11.10 中进行编译,但它们仍可用来编译较低版本的 AOSP。</p>
+
+<pre>
+$ sudo apt-get install git gnupg flex bison gperf build-essential \
+ zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \
+ x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev \
+ libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown \
+ libxml2-utils xsltproc
+</pre>
+
+<p>在 Ubuntu 10.10 中,请运行以下命令:</p>
+
+<pre>
+$ sudo ln -s /usr/lib32/mesa/libGL.so.1 /usr/lib32/mesa/libGL.so
+</pre>
+
+<p>在 Ubuntu 11.10 中,请运行以下命令:</p>
+
+<pre>
+$ sudo apt-get install libx11-dev:i386
+</pre>
+
+<h3 id="configuring-usb-access">配置 USB 使用权限</h3>
+
+<p>在 GNU/Linux 系统中,尤其是在 Ubuntu 系统中,默认情况下普通用户无法直接使用 USB 设备。您需要对系统进行配置以允许使用此类设备。</p>
+<p>建议您以 root 用户的身份在 <code>/etc/udev/rules.d/51-android.rules</code> 下创建一个文件。</p>
+
+<p>为此,请运行以下命令来下载本网站附带的 <a href="51-android.txt">51-android.txt</a> 文件,对其进行修改以包含您的用户名,然后将其放到正确位置:</p>
+
+<pre>
+$ wget -S -O - http://source.android.com/source/51-android.txt | sed "s/&lt;username&gt;/$USER/" | sudo tee &gt;/dev/null /etc/udev/rules.d/51-android.rules; sudo udevadm control --reload-rules
+</pre>
+
+<p>这些新规则会在下次插入设备时生效。因此,您可能需要先拔下设备,然后再将其插到计算机上。</p>
+
+<h3 id="using-a-separate-output-directory">使用单独的输出目录</h3>
+
+<p>默认情况下,每次编译的输出都会存储在相应源代码树的 <code>out/</code> 子目录下。</p>
+
+<p>在一些拥有多个存储设备的计算机上,如果将源文件和输出存储在单独的存储卷中,编译速度会更快。若要进一步提高编译速度,可以将输出存储在已针对速度(而非崩溃稳定性)进行优化的文件系统中,这是因为在文件系统损坏时可以重新生成所有文件。</p>
+
+<p>要进行这项设置,请导出 <code>OUT_DIR_COMMON_BASE</code> 变量,使其指向将存储输出目录的位置。</p>
+
+<pre>
+$ export OUT_DIR_COMMON_BASE=&lt;path-to-your-out-directory&gt;
+</pre>
+
+<p>对于每个单独的源代码树,其输出目录都将以其存放目录命名。</p>
+
+<p>例如,如果您有源代码树 <code>/source/master1</code> 和 <code>/source/master2</code>,并且 <code>OUT_DIR_COMMON_BASE</code> 设为了 <code>/output</code>,那么输出目录将为 <code>/output/master1</code> 和 <code>/output/master2</code>。</p>
+
+<p>在这种情况下,切勿将多个源代码树存储在具有相同名称的目录下,否则会导致输出目录共享终止,并且会出现不可预知的结果。</p>
+
+<p>只有 Jelly Bean (4.1) 及更高版本(包括 <code>master</code> 分支)支持这种做法。</p>
+
+<h2 id="setting-up-a-mac-os-x-build-environment">设置 Mac OS 编译环境</h2>
+
+<p>在默认安装过程中,Mac OS 会在一个保留大小写但不区分大小写的文件系统中运行。Git 并不支持此类文件系统,而且此类文件系统会导致某些 Git 命令(例如 <code>git status</code>)的行为出现异常。因此,我们建议您始终在区分大小写的文件系统中对 AOSP 源文件进行操作。使用下文中介绍的磁盘映像可以非常轻松地做到这一点。</p>
+
+<p>有了适当的文件系统,在新型 Mac OS 环境中编译 <code>master</code> 分支就会变得非常简单。要编译较低版本的分支,则需要一些额外的工具和 SDK。</p>
+
+<h3 id="creating-a-case-sensitive-disk-image">创建区分大小写的磁盘映像</h3>
+
+<p>您可以使用磁盘映像在现有的 Mac OS 环境中创建区分大小写的文件系统。要创建磁盘映像,请启动磁盘工具,然后选择“新建映像”。完成编译至少需要 25GB 空间;更大的空间能够更好地满足未来的需求。使用稀疏映像有助于节省空间,而且以后可以随着需求的增加进行扩展。请务必选择“Case sensitive, Journaled”存储卷格式。</p>
+
+<p>您也可以通过 shell 使用以下命令创建磁盘映像:</p>
+<pre>
+# hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 40g ~/android.dmg
+</pre>
+
+<p>这将创建一个 <code>.dmg</code>(也可能是 <code>.dmg.sparseimage</code>)文件,该文件在装载后可用作具有 Android 开发所需格式的存储卷。</p>
+
+<p>如果您以后需要更大的存储卷,还可以使用以下命令来调整稀疏映像的大小:</p>
+
+<pre>
+# hdiutil resize -size &lt;new-size-you-want&gt;g ~/android.dmg.sparseimage
+</pre>
+
+<p>对于存储在主目录下的名为 <code>android.dmg</code> 的磁盘映像,您可以向 <code>~/.bash_profile</code> 中添加辅助函数:</p>
+
+<ul>
+<li>要在执行 <code>mountAndroid</code> 时装载磁盘映像,请运行以下命令:<p></p>
+
+<pre>
+# mount the android file image
+function mountAndroid { hdiutil attach ~/android.dmg -mountpoint /Volumes/android; }
+</pre>
+
+<p class="note"><strong>注意</strong>:如果系统创建的是 <code>.dmg.sparseimage</code> 文件,请将 <code>~/android.dmg</code> 替换成 <code>~/android.dmg.sparseimage</code>。</p>
+</li>
+
+<li>
+<p>要在执行 <code>umountAndroid</code> 时卸载磁盘映像,请运行以下命令:</p>
+<pre>
+# unmount the android file image
+function umountAndroid() { hdiutil detach /Volumes/android; }
+</pre>
+</li>
+</ul>
+
+<p>装载 <code>android</code> 存储卷后,您将在其中开展所有工作。您可以像对待外接式存储盘一样将其弹出(卸载)。</p>
+
+<h3 id="installing-the-mac-jdk">安装 JDK</h3>
+
+<p>要查看在开发各种 Android 版本时要使用的 Java 版本,请参阅相关<a href="requirements.html">要求</a>。</p>
+
+<h4 id="installing-required-packages">安装所需的程序包</h4>
+
+<ol>
+<li>
+<p>使用以下命令安装 Xcode 命令行工具:</p><pre>
+$ xcode-select --install
+</pre>
+
+<p>对于较低版本的 Mac OS(10.8 或更低版本),您需要通过 <a href="http://developer.apple.com/">Apple 开发者网站</a>安装 Xcode。如果您尚未注册成为 Apple 开发者,则需要创建一个 Apple ID 才能下载。</p>
+</li>
+
+<li>
+<p>通过 <a href="http://www.macports.org/install.php">macports.org</a> 安装 MacPorts。</p>
+
+<p class="note"><strong>注意</strong>:请确保在路径中 <code>/opt/local/bin</code> 显示在 <code>/usr/bin</code> <strong>之前</strong>。否则,请将以下内容添加到 <code>~/.bash_profile</code> 文件中:</p>
+
+<pre>
+<code>export PATH=/opt/local/bin:$PATH</code>
+</pre>
+
+<p class="note"><strong>注意</strong>:如果主目录中没有 <code>.bash_profile</code> 文件,请创建一个。</p>
+</li>
+
+<li>
+<p>通过 MacPorts 获取 Make、Git 和 GPG 程序包:</p>
+
+<pre>
+$ POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg
+</pre>
+
+<p>如果您使用 Mac OS X v10.4,还需要安装 bison:</p>
+<pre>
+$ POSIXLY_CORRECT=1 sudo port install bison
+</pre>
+</li>
+</ol>
+
+<h4 id="reverting-from-make-382">将 make 3.82 还原到较低版本</h4>
+
+<p>在 Android 4.0.x (Ice Cream Sandwich) 及更低版本中,gmake 3.82 中存在一个会导致 Android 无法编译的错误。您可以按照以下步骤使用 MacPorts 来安装 3.81 版:</p>
+
+<ol>
+<li>
+<p>修改 <code>/opt/local/etc/macports/sources.conf</code>,在 rsync 行上方添加下面这行内容:</p>
+<pre>
+file:///Users/Shared/dports
+</pre>
+
+<p>然后创建该目录:</p>
+<pre>
+$ mkdir /Users/Shared/dports
+</pre>
+</li>
+
+<li>
+<p>在新的 <code>dports</code> 目录下,运行以下命令:</p>
+<pre>
+$ svn co --revision 50980 http://svn.macports.org/repository/macports/trunk/dports/devel/gmake/ devel/gmake/
+</pre>
+</li>
+
+<li>
+<p>为新的本地存储库创建一个端口索引:</p>
+
+<pre>
+$ portindex /Users/Shared/dports
+</pre>
+</li>
+
+<li>
+<p>使用以下命令安装旧版 gmake:</p>
+<pre>
+$ sudo port install gmake @3.81
+</pre>
+</li>
+</ol>
+
+<h4 id="setting-a-file-descriptor-limit">设置文件描述符数量上限</h4>
+
+<p>在 Mac OS 中,可同时打开的文件描述符的默认数量上限太低,在高度并行的编译流程中,可能会超出此上限。</p>
+
+<p>要提高此上限,请将下列行添加到 <code>~/.bash_profile</code> 中:</p>
+<pre>
+# set the number of open files to be 1024
+ulimit -S -n 1024
+</pre>
+
+<h2 id="optimizing-a-build-environment">优化编译环境(可选)</h2>
+
+<h3 id="setting-up-ccache">设置 ccache</h3>
+
+<p>您可以视需要指示编译过程使用 ccache 编译工具,ccache 是适用于 C 和 C++ 的编译器缓存,有助于提高编译速度。这对于编译服务器和其他高容量生产环境来说尤其有用。ccache 可用作用于加快重新编译速度的编译器缓存。如果您经常使用 <code>make clean</code>,或者经常在不同的编译产品之间切换,则非常适合使用 ccache。</p>
+
+<p class="note"><strong>注意</strong>:如果您是在执行增量编译(例如个人开发者而非编译服务器),ccache 可能会让您为缓存未命中埋单,从而减慢您的编译速度。</p>
+
+<p>要使用 ccache,请在源代码树的根目录下执行以下命令:</p>
+
+<pre>
+$ export USE_CCACHE=1
+$ export CCACHE_DIR=/&lt;path_of_your_choice&gt;/.ccache
+$ prebuilts/misc/linux-x86/ccache/ccache -M 50G
+</pre>
+
+<p>建议的缓存大小为 50G 到 100G。</p>
+
+<p>请将以下内容添加到 <code>.bashrc</code>(或等同文件)中:</p>
+
+<pre>
+export USE_CCACHE=1
+</pre>
+
+<p>默认情况下,缓存将存储在 <code>~/.ccache</code> 下。如果主目录位于 NFS 或一些其他的非本地文件系统中,您还需要在 <code>.bashrc</code> 文件中指定目录。</p>
+
+<p>在 Mac OS 中,您应将 <code>linux-x86</code> 替换成 <code>darwin-x86</code>:</p>
+
+<pre>
+prebuilts/misc/darwin-x86/ccache/ccache -M 50G
+</pre>
+
+<p>在编译 Ice Cream Sandwich (4.0.x) 或更低版本时,ccache 位于其他位置:</p>
+
+<pre>
+prebuilt/linux-x86/ccache/ccache -M 50G
+</pre>
+
+<p>该设置会存储在 CCACHE_DIR 中,并且为永久设置。</p>
+
+<p>在 Linux 中,您可以运行以下命令来观看使用 ccache 时的情况:</p>
+
+<pre>
+$ watch -n1 -d prebuilts/misc/linux-x86/ccache/ccache -s
+</pre>
+
+<h2 id="next-download-the-source">下一篇:下载源代码</h2>
+
+<p>编译环境已准备就绪!接下来您就可以<a href="downloading.html">下载源代码</a>了。</p>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/jack.html b/zh-cn/source/jack.html
new file mode 100644
index 00000000..261efadf
--- /dev/null
+++ b/zh-cn/source/jack.html
@@ -0,0 +1,303 @@
+<html devsite><head>
+ <title>使用 Jack 编译</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<h2 id="the_jack_toolchain">Jack 工具链</h2>
+
+<p class="warning">
+ 根据<a href="https://android-developers.googleblog.com/2017/03/future-of-java-8-language-feature.html">此公告</a>,<b>Jack 工具链已被弃用</b>。不过,在我们提供替代工具之前,您可以继续使用它<a href="https://developer.android.com/preview/j8-jack.html">启用 Java 8 语言功能</a>。
+</p>
+
+<p>Jack 是一种新型 Android 工具链,用于将 Java 源代码编译成 Android dex 字节码。它取代了之前由 javac、ProGuard、jarjar 和 dx 等多种工具组成的 Android 工具链。</p>
+
+<p>Jack 工具链具有以下优势:</p>
+
+<ul>
+ <li> <strong>完全开放源代码</strong><br />
+它是在 AOSP 中提供的;并且欢迎用户贡献资源。
+ </li><li> <strong>提高编译速度</strong><br />
+
+Jack 提供以下具体支持来减少编译时间:dex 预处理、增量编译和 Jack 编译服务器。
+ </li><li> <strong>支持压缩、混淆、重新打包和多 dex 处理</strong><br />
+不再需要使用单独的软件包(如 ProGuard)
+</li></ul>
+
+<p class="note">请注意,从 Android 7.0 (N) 开始,Jack 支持使用 JaCoCo 衡量代码覆盖率。如需了解详情,请参阅<a href="https://android.googlesource.com/platform/prebuilts/sdk/+/master/tools/README-jack-code-coverage.md">使用 JaCoCo 衡量代码覆盖率</a>和 <a href="https://developer.android.com/preview/j8-jack.html">Java 8 语言功能</a>。</p>
+
+<img src="/images/jack-overview.png" height="75%" width="75%" alt="Jack 概览"/>
+<p class="img-caption"><strong>图 1. </strong>Jack 概览</p>
+
+<h2 id="the_jack_library_format">.jack 库格式</h2>
+
+<p>Jack 具有自己的 .jack 文件格式,其中包含相应库的预编译 dex 代码,可实现更快速的编译 (dex 预处理)。</p>
+
+<img src="/images/jack-library-file.png" height="75%" width="75%" alt="Jack 库文件内容"/>
+<p class="img-caption"><strong>图 2. </strong>Jack 库文件内容</p>
+
+<h2 id="jill">Jill</h2>
+
+<p>Jill 工具可将现有的 .jar 库转换为新的库格式,如下图所示。</p>
+
+<img src="/images/jill.png" alt="使用 Jill 导入现有的 .jar 库"/>
+<p class="img-caption"><strong>图 3. </strong>导入现有 .jar 库的工作流程</p>
+
+<h2 id="using_jack_in_your_android_build">使用 Jack 进行 Android 编译</h2>
+
+<div class="note">如需了解在 Android 7.0 (N) 及更高版本中使用 Jack 的说明,请参阅 <a href="https://android.googlesource.com/platform/prebuilts/sdk/+/master/tools/README-jack-server.md">Jack 服务器文档</a>。对于 Android 6.0 (M),请使用本部分中的说明。</div>
+
+<p>要使用 Jack,您只需使用标准的 Makefile 命令来编译树或您的项目即可,无需进行任何其他操作。Jack 是适合 M 的默认 Android 编译工具链。</p>
+
+<p>首次使用 Jack 时,它会在您的计算机上启动一个本地 Jack 编译服务器:</p>
+
+<ul>
+ <li>该服务器能够让 Jack 实现内在加速,因为它可以避免在每次编译时启动新的主机 JRE JVM、加载 Jack 代码、初始化 Jack 以及准备 JIT。此外,它还会在小规模编译期间(例如增量模式下)尽可能优化编译所需时间。
+ </li><li>该服务器还是在短时间内控制并行 Jack 编译数量的解决方案,因此可以避免计算机过载(内存或磁盘问题),因为它会限制并行编译的数量。
+</li></ul>
+
+<p>如果没有任何编译工作,在空闲一段时间之后,Jack 服务器会自行关闭。它使用了 localhost 接口上的两个 TCP 端口,因此无法从外部访问。您可以通过修改<code> $HOME/.jack</code> 文件来修改所有这些参数(并行编译的数量、超时、端口号等)。</p>
+
+<h3 id="$home_jack_file">$HOME/.jack 文件</h3>
+
+<p><code>$HOME/.jack</code> 文件包含 Jack 服务器变量的设置,采用纯 bash 语法编写。</p>
+
+<p>以下是可用设置及其定义和默认值:</p>
+
+<ul>
+ <li> <strong><code>SERVER=true</code></strong><code> </code>:启用 Jack 的服务器功能。
+ </li><li> <strong><code>SERVER_PORT_SERVICE=8072</code>
+</strong>设置服务器的用于编译的 TCP 端口号。
+ </li><li> <strong><code>SERVER_PORT_ADMIN=8073</code></strong>:
+设置服务器的用于管理的 TCP 端口号。
+ </li><li> <strong><code>SERVER_COUNT=1</code></strong>:
+目前未使用。
+ </li><li> <strong><code>SERVER_NB_COMPILE=4</code></strong>:
+允许的最大并行编译数量。
+ </li><li> <strong><code>SERVER_TIMEOUT=60</code></strong>:
+无编译工作时服务器在自行关闭之前必须等待的空闲秒数。
+ </li><li> <strong><code>SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log}</code></strong>:
+在其中写入服务器日志的文件。默认情况下,此变量可被环境变量重载。
+ </li><li> <strong><code>JACK_VM_COMMAND=${JACK_VM_COMMAND:=java}</code></strong>:
+用于在主机上启动 JVM 的默认命令。默认情况下,此变量可被环境变量重载。
+</li></ul>
+
+<h3 id="jack_troubleshooting">Jack 问题排查</h3>
+
+<p><strong>如果您的计算机在编译期间无响应,或者如果 Jack 编译因“Out of memory error”(内存不足错误)而失败</strong></p>
+
+<p>您可以通过修改<code> $HOME/.jack</code> 并将<code> SERVER_NB_COMPILE</code> 改为较低的值来减少同时进行的 Jack 编译的数量,以针对所遇到的问题予以改善。</p>
+
+<p><strong>如果您的编译因“Cannot launch background server”(无法启动后台服务器)而失败</strong></p>
+
+<p>最可能的原因是您的计算机上的 TCP 端口都被占用了。请尝试通过修改 <code>$HOME/.jack </code>(<code>SERVER_PORT_SERVICE</code> 和 <code>SERVER_PORT_ADMIN</code> 变量)进行更改。</p>
+
+<p>如果问题没有解决,请报告此问题并附上您的编译日志和 Jack 服务器日志(请参阅下文中的“查找 Jack 日志”,了解从何处找到服务器日志文件)。要解决这种情况,请通过修改 <code>$HOME/.jack</code> 并将 <code>SERVER</code> 更改为 false 来停用 jack 编译服务器。遗憾的是,这将大大减慢您的编译速度,并可能强制您使用加载控制(<code>make</code> 的选项“<code>-l</code>”)启动 <code>make -j</code>。</p>
+
+<p><strong>如果您的编译卡住了,没有任何进展</strong></p>
+
+<p>请报告此问题,并向我们提供以下附加信息(如果可能的话):</p>
+
+<ul>
+ <li>卡住时所在的命令行。
+ </li><li>此命令行的输出。
+ </li><li>运行 <code>jack-admin server-stat</code> 的结果。
+ </li><li><code>$HOME/.jack</code> 文件。
+ </li><li>服务器日志(已转储服务器状态)的内容。要获取日志内容,请执行以下操作:<ul>
+ <li>通过运行 <code>jack-admin list-server</code> 查找 Jack 后台服务器进程。
+ </li><li>向此服务器发送 <code>kill -3</code> 命令,将其状态转储到日志文件中。
+ </li><li>要找到该服务器日志文件,请参阅下文中的“查找 Jack 日志”。
+ </li></ul>
+ </li><li>运行 <code>ls -lR $TMPDIR/jack-$USER.</code> 的结果。
+ </li><li>运行 <code>ps j -U $USER.</code> 的结果。
+</li></ul>
+
+<p>您应该能够通过停止 Jack 后台服务器(使用 <code>jack-admin kill-server</code>),然后移除临时目录(<code>/tmp</code> 或 <code>$TMPDIR</code>)的 <code>jack-$USER</code> 中包含的临时目录来解决卡住的情况。</p>
+
+<p><strong>如果您有任何其他问题</strong></p>
+
+<p>要报告错误或请求功能,请使用我们的公开问题跟踪工具(位于 <a href="http://b.android.com">http://b.android.com</a> 上),以及 <a href="https://code.google.com/p/android/issues/entry?template=Jack%20bug%20report">Jack 工具错误报告</a>或 <a href="https://code.google.com/p/android/issues/entry?template=Jack%20feature%20request">Jack 工具功能请求</a>模板。请在错误报告中附上 Jack 日志。</p>
+<table>
+ <tbody><tr>
+ <td><strong>查找 Jack 日志</strong>
+<ul>
+ <li>如果您曾使用 dist 目标运行了 Make 命令,则 Jack 日志位于 <code>$ANDROID_BUILD_TOP/out/dist/logs/jack-server.log</code>
+ </li><li>如果没有,则您可以通过运行 <code>jack-admin server-log</code> 找到该日志
+</li></ul>
+</td>
+ </tr>
+</tbody></table>
+
+<p>对于可重现的 Jack 错误,您可以通过设置一个变量来获取更详细的日志,如下所示:</p>
+
+<pre class="prettyprint">
+$ export ANDROID_JACK_EXTRA_ARGS="--verbose debug --sanity-checks on -D
+sched.runner=single-threaded"
+</pre>
+
+<p>然后使用标准 Makefile 命令编译树或您的项目,并附上其标准输出和错误。</p>
+
+<p>要移除详细的编译日志,请使用以下命令:</p>
+
+<pre class="prettyprint">
+$ unset ANDROID_JACK_EXTRA_ARGS
+</pre>
+
+<h3 id="jack_limitations">Jack 的使用限制</h3>
+
+<ul>
+ <li>Jack 服务器默认为单用户模式,因此一台计算机上只能有一位用户使用。如果有多个用户要使用,请为每位用户选择不同的端口号,并相应调整 SERVER_NB_COMPILE。您还可以通过在 $HOME/.jack 中设置 SERVER=false 来停用 Jack 服务器。
+ </li><li>当前的 vm-tests-tf 集成方案会导致 CTS 编译速度较慢。
+ </li><li>不支持 JaCoCo 等字节码处理工具。
+</li></ul>
+
+<h2 id="using_jack_features">使用 Jack 功能</h2>
+
+<p>Jack 支持 Java 编程语言 1.7,并集成了下面列出的额外功能。</p>
+
+<h3 id="predexing">dex 预处理</h3>
+
+<p>在生成 Jack 库文件时,系统也会生成该库的 .dex 文件并将其作为 dex 预处理文件存储在 .jack 库文件中。在进行编译时,Jack 会重复使用每个库的 dex 预处理文件。</p>
+
+<p>所有库均经过 dex 预处理。</p>
+
+<img src="/images/pre-dex.png" height="75%" width="75%" alt="包含 dex 预处理文件的 Jack 库"/>
+<p class="img-caption"><strong>图 4. </strong>包含 dex 预处理文件的 Jack 库</p>
+
+<h4 id="limitations">使用限制</h4>
+
+<p>目前,如果在编译过程中使用了压缩/混淆/重新打包功能,则 Jack 不会重复使用库的 dex 预处理文件。</p>
+
+<h3 id="incremental_compilation">增量编译</h3>
+
+<p>增量编译指的是,仅重新编译自上次编译后出现过更改的组件及其依赖项。当只有少数组件出现过更改时,进行增量编译可能比完整编译快得多。</p>
+
+<h4 id="limitations">使用限制</h4>
+
+<p>当压缩、混淆、重新打包或对旧版 multi-dex 启用后,增量编译会被停用。
+
+Benny: 如何理解 multi-dex legacy</p>
+
+<h4 id="enabling_incremental_builds">启用增量编译</h4>
+
+<p>目前,增量编译默认处于未启用状态。要启用增量编译,请将以下行内容添加到您要进行增量编译的项目的 Android.mk 文件中:</p>
+
+<pre class="prettyprint">
+LOCAL_JACK_ENABLED := incremental
+</pre>
+
+<p class="note"><strong>注意</strong>:首次使用 Jack 编译项目时,如果某些依赖项未编译,请使用 <code>mma</code> 进行编译,之后您可以使用标准编译命令。</p>
+
+<h3 id="shrinking_and_obfuscation">压缩和混淆</h3>
+
+<p>Jack 支持压缩和混淆,并使用 proguard 配置文件来实现压缩和混淆功能。以下是支持的选项和忽略的选项:</p>
+
+<h4 id="supported_common_options">支持的常用选项</h4>
+
+<p>常用选项包括:</p>
+
+<ul>
+ <li> <code>@</code>
+ </li><li> <code>-include</code>
+ </li><li> <code>-basedirectory</code>
+ </li><li> <code>-injars</code>
+ </li><li> <code>-outjars // only 1 output jar supported</code>
+ </li><li> <code>-libraryjars</code>
+ </li><li> <code>-keep</code>
+ </li><li> <code>-keepclassmembers</code>
+ </li><li> <code>-keepclasseswithmembers</code>
+ </li><li> <code>-keepnames</code>
+ </li><li> <code>-keepclassmembernames</code>
+ </li><li> <code>-keepclasseswithmembernames</code>
+ </li><li> <code>-printseeds</code>
+</li></ul>
+
+<h4 id="supported_shrinking_options">支持的压缩选项</h4>
+
+<p>压缩选项包括:</p>
+
+<ul>
+ <li> <code>-dontshrink</code>
+</li></ul>
+
+<h4 id="supported_obfuscation_options">支持的混淆选项</h4>
+
+<p>混淆选项包括:</p>
+
+<ul>
+ <li> <code>-dontobfuscate</code>
+ </li><li> <code>-printmapping</code>
+ </li><li> <code>-applymapping</code>
+ </li><li> <code>-obfuscationdictionary</code>
+ </li><li> <code>-classobfuscationdictionary</code>
+ </li><li> <code>-packageobfuscationdictionary</code>
+ </li><li> <code>-useuniqueclassmembernames</code>
+ </li><li> <code>-dontusemixedcaseclassnames</code>
+ </li><li> <code>-keeppackagenames</code>
+ </li><li> <code>-flattenpackagehierarchy</code>
+ </li><li> <code>-repackageclasses</code>
+ </li><li> <code>-keepattributes</code>
+ </li><li> <code>-adaptclassstrings</code>
+</li></ul>
+
+<h4 id="ignored_options">忽略的选项</h4>
+
+<p>忽略的选项包括:</p>
+
+<ul>
+ <li> <code>-dontoptimize // Jack does not optimize</code>
+ </li><li> <code>-dontpreverify // Jack does not preverify</code>
+ </li><li> <code>-skipnonpubliclibraryclasses</code>
+ </li><li> <code>-dontskipnonpubliclibraryclasses</code>
+ </li><li> <code>-dontskipnonpubliclibraryclassmembers</code>
+ </li><li> <code>-keepdirectories</code>
+ </li><li> <code>-target</code>
+ </li><li> <code>-forceprocessing</code>
+ </li><li> <code>-printusage</code>
+ </li><li> <code>-whyareyoukeeping</code>
+ </li><li> <code>-optimizations</code>
+ </li><li> <code>-optimizationpasses</code>
+ </li><li> <code>-assumenosideeffects</code>
+ </li><li> <code>-allowaccessmodification</code>
+ </li><li> <code>-mergeinterfacesaggressively</code>
+ </li><li> <code>-overloadaggressively</code>
+ </li><li> <code>-microedition</code>
+ </li><li> <code>-verbose</code>
+ </li><li> <code>-dontnote</code>
+ </li><li> <code>-dontwarn</code>
+ </li><li> <code>-ignorewarnings</code>
+ </li><li> <code>-printconfiguration</code>
+ </li><li> <code>-dump</code>
+</li></ul>
+
+<p class="note"><strong>注意</strong>:其他选项会引发错误。</p>
+
+<h3 id="repackaging">重新打包</h3>
+
+<p>Jack 使用 jarjar 配置文件进行重新打包。</p>
+
+<p class="note"><strong>注意</strong>:Jack 与“rule”规则类型兼容,但与“zap”或“keep”规则类型不兼容。如果您需要使用“zap”或“keep”规则类型,请提交一项功能请求,并在其中说明您在应用中如何使用该功能。</p>
+
+<h3 id="multidex_support">多 dex 支持</h3>
+
+<p>由于 dex 文件的方法数上限为 65K,因此方法数超过 65K 的应用必须拆分成多个 dex 文件(要详细了解多 dex,请参阅<a href="http://developer.android.com/tools/building/multidex.html">构建方法数超过 65K 的应用</a>)。</p>
+
+<p>Jack 支持本地多 dex 和旧版多 dex。</p>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/known-issues.html b/zh-cn/source/known-issues.html
new file mode 100644
index 00000000..865a64af
--- /dev/null
+++ b/zh-cn/source/known-issues.html
@@ -0,0 +1,119 @@
+<html devsite><head>
+ <title>已知问题</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>尽管我们一直万分谨慎,但 Android 源代码有时还是会出现一些小问题。本页记录了使用 Android 源代码方面的已知问题。</p>
+
+<h2 id="build-issues">编译问题</h2>
+
+<h3 id="missing-cellbroadcastreceiver">在针对 toro 进行编译时缺少 CellBroadcastReceiver</h3>
+<p><strong>症状</strong></p>在针对 toro 进行 AOSP 编译时(最高为 Jelly Bean 4.2.1),CellBroadcastReceiver 无法添加到系统中。<p></p>
+
+<p><strong>原因:</strong></p><code>vendor/samsung/toro/device-partial.mk</code> 中存在拼写错误,<code>PRODUCT_PACKAGES</code> 将其中的 K 替换成了 H。<p><strong>解决方法</strong>:使用适用于 4.2.2 的最新程序包,或手动更正该拼写错误。</p>
+
+<h3 id="missing-cts-native-xml-generator">缺少 CTS 本机 XML 生成器</h3>
+<p><strong>症状</strong>:在对 IceCreamSandwich 及更高版本进行的一些编译中,编译初期显示以下警告:<code>/bin/bash: line 0: cd: cts/tools/cts-native-xml-generator/src/res: No
+such file or directory</code></p>
+<p><strong>原因</strong>:有些 Makefile 引用该路径,但该路径并不存在。</p>
+<p><strong>解决方法</strong>:无。这是一个无害的警告。</p>
+<h3 id="black-gingerbread-emulator">黑屏 Gingerbread 模拟器</h3>
+<p><strong>症状</strong>:从 Gingerbread 分支直接编译的模拟器无法启动,一直卡在黑屏状态。</p>
+<p><strong>原因</strong>:Gingerbread 分支使用的是 R7 版本的模拟器,该模拟器并不具备运行最近推出的一些 Gingerbread 版本所需的所有功能。</p>
+<p><strong>解决方法</strong>:使用 R12 版本的模拟器,以及与这些工具匹配的较新内核。无需进行清除编译。</p>
+<pre><code>$ repo forall platform/external/qemu -c git checkout aosp/tools_r12
+$ make
+$ emulator -kernel prebuilt/android-arm/kernel/kernel-qemu-armv7
+</code></pre>
+<h3 id="emulator-built-on-macos-107-lion-doesnt-work">在 MacOS 10.7 Lion 中编译的模拟器无法正常工作。</h3>
+<p><strong>症状</strong>:在 MacOS 10.7 Lion 和/或 XCode 4.x 中编译的模拟器(所有版本)无法启动。</p>
+<p><strong>原因</strong>:在开发环境中进行的某些更改导致系统在对模拟器进行编译时,采用的方式使模拟器无法正常工作。</p>
+<p><strong>解决方法</strong>:使用 SDK 中的模拟器二进制文件,该文件是通过 XCode 3 在 MacOS 10.6 中编译的,可在 MacOS 10.7 中正常工作。</p>
+
+<h3 id="partial-and-emulator-builds"><code>WITH_DEXPREOPT=true</code> 和模拟器编译。</h3>
+<p><strong>症状</strong>:在模拟器编译期间进行部分编译或同步(使系统没有任何依赖关系)时,生成的版本无法正常工作。</p>
+<p><strong>原因</strong>:默认情况下,所有模拟器编译操作现在都会在编译时运行 Dex 优化,这就需要遵循所有依赖关系,以便在框架每次发生更改时都重新优化应用。</p>
+<p><strong>解决方法</strong>:通过 <code>export WITH_DEXPREOPT=false</code> 在本地停用 Dex 优化,通过 <code>make installclean</code> 删除现有的已优化版本,然后运行完整编译以重新生成未优化的版本。完成上述操作后,部分编译将会正常工作。</p>
+<h3 id="permission-denied-during-builds">编译期间提示“权限遭拒”。</h3>
+<p><strong>症状</strong>:所有编译都会失败,并且系统会提示“权限遭拒”,可能还会显示防病毒警告。</p>
+<p><strong>原因</strong>:某些防病毒程序将 Android 源代码树中的一些源文件错误地识别为包含病毒的文件。</p>
+<p><strong>解决方法</strong>:确认实际上并未包含病毒之后,在 Android 树中停用防病毒程序。这还有助于减少编译次数。</p>
+<h3 id="build-errors-related-to-using-the-wrong-compiler">与使用错误编译器相关的编译错误。</h3>
+<p><strong>症状</strong>:编译会失败,而且症状各式各样。其中一种症状是 <code>cc1: error: unrecognized command line option "-m32"</code></p>
+<p><strong>原因</strong>:Android 编译系统使用路径中的默认编译器,并假设它是用于生成在主机上运行的二进制文件的合适编译器。其他情况(例如:使用 Android NDK,或编译内核)导致默认编译器不是主机编译器。</p>
+<p><strong>解决方法</strong>:使用一个“干净的”shell,其中没有任何先前操作可能更换了默认编译器。</p>
+<h3 id="build-errors-caused-by-non-default-tool-settings">由非默认工具设置导致的编译错误。</h3>
+<p><strong>症状</strong>:编译会失败,而且症状各式各样,并且系统可能会提示缺少文件或文件格式不正确。其中一种症状是 <code>member [...] in archive is not an object</code>。</p>
+<p><strong>原因</strong>:Android 编译系统倾向于使用多种主机工具并依赖其默认行为。有些设置会更改这些工具的行为,导致其行为方式干扰编译系统。导致此类问题的已知变量是 <code>CDPATH</code> 和 <code>GREP_OPTIONS</code>。</p>
+<p><strong>解决方法</strong>:在自定义设置尽可能少的环境中编译 Android。</p>
+<h3 id="build-error-with-40x-and-earlier-on-macos-107">在 MacOS 10.7 中编译 4.0.x 及更低版本时出现的错误。</h3>
+<p><strong>症状</strong>:在 MacOS 10.7 中编译 IceCreamSandwich 4.0.x(及更低版本)时会失败,并显示类似以下的错误:<code>Undefined symbols for architecture i386: "_SDL_Init"</code></p>
+<p><strong>原因</strong>:4.0.x 与 MacOS 10.7 不兼容。</p>
+<p><strong>解决方法</strong>:改用 MacOS 10.6,或使用可在 MacOS 10.7 中编译的 master 分支。</p>
+<pre><code>$ repo init -b master
+$ repo sync
+</code></pre>
+<h3 id="build-error-on-macos-with-xcode-43">在 MacOS 中使用 XCode 4.3 进行编译时出现的错误。</h3>
+<p><strong>症状</strong>:使用 XCode 4.3 时,所有编译都会失败。</p>
+<p><strong>原因</strong>:XCode 4.3 将默认编译器从 gcc 切换成了 llvm,而 llvm 拒绝接受之前 gcc 会接受的代码。</p>
+<p><strong>解决方法</strong>:使用 XCode 4.2。</p>
+<h3 id="build-error-with-40x-and-earlier-on-ubuntu-1110">在 Ubuntu 11.10 中编译 4.0.x 及更低版本时出现的错误。</h3>
+<p><strong>症状</strong>:在 Ubuntu 11.10 及更高版本中编译 IceCreamSandwich 4.0.x(及更低版本)时会失败,并显示类似以下的错误:<code>&lt;command-line&gt;:0:0: warning: "_FORTIFY_SOURCE" redefined [enabled by default]</code></p>
+<p><strong>原因</strong>:Ubuntu 11.10 使用的 gcc 版本中默认已定义该符号,而 Android 也会定义该符号,从而导致冲突。</p>
+<p><strong>解决方法</strong>:改用 Ubuntu 10.04,或使用可在 Ubuntu 11.10 及更高版本中编译的 master 分支。</p>
+<pre><code>$ repo init -b master
+$ repo sync
+</code></pre>
+
+<h2 id="source-sync">源代码同步问题</h2><h2>
+
+</h2><h3 id="difficulties-syncing-the-source-code-proxy-issues">同步源代码时遇到的问题(代理问题)。</h3>
+<p><strong>症状</strong>:<code>repo init</code> 或 <code>repo sync</code> 失败,并显示 HTTP 错误,通常为 403 或 500。</p>
+<p><strong>原因</strong>:有很多可能的原因,大多数情况下都与 HTTP 代理有关,这些代理无法顺利传输大量数据。</p>
+<p><strong>解决方法</strong>:虽然还没有通用的解决方法,但有人报告说使用 Python 2.7 以及明确使用 <code>repo sync -j1</code> 可以改善某些用户的情况。</p>
+<h3 id="difficulties-syncing-the-source-tree-virtualbox-ethernet-issues">同步源代码树时遇到的问题(VirtualBox 以太网问题)。</h3>
+<p><strong>症状</strong>:在某些 VirtualBox 安装过程中运行 <code>repo sync</code> 时,进程挂起或失败,而且症状各式各样。其中一种症状是 <code>DownloadError: HTTP 500 (Internal Server Error: Server got itself in trouble)</code>。</p>
+<p><strong>原因</strong>:VirtualBox 的默认网络行为是使用 NAT(网络地址转换)将客户系统连接到网络。在执行 repo sync 时的大量网络活动会触发 NAT 代码中的某些临界情况。</p>
+<p><strong>解决方法</strong>:将 VirtualBox 配置为使用桥接网络,而非 NAT。</p>
+<h3 id="difficulties-syncing-the-source-tree-dns-issues">同步源代码树时遇到的问题(DNS 问题)。</h3>
+<p><strong>症状</strong>:在运行 <code>repo sync</code> 时进程失败,并显示与无法识别主机名相关的各种错误。其中一种错误是 <code>&lt;urlopen error [Errno -2] Name or service not known&gt;</code>。</p>
+<p><strong>原因</strong>:有些 DNS 系统难以应对同步源代码树时涉及的大量查询(在最糟糕的情况下,可能会有数百条查询请求)。</p>
+<p><strong>解决方法</strong>:手动解析相关主机名,并在本地对解析结果进行硬编码。</p>
+<p>您可以使用 <code>nslookup</code> 命令解析主机名,该命令将为每个主机名指定一个数字 IP 地址(通常是在输出的“Address”(地址)部分)。</p>
+<pre><code>$ nslookup googlesource.com
+$ nslookup android.googlesource.com
+</code></pre>
+<p>然后,您可以在本地对它们进行硬编码,方法是修改 <code>/etc/hosts</code>,在该文件中添加两行内容,形式如下:</p>
+<pre><code>aaa.bbb.ccc.ddd googlesource.com
+eee.fff.ggg.hhh android.googlesource.com
+</code></pre>
+<p>请注意,这种方法只适用于服务器的地址不会更改的情况;如果服务器的地址发生更改,导致您无法连接,那么您必须重新解析这些主机名,并相应地修改 <code>etc/hosts</code>。</p>
+<h3 id="difficulties-syncing-the-source-tree-tcp-issues">同步源代码树时遇到的问题(TCP 问题)。</h3>
+<p><strong>症状</strong>:在同步时 <code>repo sync</code> 挂起,通常是在同步操作完成 99% 时出现这种情况。</p>
+<p><strong>原因</strong>:TCP/IP 堆栈中的某些设置在有些网络环境中会导致出现问题,使得 <code>repo sync</code> 既无法完成,也不会失败。</p>
+<p><strong>解决方法</strong>:在 Linux 中,请运行 <code>sysctl -w net.ipv4.tcp_window_scaling=0</code>。在 MacOS 中,请在网络设置部分停用 rfc1323 扩展程序。</p>
+
+<h2 id="runtime-issues">运行时问题</h2>
+<h3 id="camera-and-gps-dont-work-on-galaxy-nexus">摄像头和 GPS 在 Galaxy Nexus 上无法正常工作。</h3>
+<p><strong>症状</strong>:摄像头和 GPS 在 Galaxy Nexus 上无法正常工作。比如,摄像头应用一启动便会崩溃。</p>
+<p><strong>原因</strong>:Android 开放源代码项目中未提供这些硬件外围设备所需的专有库。</p>
+<p><strong>解决方法</strong>:无。</p>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/licenses.html b/zh-cn/source/licenses.html
new file mode 100644
index 00000000..81cb166c
--- /dev/null
+++ b/zh-cn/source/licenses.html
@@ -0,0 +1,47 @@
+<html devsite><head>
+ <title>内容许可</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>在 Android 开放源代码项目中,我们的软件使用<a href="http://www.opensource.org/">开放源代码促进会</a>批准的一些开放源代码许可。</p>
+<h2 id="android-open-source-project-license">Android 开放源代码项目许可</h2>
+<p>Android 开放源代码项目的首选许可是 <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License 2.0 版</a>(“Apache 2.0”),Android 软件的大部分内容都是根据 Apache 2.0 授权用户使用。尽管该项目将尽可能遵循此首选许可,但也可能存在将根据具体情况处理的例外情况。例如,与系统使用的许可不同,Linux 内核补丁程序使用的是 GPLv2 许可,您可以在 <a href="http://www.kernel.org/pub/linux/kernel/COPYING">kernel.org</a> 上找到相关信息。</p>
+<h2 id="contributor-license-grants">贡献者许可协议</h2>
+<p><em></em>为 Android 开放源代码项目提供想法、代码或文档的所有个人贡献者(即仅以个人名义做贡献的贡献者)都需要填写、签署并提交《<a href="https://cla.developers.google.com/about/google-individual">个人贡献者许可协议</a>》。该协议可通过<a href="https://android-review.googlesource.com/#/settings/agreements">代码审核工具</a>在线签署。该协议明确规定了他们为 Android 开放源代码项目贡献知识产权内容时遵循的条款。该许可既是为了保护贡献者,也是为了保护该项目;它不会影响贡献者将贡献内容用于任何其他用途的权利。</p>
+<p><em></em>对于已指派员工参与 Android 开放源代码项目的企业(或其他实体),则需要签署《<a href="https://cla.developers.google.com/about/google-corporate">企业贡献者许可协议</a>》。该版本的协议中规定,企业可以对其指派的员工提交的贡献内容进行授权,并可以授予版权和专利许可。请注意,签署《企业贡献者许可协议》并不意味着任何开发者无需再以个人名义签署《个人贡献者许可协议》。所有开发者都<em></em>必须签署个人协议,以涵盖他们贡献的任何不归签署《企业贡献者许可协议》的企业所有的内容。</p>
+<p>请注意,我们的协议是根据 <a href="http://www.apache.org">Apache 软件基金会</a>所用的协议(可在 <a href="http://www.apache.org/licenses/">Apache 网站</a>上找到)制定的。</p>
+<h2 id="why-apache-software-license">为什么使用 Apache Software License?</h2>
+<p>有时候,有人会问我们,为什么 Apache Software License 2.0 是 Android 的首选许可。对于用户空间(即非内核)软件,相比其他许可(例如 LGPL),我们确实更倾向于 ASL2.0(以及 BSD、MIT 等类似许可)。</p>
+<p>Android 的宗旨是自由和选择。Android 旨在促进移动世界的开放性,我们不认为我们能够预测出或规定用户希望将我们的软件应用到的所有用途。因此,虽然我们鼓励每个人打造开放且可修改的设备,但我们并不认为我们有权利强制他们这样做。使用 LGPL 库则往往会强制他们这样做。</p>
+<p>以下是我们关心的一些具体问题:</p>
+<ul>
+<li>
+<p>LGPL(简化条款形式)要求:将源代码植入到应用中;书面提供源代码;或者动态关联 LGPL-ed 库,并允许用户手动升级或替换该库。由于 Android 软件通常是以静态系统映像的形式植入的,因此遵守这些要求最终会限制原始设备制造商 (OEM) 的设计。(例如,用户很难在只读闪存中替换库。)</p>
+</li>
+<li>
+<p>LGPL 要求允许用户进行修改,并要求允许用户进行逆向工程以便调试这些修改。大多数设备制造商都不希望受到这些条款的约束。因此,为了尽量减轻这些公司的负担,我们会最大限度地减少在用户空间中使用 LGPL 软件。</p></li><p></p>
+
+<li>
+<p>过去,LGPL 库是下游设备制造商和应用开发者面临的大量合规问题的根源。遗憾的是,就这些问题对工程师提供指导非常困难而且进展缓慢。设备制造商能够尽可能轻松地遵守许可对于 Android 的成功至关重要。鉴于过去在遵守 LGPL 方面遇到的困难,最明智的做法就是,如果我们能够避免使用 LGPL 库,便不使用它们。</p>
+</li>
+</ul>
+<p>上面讨论的问题是我们为自己的代码首选 ASL2.0 的原因。它们并不是批判 LGPL 或其他许可。我们非常热衷于这一主题,甚至不厌其烦地想方设法确保尽可能多的代码根据 ASL2.0 授权用户使用。不过,我们喜欢各种免费的开放源代码许可,并尊重其他人的意见和偏好。我们只是认定 ASL2.0 是适合我们目标的许可而已。</p>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/life-of-a-bug.html b/zh-cn/source/life-of-a-bug.html
new file mode 100644
index 00000000..cfd960dd
--- /dev/null
+++ b/zh-cn/source/life-of-a-bug.html
@@ -0,0 +1,128 @@
+<html devsite><head>
+ <title>错误的生命周期</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>Android 开放源代码项目提供了一个公开问题跟踪工具,您可以在其中就 Android 核心软件堆栈报告错误及请求功能。(要详细了解此问题跟踪工具,请参阅<a href="report-bugs.html">报告错误</a>页面。)我们非常欢迎您报告错误(谢谢!),但在提交错误报告后会发生什么呢?本页将说明错误的生命周期。</p>
+
+<p>*请注意:Android 开放源代码项目 (AOSP) 问题跟踪工具仅用于与 Android 核心软件堆栈相关的错误报告和功能请求,同时也是一个供开放源代码社区使用的技术工具。</p>
+
+<p>但它不是一个客户支持论坛。您可以在 <a href="http://support.google.com/nexus">Google 的 Nexus 支持网站</a>上找到关于 Nexus 设备的支持信息。其他设备的支持由设备制造商或销售这些设备的运营商提供。</p>
+
+<p>通过 <a href="http://support.google.com/">Google 的支持网站</a>可以找到关于 Google 应用的支持信息。涉及第三方应用的支持由各自的应用开发者提供,例如,您可以通过 Google Play 上提供的联系信息与他们联系。</p>
+
+<p>下面简要说明了错误的生命周期:</p>
+<ol>
+<li>
+<p>用户提交一个错误,该错误的状态将为“New”(新)。</p>
+</li>
+<li>
+<p>AOSP 维护人员定期审核错误并进行分类。错误将划分为 4 个类别中的一个:“新”、“Open”(待解决)、“No-Action”(无需处理)或“Resolved”(已解决)。</p>
+</li>
+<li>
+<p>每个类别都包括多种状态,可提供有关问题处理的更多详情。</p>
+</li>
+<li>
+<p>“已解决”类别中的错误最终会在未来版本的 Android 软件中予以修复。</p>
+</li>
+</ol>
+<h2 id="bucket-details">类别详情</h2>
+<p>以下是关于每个类别、其含义及处理方式的更多信息。</p>
+<h3 id="new-issues">“新”问题</h3>
+<p>“新”问题包括尚未进行任何处理的错误报告,具有以下两种状态:</p>
+<ul>
+<li>
+<p><em></em>New(新):
+ 错误报告尚未分类(即由 AOSP 维护人员审核。)</p>
+</li>
+<li>
+<p><em></em>NeedsInfo(需要信息):
+ 错误报告的信息不充分,无法予以处理。报告错误的用户需要提供更多详细信息,错误才可以进行分类。如果在规定时间内未提供新信息,该错误默认可能会被关闭,变为“无需处理”类别下的某种状态。</p>
+</li>
+</ul>
+<h3 id="open-issues">“待解决”问题</h3>
+<p>此类别包含需要处理但仍未解决的错误(正在等待我们对源代码进行更改)。</p>
+<ul>
+<li>
+<p><em></em>Unassigned(未分配):
+ 错误报告已被认定为细节充分、问题有效,但尚未分配给 AOSP 贡献者进行修复。</p>
+</li>
+<li>
+<p><em></em><em></em>Assigned(已分配):
+ 与“未分配”类似,但错误实际上已分配给特定贡献者进行修复。</p>
+</li>
+</ul>
+<p><em></em><em></em>通常情况下,特定错误一开始会处于“未分配”状态并一直保持该状态,直到有人有意解决该错误,此时该错误会变成“已分配”状态。但请注意,我们并不保证一定会是这样,而错误从“未分配”直接变为“已解决”类别下的某种状态也是很常见的。<em></em></p>
+<p>一般来说,如果一个错误处于以上“待解决”类别下的某种状态,则表明 AOSP 团队已将其认定为有效问题,该错误很可能会获得贡献者的认可,从而得到高质量的修复。不过,我们无法保证及时修复任何特定版本的错误。</p>
+
+<h3 id="no-action-issues">“无需处理”问题</h3>
+<p>此类别包含由于某种原因而被认定为不需要任何处理措施的错误。</p>
+<ul>
+<li>
+<p><em></em>Spam(无关内容):
+ 好心人士给我们送来一些美味的猪肉制品,但是很遗憾,我们并不需要。</p>
+</li>
+<li>
+<p><em></em>Duplicate(重复):
+ 问题跟踪工具中已有相同的报告。类似报告将收到有关任何实际处理措施的消息。</p>
+</li>
+<li>
+<p><em></em>Unreproducible(不可重现):
+ AOSP 贡献者尝试重现所描述的行为,但无法做到。有时,这意味着错误虽然有效但不常见或者难以重现,有时也意味着错误已在更高版本中予以修复。</p>
+</li>
+<li>
+<p><em></em><em></em>Obsolete(过时):
+ 与“不可重现”类似,但可以合理认定错误确实存在于所报告的版本中,但已在更高版本中得以修复。</p>
+</li>
+<li>
+<p><em></em>WorkingAsIntended(正常情况):
+ AOSP 维护人员已确定所描述的行为不是错误,而是正常情况。这种状态通常也称为“WAI”。</p>
+</li>
+<li>
+<p><em></em><em></em>Declined(遭拒):
+ 除了通常用于功能请求(而非错误)的情况之外,其他与“正常情况”类似。也就是说,AOSP 维护人员已确定相应请求不会在 Android 中予以实现。</p>
+</li>
+<li>
+<p><em></em>NotEnoughInformation(缺少充分信息):报告没有提供充分的信息,导致维护人员无法采取任何处理措施。</p>
+</li>
+<li>
+<p><em></em>UserError(用户错误):报告是用户在使用 Android 时犯错而造成的结果,例如输入错误的密码导致无法连接到服务器。</p>
+</li>
+<li>
+<p><em></em>WrongForum(错误论坛):报告无法在 AOSP 中予以处理,通常是因为报告与定制设备或外部应用相关。</p>
+</li>
+<li>
+<p><em></em>Question(问题):用户误以为问题跟踪工具是帮助论坛而提出的问题。</p>
+</li>
+</ul>
+<h3 id="resolved-issues">“已解决”问题</h3>
+<p>此类别包含已采取处理措施且现在被视为已解决的错误。</p>
+<ul>
+<li>
+<p><em></em>Released(已发布):此错误已修复,且修复方案已纳入一个正式版本中。在设置此状态的同时,我们也会尝试设置一个属性,说明错误在哪个版本中予以修复的。</p>
+</li>
+<li>
+<p><em></em>FutureRelease(未来版本):此错误已经在源代码树中予以修复(或功能已经实现),但修复方案尚未纳入正式版本中。</p>
+</li>
+</ul>
+<h2 id="other-stuff">其他事项</h2>
+<p>上述状态和生命周期是我们通常跟踪软件的方式。但是,Android 包含大量软件,相应地也会收到大量错误报告。因此,有时候错误并没有经过正式流程中的所有状态。虽然我们会尽量确保系统保持最新状态,但我们倾向于定期进行“错误清除”- 在此过程中,我们会检查数据库并进行更新。</p>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/life-of-a-patch.html b/zh-cn/source/life-of-a-patch.html
new file mode 100644
index 00000000..8e169ed3
--- /dev/null
+++ b/zh-cn/source/life-of-a-patch.html
@@ -0,0 +1,29 @@
+<html devsite><head>
+ <title>补丁程序的生命周期</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>Android 开放源代码项目 (AOSP) 使用一种基于网页的代码审核工具,该工具称为 <a href="https://android-review.googlesource.com/">Gerrit</a>。下图是一个流程图,详细说明了补丁程序在编写好之后会发生什么。虽然这看起来可能非常复杂,但以下大多数步骤都是在网络应用中执行的。</p>
+<p>如需关于如何完成相关设置来使用 Gerrit 和 Git 的完整说明,请参阅<a href="submit-patches.html">提交补丁程序</a>页面。</p>
+<img src="/images/workflow-0.png" alt="工作流程示意图" id="figure1"/>
+<p class="img-caption">
+ <strong>图 1.</strong> 补丁程序工作流程</p>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/read-bug-reports.html b/zh-cn/source/read-bug-reports.html
new file mode 100644
index 00000000..55bb6500
--- /dev/null
+++ b/zh-cn/source/read-bug-reports.html
@@ -0,0 +1,863 @@
+<html devsite><head>
+ <title>阅读错误报告</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>无论是任何类型的开发工作,出错都在所难免,而错误报告对于找出和解决问题至关重要。Android 的所有版本都支持通过 <a href="http://developer.android.com/tools/help/adb.html">Android 调试桥 (adb)</a> 获取错误报告;Android 4.2 及更高版本支持一个旨在获取错误报告以及通过电子邮件、云端硬盘等分享报告的<a href="http://developer.android.com/tools/device.html#developer-device-options">开发者选项</a>。</p>
+
+<p>Android 错误报告中包含文本 (.txt) 格式的 <code>dumpsys</code>、<code>dumpstate</code> 和 <code>logcat</code> 数据,以便您轻松搜索特定内容。以下各部分详细说明了错误报告的组成部分、介绍了常见问题,并提供了关于查找与这些错误相关的日志的实用提示和 <code>grep</code> 命令。大多数部分中还包括 <code>grep</code> 命令及输出和/或 <code>dumpsys</code> 输出方面的示例。</p>
+
+<h2 id="logcat">Logcat</h2>
+<p><code>logcat</code> 日志是所有 <code>logcat</code> 信息的转储,并采用字符串形式。<strong>system</strong>(系统)部分专门用于记录框架方面的信息,与包含所有其他内容的 <strong>main</strong>(主要内容)部分相比,该部分包含更长时间内的记录。每行都以 <code>timestamp PID TID log-level</code> 开头。</p>
+
+ <section class="expandable">
+ <h4 class="showalways">显示示例</h4>
+ <p></p><pre>------ SYSTEM LOG (logcat -v threadtime -d *:v) ------
+--------- beginning of system
+<i>Blah</i>
+<i>Blah</i>
+<i>Blah</i>
+
+--------- beginning of main
+<i>Blah </i>
+<i>Blah</i>
+<i>Blah</i></pre><p></p>
+ </section>
+
+<h3 id="event-log">查看事件日志</h3>
+<p>该日志中包含将二进制格式转换成了字符串形式的日志消息。它比 <code>logcat</code> 日志要清晰明了,但也有些难以阅读。在查看事件日志时,您可以在这一部分中搜索特定进程 ID (PID),以查看相应进程一直在做什么。基本格式为:<code>timestamp PID TID log-level log-tag tag-values</code>。</p>
+
+<p>日志级别包括以下几种:</p>
+<ul>
+<li>V:详细</li>
+<li>D:调试</li>
+<li>I:信息</li>
+<li>W:警告</li>
+<li>E:错误</li>
+</ul>
+
+ <section class="expandable">
+ <h4 class="showalways">显示示例</h4>
+ <p></p><pre>------ EVENT LOG (logcat -b events -v threadtime -d *:v) ------
+09-28 13:47:34.179 785 5113 I am_proc_bound: [0,23054,com.google.android.gms.unstable]
+09-28 13:47:34.777 785 1975 I am_proc_start: [0,23134,10032,com.android.chrome,broadcast,com.android.chrome/org.chromium.chrome.browser.precache.PrecacheServiceLauncher]
+09-28 13:47:34.806 785 2764 I am_proc_bound: [0,23134,com.android.chrome]
+...</pre><p></p>
+ </section>
+<p> </p>
+<p>有关其他实用的事件日志标记,请参阅 <a href="https://android.googlesource.com/platform/frameworks/base/+/master/services/core/java/com/android/server/EventLogTags.logtags">/services/core/java/com/android/server/EventLogTags.logtags</a>。</p>
+
+<h2 id="anrs-deadlocks">ANR 和死锁</h2>
+<p>错误报告有助于您找出导致<a href="http://developer.android.com/training/articles/perf-anr.html">应用无响应 (ANR)</a> 错误和死锁事件的原因。</p>
+
+<h3 id="determine-anr-app">找出无响应的应用</h3>
+<p>当某个应用在一定时间内没有响应(通常是由于主线程被阻塞或繁忙)时,系统会终止该进程并将堆栈转储到 <code>/data/anr</code>。要找出 ANR 背后的罪魁祸首,请为二进制事件日志中的 <code>am_anr</code> 执行 grep 命令。</p>
+
+ <section class="expandable">
+ <h4 class="showalways">显示示例</h4>
+ <p></p><pre>grep "am_anr" bugreport-2015-10-01-18-13-48.txt
+10-01 18:12:49.599 4600 4614 I am_anr : [0,29761,com.google.android.youtube,953695941,executing service com.google.android.youtube/com.google.android.apps.youtube.app.offline.transfer.OfflineTransferService]
+10-01 18:14:10.211 4600 4614 I am_anr : [0,30363,com.google.android.apps.plus,953728580,executing service com.google.android.apps.plus/com.google.android.apps.photos.service.PhotosService]</pre><p></p>
+ </section>
+
+<p></p>
+<p>您也可以为 <code>logcat</code> 日志(其中包含关于发生 ANR 时是什么在占用 CPU 的更多信息)中的 <code>ANR in</code> 执行 grep 命令。</p>
+
+ <section class="expandable">
+ <h4 class="showalways">显示示例</h4>
+ <p></p><pre>grep "ANR in" bugreport-2015-10-01-18-13-48.txt
+10-01 18:13:11.984 4600 4614 E ActivityManager: ANR in com.google.android.youtube
+10-01 18:14:31.720 4600 4614 E ActivityManager: ANR in com.google.android.apps.plus
+10-01 18:14:31.720 4600 4614 E ActivityManager: PID: 30363
+10-01 18:14:31.720 4600 4614 E ActivityManager: Reason: executing service com.google.android.apps.plus/com.google.android.apps.photos.service.PhotosService
+10-01 18:14:31.720 4600 4614 E ActivityManager: Load: 35.27 / 23.9 / 16.18
+10-01 18:14:31.720 4600 4614 E ActivityManager: CPU usage from 16ms to 21868ms later:
+10-01 18:14:31.720 4600 4614 E ActivityManager: 74% 3361/mm-qcamera-daemon: 62% user + 12% kernel / faults: 15276 minor 10 major
+10-01 18:14:31.720 4600 4614 E ActivityManager: 41% 4600/system_server: 18% user + 23% kernel / faults: 18597 minor 309 major
+10-01 18:14:31.720 4600 4614 E ActivityManager: 32% 27420/com.google.android.GoogleCamera: 24% user + 7.8% kernel / faults: 48374 minor 338 major
+10-01 18:14:31.720 4600 4614 E ActivityManager: 16% 130/kswapd0: 0% user + 16% kernel
+10-01 18:14:31.720 4600 4614 E ActivityManager: 15% 283/mmcqd/0: 0% user + 15% kernel
+...
+10-01 18:14:31.720 4600 4614 E ActivityManager: 0.1% 27248/irq/503-synapti: 0%
+10-01 18:14:31.721 4600 4614 I ActivityManager: Killing 30363:com.google.android.apps.plus/u0a206 (adj 0): bg anr</pre><p></p>
+ </section>
+
+<h3 id="find-stack-traces">查找堆栈跟踪</h3>
+<p>通常您可以找到与 ANR 对应的堆栈跟踪。请确保 VM 跟踪上的时间戳和 PID 与您正在调查的 ANR 相符,然后再检查进程的主线程。请注意:</p>
+<ul>
+<li>主线程只能让您了解发生 ANR 时它在做什么,这可能是导致 ANR 的真正原因,也可能不是。(错误报告中的堆栈可能是无辜的;可能有其他线程在恢复正常之前粘滞了很长时间,但不足以导致 ANR。)
+</li>
+<li>可能存在多组堆栈跟踪(<code>VM TRACES JUST NOW</code> 和 <code>VM TRACES AT LAST ANR</code>)。请确保您查看的是正确的部分。</li>
+</ul>
+
+ <section class="expandable">
+ <h4 class="showalways">显示示例</h4>
+ <p></p><pre>------ VM TRACES AT LAST ANR (/data/anr/traces.txt: 2015-10-01 18:14:41) ------
+
+----- pid 30363 at 2015-10-01 18:14:11 -----
+Cmd line: com.google.android.apps.plus
+Build fingerprint: 'google/angler/angler:6.0/MDA89D/2294819:userdebug/dev-keys'
+ABI: 'arm'
+Build type: optimized
+Zygote loaded classes=3978 post zygote classes=27
+Intern table: 45068 strong; 21 weak
+JNI: CheckJNI is off; globals=283 (plus 360 weak)
+Libraries: /system/lib/libandroid.so /system/lib/libcompiler_rt.so /system/lib/libjavacrypto.so /system/lib/libjnigraphics.so /system/lib/libmedia_jni.so /system/lib/libwebviewchromium_loader.so libjavacore.so (7)
+Heap: 29% free, 21MB/30MB; 32251 objects
+Dumping cumulative Gc timings
+Total number of allocations 32251
+Total bytes allocated 21MB
+Total bytes freed 0B
+Free memory 9MB
+Free memory until GC 9MB
+Free memory until OOME 490MB
+Total memory 30MB
+Max memory 512MB
+Zygote space size 1260KB
+Total mutator paused time: 0
+Total time waiting for GC to complete: 0
+Total GC count: 0
+Total GC time: 0
+Total blocking GC count: 0
+Total blocking GC time: 0
+
+suspend all histogram: Sum: 119.728ms 99% C.I. 0.010ms-107.765ms Avg: 5.442ms Max: 119.562ms
+DALVIK THREADS (12):
+"Signal Catcher" daemon prio=5 tid=2 Runnable
+ | group="system" sCount=0 dsCount=0 obj=0x12c400a0 self=0xef460000
+ | sysTid=30368 nice=0 cgrp=default sched=0/0 handle=0xf4a69930
+ | state=R schedstat=( 9021773 5500523 26 ) utm=0 stm=0 core=1 HZ=100
+ | stack=0xf496d000-0xf496f000 stackSize=1014KB
+ | held mutexes= "mutator lock"(shared held)
+ native: #00 pc 0035a217 /system/lib/libart.so (art::DumpNativeStack(std::__1::basic_ostream&lt;char, std::__1::char_traits&lt;char&gt; &gt;&amp;, int, char const*, art::ArtMethod*, void*)+126)
+ native: #01 pc 0033b03b /system/lib/libart.so (art::Thread::Dump(std::__1::basic_ostream&lt;char, std::__1::char_traits&lt;char&gt; &gt;&amp;) const+138)
+ native: #02 pc 00344701 /system/lib/libart.so (art::DumpCheckpoint::Run(art::Thread*)+424)
+ native: #03 pc 00345265 /system/lib/libart.so (art::ThreadList::RunCheckpoint(art::Closure*)+200)
+ native: #04 pc 00345769 /system/lib/libart.so (art::ThreadList::Dump(std::__1::basic_ostream&lt;char, std::__1::char_traits&lt;char&gt; &gt;&amp;)+124)
+ native: #05 pc 00345e51 /system/lib/libart.so (art::ThreadList::DumpForSigQuit(std::__1::basic_ostream&lt;char, std::__1::char_traits&lt;char&gt; &gt;&amp;)+312)
+ native: #06 pc 0031f829 /system/lib/libart.so (art::Runtime::DumpForSigQuit(std::__1::basic_ostream&lt;char, std::__1::char_traits&lt;char&gt; &gt;&amp;)+68)
+ native: #07 pc 00326831 /system/lib/libart.so (art::SignalCatcher::HandleSigQuit()+896)
+ native: #08 pc 003270a1 /system/lib/libart.so (art::SignalCatcher::Run(void*)+324)
+ native: #09 pc 0003f813 /system/lib/libc.so (__pthread_start(void*)+30)
+ native: #10 pc 00019f75 /system/lib/libc.so (__start_thread+6)
+ (no managed stack frames)
+
+"main" prio=5 tid=1 Suspended
+ | group="main" sCount=1 dsCount=0 obj=0x747552a0 self=0xf5376500
+ | sysTid=30363 nice=0 cgrp=default sched=0/0 handle=0xf74feb34
+ | state=S schedstat=( 331107086 164153349 851 ) utm=6 stm=27 core=3 HZ=100
+ | stack=0xff00f000-0xff011000 stackSize=8MB
+ | held mutexes=
+ kernel: __switch_to+0x7c/0x88
+ kernel: futex_wait_queue_me+0xd4/0x130
+ kernel: futex_wait+0xf0/0x1f4
+ kernel: do_futex+0xcc/0x8f4
+ kernel: compat_SyS_futex+0xd0/0x14c
+ kernel: cpu_switch_to+0x48/0x4c
+ native: #00 pc 000175e8 /system/lib/libc.so (syscall+28)
+ native: #01 pc 000f5ced /system/lib/libart.so (art::ConditionVariable::Wait(art::Thread*)+80)
+ native: #02 pc 00335353 /system/lib/libart.so (art::Thread::FullSuspendCheck()+838)
+ native: #03 pc 0011d3a7 /system/lib/libart.so (art::ClassLinker::LoadClassMembers(art::Thread*, art::DexFile const&amp;, unsigned char const*, art::Handle&lt;art::mirror::Class&gt;, art::OatFile::OatClass const*)+746)
+ native: #04 pc 0011d81d /system/lib/libart.so (art::ClassLinker::LoadClass(art::Thread*, art::DexFile const&amp;, art::DexFile::ClassDef const&amp;, art::Handle&lt;art::mirror::Class&gt;)+88)
+ native: #05 pc 00132059 /system/lib/libart.so (art::ClassLinker::DefineClass(art::Thread*, char const*, unsigned int, art::Handle&lt;art::mirror::ClassLoader&gt;, art::DexFile const&amp;, art::DexFile::ClassDef const&amp;)+320)
+ native: #06 pc 001326c1 /system/lib/libart.so (art::ClassLinker::FindClassInPathClassLoader(art::ScopedObjectAccessAlreadyRunnable&amp;, art::Thread*, char const*, unsigned int, art::Handle&lt;art::mirror::ClassLoader&gt;, art::mirror::Class**)+688)
+ native: #07 pc 002cb1a1 /system/lib/libart.so (art::VMClassLoader_findLoadedClass(_JNIEnv*, _jclass*, _jobject*, _jstring*)+264)
+ native: #08 pc 002847fd /data/dalvik-cache/arm/system@framework@boot.oat (Java_java_lang_VMClassLoader_findLoadedClass__Ljava_lang_ClassLoader_2Ljava_lang_String_2+112)
+ at java.lang.VMClassLoader.findLoadedClass!(Native method)
+ at java.lang.ClassLoader.findLoadedClass(ClassLoader.java:362)
+ at java.lang.ClassLoader.loadClass(ClassLoader.java:499)
+ at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
+ at android.app.ActivityThread.installProvider(ActivityThread.java:5141)
+ at android.app.ActivityThread.installContentProviders(ActivityThread.java:4748)
+ at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4688)
+ at android.app.ActivityThread.-wrap1(ActivityThread.java:-1)
+ at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405)
+ at android.os.Handler.dispatchMessage(Handler.java:102)
+ at android.os.Looper.loop(Looper.java:148)
+ at android.app.ActivityThread.main(ActivityThread.java:5417)
+ at java.lang.reflect.Method.invoke!(Native method)
+ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
+ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
+
+ ...
+<i> Stacks for other threads in this process follow</i>
+ ...</pre><p></p>
+ </section>
+
+<h3 id="deadlocks">查找死锁</h3>
+<p>由于线程出现粘滞,死锁往往首先表现为 ANR。如果系统服务器发生死锁,监控程序最终会将其终止,从而导致日志中出现类似以下的条目:<code>WATCHDOG KILLING SYSTEM PROCESS</code>。对于用户来说,他们看到的是设备重新启动,但从技术上来讲这是运行时重启,而不是真正的设备重新启动。</p>
+
+<ul>
+<li>在<strong>运行时</strong>重启时,系统服务器已死机并会重启,并且用户会看到设备返回到显示启动动画。</li>
+<li>在设备<strong>重新启动</strong>时,内核已崩溃,并且用户会看到设备返回到显示 Google 启动徽标。</li>
+</ul>
+
+<p>要查找死锁,请检查 VM 跟踪部分中是否存在以下模式:线程 A 在等待线程 B 占用的某些资源,而线程 B 也在等待线程 A 占用的某些资源。</p>
+
+ <section class="expandable">
+ <h4 class="showalways">显示示例</h4>
+ <p></p><pre>"Binder_B" prio=5 tid=73 Blocked
+ | group="main" sCount=1 dsCount=0 obj=0x13faa0a0 self=0x95e24800
+ | sysTid=2016 nice=0 cgrp=default sched=0/0 handle=0x8b68d930
+ | state=S schedstat=( 9351576559 4141431119 16920 ) utm=819 stm=116 core=1 HZ=100
+ | stack=0x8b591000-0x8b593000 stackSize=1014KB
+ | held mutexes=
+ at com.android.server.pm.UserManagerService.exists(UserManagerService.java:387)
+ - waiting to lock &lt;0x025f9b02&gt; (a android.util.ArrayMap) held by thread 20
+ at com.android.server.pm.PackageManagerService.getApplicationInfo(PackageManagerService.java:2848)
+ at com.android.server.AppOpsService.getOpsRawLocked(AppOpsService.java:881)
+ at com.android.server.AppOpsService.getOpsLocked(AppOpsService.java:856)
+ at com.android.server.AppOpsService.noteOperationUnchecked(AppOpsService.java:719)
+ - locked &lt;0x0231885a&gt; (a com.android.server.AppOpsService)
+ at com.android.server.AppOpsService.noteOperation(AppOpsService.java:713)
+ at com.android.server.AppOpsService$2.getMountMode(AppOpsService.java:260)
+ at com.android.server.MountService$MountServiceInternalImpl.getExternalStorageMountMode(MountService.java:3416)
+ at com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:3228)
+ at com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:3170)
+ at com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:3059)
+ at com.android.server.am.BroadcastQueue.processNextBroadcast(BroadcastQueue.java:1070)
+ - locked &lt;0x044d166f&gt; (a com.android.server.am.ActivityManagerService)
+ at com.android.server.am.ActivityManagerService.finishReceiver(ActivityManagerService.java:16950)
+ at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:494)
+ at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2432)
+ at android.os.Binder.execTransact(Binder.java:453)
+...
+ "PackageManager" prio=5 tid=20 Blocked
+ | group="main" sCount=1 dsCount=0 obj=0x1304f4a0 self=0xa7f43900
+ | sysTid=1300 nice=10 cgrp=bg_non_interactive sched=0/0 handle=0x9fcf9930
+ | state=S schedstat=( 26190141996 13612154802 44357 ) utm=2410 stm=209 core=2 HZ=100
+ | stack=0x9fbf7000-0x9fbf9000 stackSize=1038KB
+ | held mutexes=
+ at com.android.server.AppOpsService.noteOperationUnchecked(AppOpsService.java:718)
+ - waiting to lock &lt;0x0231885a&gt; (a com.android.server.AppOpsService) held by thread 73
+ at com.android.server.AppOpsService.noteOperation(AppOpsService.java:713)
+ at com.android.server.AppOpsService$2.getMountMode(AppOpsService.java:260)
+ at com.android.server.AppOpsService$2.hasExternalStorage(AppOpsService.java:273)
+ at com.android.server.MountService$MountServiceInternalImpl.hasExternalStorage(MountService.java:3431)
+ at com.android.server.MountService.getVolumeList(MountService.java:2609)
+ at android.os.storage.StorageManager.getVolumeList(StorageManager.java:880)
+ at android.os.Environment$UserEnvironment.getExternalDirs(Environment.java:83)
+ at android.os.Environment.isExternalStorageEmulated(Environment.java:708)
+ at com.android.server.pm.PackageManagerService.isExternalMediaAvailable(PackageManagerService.java:9327)
+ at com.android.server.pm.PackageManagerService.startCleaningPackages(PackageManagerService.java:9367)
+ - locked &lt;0x025f9b02&gt; (a android.util.ArrayMap)
+ at com.android.server.pm.PackageManagerService$PackageHandler.doHandleMessage(PackageManagerService.java:1320)
+ at com.android.server.pm.PackageManagerService$PackageHandler.handleMessage(PackageManagerService.java:1122)
+ at android.os.Handler.dispatchMessage(Handler.java:102)
+ at android.os.Looper.loop(Looper.java:148)
+ at android.os.HandlerThread.run(HandlerThread.java:61)
+ at com.android.server.ServiceThread.run(ServiceThread.java:46)</pre><p></p>
+ </section>
+
+<h2 id="activities">Activity</h2>
+<p><a href="http://developer.android.com/guide/components/activities.html">Activity</a> 是一种应用组件,可提供一个屏幕,用户能够通过与该屏幕互动来执行某些操作,例如拨打电话号码、拍照、发送电子邮件,等等。从错误报告的角度来看,一个 <a href="http://developer.android.com/reference/android/app/Activity.html">Activity</a> 是用户可以执行一项明确具体的操作,这使得查找在崩溃期间处于聚焦状态的 Activity 变得非常重要。Activity 通过 ActivityManager 运行进程,因此找出指定 Activity 的所有进程停止和启动事件也有助于进行问题排查。</p>
+
+<h3 id="history-focused-activities">查看处于聚焦状态的 Activity</h3>
+<p>要查看记录的处于聚焦状态的 Activity,请搜索 <code>am_focused_activity</code>。</p>
+
+ <section class="expandable">
+ <h4 class="showalways">显示示例</h4>
+ <p></p><pre>grep "am_focused_activity" bugreport-2015-10-01-18-13-48.txt
+10-01 18:10:41.409 4600 14112 I am_focused_activity: [0,com.google.android.GoogleCamera/com.android.camera.CameraActivity]
+10-01 18:11:17.313 4600 5687 I am_focused_activity: [0,com.google.android.googlequicksearchbox/com.google.android.launcher.GEL]
+10-01 18:11:52.747 4600 14113 I am_focused_activity: [0,com.google.android.GoogleCamera/com.android.camera.CameraActivity]
+10-01 18:14:07.762 4600 5687 I am_focused_activity: [0,com.google.android.googlequicksearchbox/com.google.android.launcher.GEL]</pre><p></p>
+ </section>
+
+<h3 id="history-process-starts">查看进程启动事件</h3>
+<p>要查看记录的进程启动事件,请搜索 <code>Start proc</code>。</p>
+
+ <section class="expandable">
+ <h4 class="showalways">显示示例</h4>
+ <p></p><pre>grep "Start proc" bugreport-2015-10-01-18-13-48.txt
+10-01 18:09:15.309 4600 4612 I ActivityManager: Start proc 24533:com.metago.astro/u0a240 for broadcast com.metago.astro/com.inmobi.commons.analytics.androidsdk.IMAdTrackerReceiver
+10-01 18:09:15.687 4600 14112 I ActivityManager: Start proc 24548:com.google.android.apps.fitness/u0a173 for service com.google.android.apps.fitness/.api.services.ActivityUpsamplingService
+10-01 18:09:15.777 4600 6604 I ActivityManager: Start proc 24563:cloudtv.hdwidgets/u0a145 for broadcast cloudtv.hdwidgets/cloudtv.switches.SwitchSystemUpdateReceiver
+10-01 18:09:20.574 4600 6604 I ActivityManager: Start proc 24617:com.wageworks.ezreceipts/u0a111 for broadcast com.wageworks.ezreceipts/.ui.managers.IntentReceiver
+...</pre><p></p>
+ </section>
+
+<h3 id="device-thrashing">设备是否发生系统颠簸?</h3>
+<p>要确定设备是否发生<a href="https://en.wikipedia.org/wiki/Thrashing_(computer_science)">系统颠簸</a>,请检查 <code>am_proc_died</code> 和 <code>am_proc_start</code> 前后在短时间内是否出现活动异常增加。</p>
+
+ <section class="expandable">
+ <h4 class="showalways">显示示例</h4>
+ <p></p><pre>grep -e "am_proc_died" -e "am_proc_start" bugreport-2015-10-01-18-13-48.txt
+10-01 18:07:06.494 4600 9696 I am_proc_died: [0,20074,com.android.musicfx]
+10-01 18:07:06.555 4600 6606 I am_proc_died: [0,31166,com.concur.breeze]
+10-01 18:07:06.566 4600 14112 I am_proc_died: [0,18812,com.google.android.apps.fitness]
+10-01 18:07:07.018 4600 7513 I am_proc_start: [0,20361,10113,com.sony.playmemories.mobile,broadcast,com.sony.playmemories.mobile/.service.StartupReceiver]
+10-01 18:07:07.357 4600 4614 I am_proc_start: [0,20381,10056,com.google.android.talk,service,com.google.android.talk/com.google.android.libraries.hangouts.video.CallService]
+10-01 18:07:07.784 4600 4612 I am_proc_start: [0,20402,10190,com.andcreate.app.trafficmonitor:loopback_measure_serivce,service,com.andcreate.app.trafficmonitor/.loopback.LoopbackMeasureService]
+10-01 18:07:10.753 4600 5997 I am_proc_start: [0,20450,10097,com.amazon.mShop.android.shopping,broadcast,com.amazon.mShop.android.shopping/com.amazon.identity.auth.device.storage.LambortishClock$ChangeTimestampsBroadcastReceiver]
+10-01 18:07:15.267 4600 6605 I am_proc_start: [0,20539,10173,com.google.android.apps.fitness,service,com.google.android.apps.fitness/.api.services.ActivityUpsamplingService]
+10-01 18:07:15.985 4600 4612 I am_proc_start: [0,20568,10022,com.android.musicfx,broadcast,com.android.musicfx/.ControlPanelReceiver]
+10-01 18:07:16.315 4600 7512 I am_proc_died: [0,20096,com.google.android.GoogleCamera]</pre><p></p>
+ </section>
+
+<h2 id="memory">内存</h2>
+<p>由于 Android 设备的物理内存通常都存在限制,因此管理随机存取存储器 (RAM) 至关重要。错误报告中包含一些用于指示内存不足的指标以及一个提供内存快照的 dumpstate。</p>
+
+<h3 id="low-memory">发现内存不足的情况</h3>
+<p>内存不足可能会导致系统发生颠簸,这是因为虽然内存不足时系统会终止某些进程来释放内存,但又会继续启动其他进程。要查看内存不足的确凿证据,请检查二进制事件日志中 <code>am_proc_died</code> 和 <code>am_proc_start</code> 条目的密集程度。</p>
+
+<p>内存不足还可能会减慢任务切换速度,并且可能会阻止进行返回尝试(因为用户尝试返回到的任务已被终止)。如果启动器被终止,它会在用户触摸主屏幕按钮时重启,并且日志中会显示启动器重新加载其内容。</p>
+
+<h4 id="historical-low-memory">查看历史指标</h4>
+<p>二进制事件日志中的 <code>am_low_memory</code> 条目表示最后一个缓存的进程已终止。在此之后,系统开始终止各项服务。
+
+ </p><section class="expandable">
+ <h4 class="showalways">显示示例</h4>
+ <p></p><pre>grep "am_low_memory" bugreport-2015-10-01-18-13-48.txt
+10-01 18:11:02.219 4600 7513 I am_low_memory: 41
+10-01 18:12:18.526 4600 14112 I am_low_memory: 39
+10-01 18:12:18.874 4600 7514 I am_low_memory: 38
+10-01 18:12:22.570 4600 14112 I am_low_memory: 40
+10-01 18:12:34.811 4600 20319 I am_low_memory: 43
+10-01 18:12:37.945 4600 6521 I am_low_memory: 43
+10-01 18:12:47.804 4600 14110 I am_low_memory: 43</pre><p></p>
+ </section>
+
+<h4 id="thrashing-indicators">查看系统颠簸指标</h4>
+<p>关于系统颠簸(分页、直接回收等)的其他指标包括 <code>kswapd</code>、<code>kworker</code> 和 <code>mmcqd</code> 消耗的 CPU 周期。(请注意,收集错误报告可能会影响系统颠簸指标。)</p>
+
+ <section class="expandable">
+ <h4 class="showalways">显示示例</h4>
+ <p></p><pre>------ CPU INFO (top -n 1 -d 1 -m 30 -t) ------
+
+User 15%, System 54%, IOW 28%, IRQ 0%
+User 82 + Nice 2 + Sys 287 + Idle 1 + IOW 152 + IRQ 0 + SIRQ 5 = 529
+
+ PID TID PR CPU% S VSS RSS PCY UID Thread Proc
+15229 15229 0 19% R 0K 0K fg root kworker/0:2
+29512 29517 1 7% D 1173524K 101188K bg u0_a27 Signal Catcher com.google.android.talk
+24565 24570 3 6% D 2090920K 145168K fg u0_a22 Signal Catcher com.google.android.googlequicksearchbox:search
+19525 19525 2 6% R 3476K 1644K fg shell top top
+24957 24962 2 5% R 1706928K 125716K bg u0_a47 Signal Catcher com.google.android.GoogleCamera
+19519 19519 3 4% S 0K 0K fg root kworker/3:1
+ 120 120 0 3% S 0K 0K fg root mmcqd/1
+18233 18233 1 3% S 0K 0K fg root kworker/1:1
+25589 25594 1 2% D 1270476K 75776K fg u0_a8 Signal Catcher com.google.android.gms
+19399 19399 2 1% S 0K 0K fg root kworker/2:2
+ 1963 1978 1 0% S 1819100K 125136K fg system android.fg system_server
+ 1963 1981 3 0% S 1819100K 125136K fg system android.display system_server</pre><p></p>
+ </section>
+<p></p>
+
+<p>ANR 日志可以提供类似的内存快照。</p>
+
+ <section class="expandable">
+ <h4 class="showalways">显示示例</h4>
+ <p></p><pre>10-03 17:19:59.959 1963 1976 E ActivityManager: ANR in com.google.android.apps.magazines
+10-03 17:19:59.959 1963 1976 E ActivityManager: PID: 18819
+10-03 17:19:59.959 1963 1976 E ActivityManager: Reason: Broadcast of Intent { act=android.net.conn.CONNECTIVITY_CHANGE flg=0x4000010 cmp=com.google.android.apps.magazines/com.google.apps.dots.android.newsstand.appwidget.NewsWidgetProvider (has extras) }
+10-03 17:19:59.959 1963 1976 E ActivityManager: Load: 19.19 / 14.76 / 12.03
+10-03 17:19:59.959 1963 1976 E ActivityManager: CPU usage from 0ms to 11463ms later:
+10-03 17:19:59.959 1963 1976 E ActivityManager: 54% 15229/kworker/0:2: 0% user + 54% kernel
+10-03 17:19:59.959 1963 1976 E ActivityManager: 38% 1963/system_server: 14% user + 23% kernel / faults: 17152 minor 1073 major
+10-03 17:19:59.959 1963 1976 E ActivityManager: 11% 120/mmcqd/1: 0% user + 11% kernel
+10-03 17:19:59.959 1963 1976 E ActivityManager: 10% 2737/com.android.systemui: 4.7% user + 5.6% kernel / faults: 7211 minor 149 major
+10-03 17:19:59.959 1963 1976 E ActivityManager: 0.2% 1451/debuggerd: 0% user + 0.2% kernel / faults: 15211 minor 147 major
+10-03 17:19:59.959 1963 1976 E ActivityManager: 8.7% 6162/com.twofortyfouram.locale: 4% user + 4.7% kernel / faults: 4924 minor 260 major
+10-03 17:19:59.959 1963 1976 E ActivityManager: 6.1% 24565/com.google.android.googlequicksearchbox:search: 2.4% user + 3.7% kernel / faults: 2902 minor 129 major
+10-03 17:19:59.959 1963 1976 E ActivityManager: 6% 55/kswapd0: 0% user + 6% kernel
+10-03 17:19:59.959 1963 1976 E ActivityManager: 4.9% 18819/com.google.android.apps.magazines: 1.5% user + 3.3% kernel / faults: 10129 minor 986 major
+10-03 17:19:59.959 1963 1976 E ActivityManager: 2.8% 18233/kworker/1:1: 0% user + 2.8% kernel
+10-03 17:19:59.959 1963 1976 E ActivityManager: 4.2% 3145/com.android.phone: 2% user + 2.2% kernel / faults: 3005 minor 43 major
+10-03 17:19:59.959 1963 1976 E ActivityManager: 4.2% 8084/com.android.chrome: 2% user + 2.1% kernel / faults: 4798 minor 380 major
+10-03 17:19:59.959 1963 1976 E ActivityManager: 3.4% 182/surfaceflinger: 1.1% user + 2.3% kernel / faults: 842 minor 13 major
+10-03 17:19:59.959 1963 1976 E ActivityManager: 3% 18236/kworker/1:2: 0% user + 3% kernel
+10-03 17:19:59.959 1963 1976 E ActivityManager: 2.9% 19231/com.android.systemui:screenshot: 0.8% user + 2.1% kernel / faults: 6119 minor 348 major
+10-03 17:19:59.959 1963 1976 E ActivityManager: 2.3% 15350/kworker/0:4: 0% user + 2.3% kernel
+10-03 17:19:59.959 1963 1976 E ActivityManager: 2.2% 1454/mediaserver: 0% user + 2.2% kernel / faults: 479 minor 6 major
+10-03 17:19:59.959 1963 1976 E ActivityManager: 2% 16496/com.android.chrome:sandboxed_process10: 0.1% user + 1.8% kernel / faults: 3610 minor 234 major
+10-03 17:19:59.959 1963 1976 E ActivityManager: 1% 3119/com.android.nfc: 0.4% user + 0.5% kernel / faults: 1789 minor 17 major
+10-03 17:19:59.959 1963 1976 E ActivityManager: 1.7% 19337/com.jarettmillard.localeconnectiontype:background: 0.1% user + 1.5% kernel / faults: 7854 minor 439 major
+10-03 17:19:59.959 1963 1976 E ActivityManager: 0.7% 3066/com.google.android.inputmethod.latin: 0.3% user + 0.3% kernel / faults: 1336 minor 7 major
+10-03 17:19:59.959 1963 1976 E ActivityManager: 1% 25589/com.google.android.gms: 0.3% user + 0.6% kernel / faults: 2867 minor 237 major
+10-03 17:19:59.959 1963 1976 E ActivityManager: 0.9% 1460/sensors.qcom: 0.5% user + 0.4% kernel / faults: 262 minor 5 major
+10-03 17:19:59.959 1963 1976 E ActivityManager: 0.8% 3650/mpdecision: 0% user + 0.8% kernel / faults: 160 minor 1 major
+10-03 17:19:59.959 1963 1976 E ActivityManager: 0.1% 3132/com.redbend.vdmc: 0% user + 0% kernel / faults: 1746 minor 5 major</pre><p></p>
+ </section>
+
+<h3 id="memory-snapshot">获取内存快照</h3>
+<p>内存快照是一种 dumpstate,其中会列出正在运行的 Java 进程和本机进程(有关详情,请参阅<a href="https://developer.android.com/tools/debugging/debugging-memory.html#ViewingAllocations">查看整体内存分配</a>)。请注意,快照仅提供特定时刻的状态;在此快照之前,系统的状况可能更好,也可能更糟。</p>
+<ul>
+<li>要了解某个进程的运行时长,请参阅<a href="#process-runtime">进程运行时</a>。</li>
+<li>要了解为什么某个进程当前正在运行,请参阅<a href="#why-is-process-running">某个进程为什么正在运行?</a></li>
+</ul>
+
+ <section class="expandable">
+ <h4 class="showalways">显示示例</h4>
+ <p></p><pre>Total PSS by OOM adjustment:
+ 86752 kB: Native
+ 22645 kB: surfaceflinger (pid 197)
+ 18597 kB: mediaserver (pid 204)
+ ...
+ 136959 kB: System
+ 136959 kB: system (pid 785)
+ 220218 kB: Persistent
+ 138859 kB: com.android.systemui (pid 947 / activities)
+ 39178 kB: com.android.nfc (pid 1636)
+ 28313 kB: com.android.phone (pid 1659)
+ 13868 kB: com.redbend.vdmc (pid 1646)
+ 9534 kB: Persistent Service
+ 9534 kB: com.android.bluetooth (pid 23807)
+ 178604 kB: Foreground
+ 168620 kB: com.google.android.googlequicksearchbox (pid 1675 / activities)
+ 9984 kB: com.google.android.apps.maps (pid 13952)
+ 188286 kB: Visible
+ 85326 kB: com.google.android.wearable.app (pid 1535)
+ 38978 kB: com.google.process.gapps (pid 1510)
+ 31936 kB: com.google.android.gms.persistent (pid 2072)
+ 27950 kB: com.google.android.gms.wearable (pid 1601)
+ 4096 kB: com.google.android.googlequicksearchbox:interactor (pid 1550)
+ 52948 kB: Perceptible
+ 52948 kB: com.google.android.inputmethod.latin (pid 1566)
+ 150851 kB: A Services
+ 81121 kB: com.google.android.gms (pid 1814)
+ 37586 kB: com.google.android.talk (pid 9584)
+ 10949 kB: com.google.android.music:main (pid 4019)
+ 10727 kB: com.motorola.targetnotif (pid 31071)
+ 10468 kB: com.google.android.GoogleCamera (pid 9984)
+ 33298 kB: Previous
+ 33298 kB: com.android.settings (pid 9673 / activities)
+ 165188 kB: B Services
+ 49490 kB: com.facebook.katana (pid 15035)
+ 22483 kB: com.whatsapp (pid 28694)
+ 21308 kB: com.iPass.OpenMobile (pid 5325)
+ 19788 kB: com.google.android.apps.googlevoice (pid 23934)
+ 17399 kB: com.google.android.googlequicksearchbox:search (pid 30359)
+ 9073 kB: com.google.android.apps.youtube.unplugged (pid 21194)
+ 7660 kB: com.iPass.OpenMobile:remote (pid 23754)
+ 7291 kB: com.pujie.wristwear.pujieblack (pid 24240)
+ 7157 kB: com.instagram.android:mqtt (pid 9530)
+ 3539 kB: com.qualcomm.qcrilmsgtunnel (pid 16186)
+ 204324 kB: Cached
+ 43424 kB: com.amazon.mShop.android (pid 13558)
+ 22563 kB: com.google.android.apps.magazines (pid 13844)
+ ...
+ 4298 kB: com.google.android.apps.enterprise.dmagent (pid 13826)</pre><p></p>
+ </section>
+
+<h2 id="broadcasts">广播</h2>
+<p>应用会生成广播,以便在当前应用内发送事件或向其他应用发送事件。广播接收方可以通过过滤器订阅特定消息,以便收听和响应广播。错误报告中包含已发送广播和未发送广播的相关信息,以及关于收听特定广播的所有接收方的 dumpsys。</p>
+
+<h3 id="historical-broadcasts">查看历史广播</h3>
+<p>历史广播是指已发送的广播,按时间逆序排列。</p>
+
+<p><strong>summary</strong>(摘要)部分用于提供最近 300 个前台广播和最近 300 个后台广播的概况。</p>
+
+ <section class="expandable">
+ <h4 class="showalways">显示示例</h4>
+ <p></p><pre> Historical broadcasts summary [foreground]:
+ #0: act=android.intent.action.SCREEN_ON flg=0x50000010
+ +1ms dispatch +90ms finish
+ enq=2015-10-29 17:10:51 disp=2015-10-29 17:10:51 fin=2015-10-29 17:10:51
+ #1: act=android.intent.action.SCREEN_OFF flg=0x50000010
+ 0 dispatch +60ms finish
+ enq=2015-10-29 17:10:05 disp=2015-10-29 17:10:05 fin=2015-10-29 17:10:05
+ ...
+ Historical broadcasts summary [background]:
+ ...</pre><p></p>
+ </section>
+<p></p>
+
+<p><strong>detail</strong>(详情)部分包含最近 50 个前台广播和最近 50 个后台广播的完整信息,以及每个广播的接收方。</p>
+<ul>
+<li>具有 <code>BroadcastRecord</code> 条目的接收方是在运行时注册的,并且只会被发送到已在运行的进程。</li>
+<li>具有 <code>ResolveInfo</code> 条目的接收方是通过清单条目注册的。ActivityManager 会为每个 <code>ResolveInfo</code> 启动相应进程(如果相应进程尚未在运行)。</li>
+</ul>
+
+ <section class="expandable">
+ <h4 class="showalways">显示示例</h4>
+ <p></p><pre>Historical broadcasts [foreground]:
+ ...
+ Historical broadcasts [background]:
+ Historical Broadcast background #0:
+ ...
+ Historical Broadcast background #5:
+ BroadcastRecord{18dbb16 u0 android.intent.action.USER_PRESENT} to user 0
+ Intent { act=android.intent.action.USER_PRESENT flg=0x24000010 }
+ caller=com.android.systemui 2925:com.android.systemui/u0a27 pid=2925 uid=10027
+ enqueueClockTime=2015-10-29 17:10:55 dispatchClockTime=2015-10-29 17:10:55
+ dispatchTime=-2s321ms (0 since enq) finishTime=-2s320ms (+1ms since disp)
+ Receiver #0: BroadcastFilter{8181cc1 u-1 ReceiverList{5d929a8 902 system/1000/u-1 local:eca4dcb}}
+ Receiver #1: BroadcastFilter{6371c97 u-1 ReceiverList{2938b16 902 system/1000/u-1 local:840b831}}
+ ...
+ Receiver #19: BroadcastFilter{93f16b u0 ReceiverList{5c61eba 17016 com.google.android.gm/10079/u0 remote:24083e5}}
+ ...
+ Historical Broadcast background #37:
+ BroadcastRecord{7f6dd6 u0 android.hardware.action.NEW_PICTURE} to user 0
+ Intent { act=android.hardware.action.NEW_PICTURE dat=content://media/external/images/media/6345 flg=0x10 }
+ caller=com.google.android.GoogleCamera 32734:com.google.android.GoogleCamera/u0a53 pid=32734 uid=10053
+ enqueueClockTime=2015-10-29 17:09:48 dispatchClockTime=2015-10-29 17:09:49
+ dispatchTime=-45s720ms (+399ms since enq) finishTime=-45s701ms (+19ms since disp)
+ resultTo=null resultCode=0 resultData=null
+ nextReceiver=4 receiver=null
+ Receiver #0: ResolveInfo{33d2857 com.google.android.gms/com.google.android.libraries.social.mediamonitor.MediaMonitor m=0x608000}
+ priority=0 preferredOrder=0 match=0x608000 specificIndex=-1 isDefault=false
+ ActivityInfo:
+ name=com.google.android.libraries.social.mediamonitor.MediaMonitor
+ packageName=com.google.android.gms
+ enabled=true exported=true processName=com.google.android.gms
+ ...
+ Receiver #1: ResolveInfo{d9edf44 com.google.android.apps.maps/com.google.android.apps.gmm.ugc.clientnotification.StartPhotoTakenNotifierServiceReceiver m=0x608000}
+ priority=0 preferredOrder=0 match=0x608000 specificIndex=-1 isDefault=false
+ ActivityInfo:
+ name=com.google.android.apps.gmm.ugc.clientnotification.StartPhotoTakenNotifierServiceReceiver
+ packageName=com.google.android.apps.maps
+ enabled=true exported=true processName=com.google.android.apps.maps
+ ...
+ Receiver #2: ResolveInfo{743f82d com.google.android.apps.photos/com.google.android.libraries.social.mediamonitor.MediaMonitor m=0x608000}
+ priority=0 preferredOrder=0 match=0x608000 specificIndex=-1 isDefault=false
+ ActivityInfo:
+ name=com.google.android.libraries.social.mediamonitor.MediaMonitor
+ packageName=com.google.android.apps.photos
+ enabled=true exported=true processName=com.google.android.apps.photos
+ ...
+ Receiver #3: ResolveInfo{d5c9162 com.google.android.apps.plus/com.google.android.libraries.social.mediamonitor.MediaMonitor m=0x608000}
+ priority=0 preferredOrder=0 match=0x608000 specificIndex=-1 isDefault=false
+ ActivityInfo:
+ name=com.google.android.libraries.social.mediamonitor.MediaMonitor
+ packageName=com.google.android.apps.plus
+ enabled=true exported=true processName=com.google.android.apps.plus
+ ...</pre><p></p>
+ </section>
+
+<h3 id="active-broadcasts">查看待发送的广播</h3>
+<p>待发送的广播是指尚未发送的广播。如果队列中存在大量广播,则意味着系统无法足够快地发送广播来跟上进度。</p>
+
+ <section class="expandable">
+ <h4 class="showalways">显示示例</h4>
+ <p></p><pre> Active ordered broadcasts [background]:
+ Active Ordered Broadcast background #133: <i>// size of queue</i>
+ ...</pre><p></p>
+ </section>
+
+<h3 id="broadcast-listeners">查看广播收听方</h3>
+<p>要查看收听某个广播的接收方列表,请查看 <code>dumpsys activity broadcasts</code> 中的 Receiver Resolver Table。以下示例显示了收听 <code>USER_PRESENT</code> 的所有接收方。</p>
+
+ <section class="expandable">
+ <h4 class="showalways">显示示例</h4>
+ <p></p><pre>-------------------------------------------------------------------------------
+ACTIVITY MANAGER BROADCAST STATE (dumpsys activity broadcasts)
+..
+ Receiver Resolver Table:
+ Full MIME Types:
+ ..
+ Wild MIME Types:
+ ..
+ Schemes:
+ ..
+ Non-Data Actions:
+ ..
+ android.intent.action.USER_PRESENT:
+ BroadcastFilter{8181cc1 u-1 ReceiverList{5d929a8 902 system/1000/u-1 local:eca4dcb}}
+ BroadcastFilter{6371c97 u-1 ReceiverList{2938b16 902 system/1000/u-1 local:840b831}}
+ BroadcastFilter{320c00 u0 ReceiverList{d3a6283 902 system/1000/u0 local:799c532}}
+ BroadcastFilter{e486048 u0 ReceiverList{36fbaeb 902 system/1000/u0 local:5f51e3a}}
+ BroadcastFilter{22b02 u-1 ReceiverList{b3f744d 902 system/1000/u-1 local:de837e4}}
+ BroadcastFilter{3e989ab u0 ReceiverList{f8deffa 2981 com.google.process.gapps/10012/u0 remote:26bd225}}
+ BroadcastFilter{fb56150 u0 ReceiverList{22b7b13 2925 com.android.systemui/10027/u0 remote:c54a602}}
+ BroadcastFilter{63bbb6 u-1 ReceiverList{ba6c751 3484 com.android.nfc/1027/u-1 remote:5c4a478}}
+ BroadcastFilter{95ad20d u0 ReceiverList{d8374a4 3586 com.google.android.googlequicksearchbox/10029/u0 remote:feb3737}}
+ BroadcastFilter{fdef551 u0 ReceiverList{28ca78 3745 com.google.android.gms.persistent/10012/u0 remote:f23afdb}}
+ BroadcastFilter{9830707 u0 ReceiverList{aabd946 3745 com.google.android.gms.persistent/10012/u0 remote:a4da121}}
+ BroadcastFilter{83c43d2 u0 ReceiverList{d422e5d 3745 com.google.android.gms.persistent/10012/u0 remote:f585034}}
+ BroadcastFilter{8890378 u0 ReceiverList{26d2cdb 3745 com.google.android.gms.persistent/10012/u0 remote:dfa61ea}}
+ BroadcastFilter{7bbb7 u0 ReceiverList{214b2b6 3745 com.google.android.gms.persistent/10012/u0 remote:8353a51}}
+ BroadcastFilter{38d3566 u0 ReceiverList{de859c1 3745 com.google.android.gms.persistent/10012/u0 remote:e003aa8}}
+ BroadcastFilter{3435d9f u0 ReceiverList{6e38b3e 3745 com.google.android.gms.persistent/10012/u0 remote:8dd7ff9}}
+ BroadcastFilter{d0a34bb u0 ReceiverList{5091d4a 3745 com.google.android.gms.persistent/10012/u0 remote:d6d22b5}}
+ BroadcastFilter{d43c416 u0 ReceiverList{51a3531 3745 com.google.android.gms.persistent/10012/u0 remote:d0b9dd8}}
+ BroadcastFilter{aabf36d u0 ReceiverList{a88bf84 3745 com.google.android.gms.persistent/10012/u0 remote:a9d6197}}
+ BroadcastFilter{93f16b u0 ReceiverList{5c61eba 17016 com.google.android.gm/10079/u0 remote:24083e5}}
+ BroadcastFilter{68f794e u0 ReceiverList{4cb1c49 947 com.google.android.googlequicksearchbox:search/10029/u0 remote:251d250}}
+ ..
+ MIME Typed Actions:</pre><p></p>
+ </section>
+
+<h2 id="monitor contention">显示器争用</h2>
+<p>显示器争用日志记录有时可以表明实际的显示器争用情况,但通常情况下会表明系统负载过重,从而导致所有进程都变慢了。您可能会在系统日志或事件日志中看到 ART 记录的长时间占用显示器的事件。</p>
+
+<p>在系统日志中:</p>
+<p></p><pre>10-01 18:12:44.343 29761 29914 W art : Long monitor contention event with owner method=void android.database.sqlite.SQLiteClosable.acquireReference() from SQLiteClosable.java:52 waiters=0 for 3.914s</pre><p></p>
+
+<p>在事件日志中:</p>
+<p></p><pre>10-01 18:12:44.364 29761 29914 I dvm_lock_sample: [com.google.android.youtube,0,pool-3-thread-9,3914,ScheduledTaskMaster.java,138,SQLiteClosable.java,52,100]</pre><p></p>
+
+<h2 id="background-compilation">后台编译</h2>
+<p>编译可能会占用大量资源,而且会加重设备负载。</p>
+
+ <section class="expandable">
+ <h4 class="showalways">显示示例</h4>
+ <p></p><pre>09-14 06:27:05.670 2508 2587 E ActivityManager: CPU usage from 0ms to 5857ms later:
+09-14 06:27:05.670 2508 2587 E ActivityManager: 84% 5708/dex2oat: 81% user + 2.3% kernel / faults: 3731 minor 1 major
+09-14 06:27:05.670 2508 2587 E ActivityManager: 73% 2508/system_server: 21% user + 51% kernel / faults: 10019 minor 28 major
+09-14 06:27:05.670 2508 2587 E ActivityManager: 1% 3935/com.android.phone: 0.3% user + 0.6% kernel / faults: 2684 minor 2 major</pre><p></p>
+ </section>
+<p></p>
+
+<p>下载 Google Play 商店更新时,编译可能会在后台进行。在这种情况下,来自 Google Play 商店应用 (<code>finsky</code>) 和 <code>installd</code> 的消息会显示在 <code>dex2oat</code> 消息之前。</p>
+
+ <section class="expandable">
+ <h4 class="showalways">显示示例</h4>
+ <p></p><pre>10-07 08:42:33.725 11051 11051 D Finsky : [1] InstallerTask.advanceState: Prepare to patch com.garmin.android.apps.virb (com.garmin.android.apps.virb) from content://downloads/my_downloads/3602 format 2
+10-07 08:42:33.752 495 495 I installd: free_cache(48637657) avail 15111192576
+…
+10-07 08:42:39.998 2497 2567 I PackageManager.DexOptimizer: Running dexopt (dex2oat) on: /data/app/vmdl436577137.tmp/base.apk pkg=com.garmin.android.apps.virb isa=arm vmSafeMode=false debuggable=false oatDir = /data/app/vmdl436577137.tmp/oat bootComplete=true
+…</pre><p></p>
+ </section>
+<p></p>
+
+<p>当某个应用正在加载尚未编译的 dex 文件时,编译也可能会在后台进行。在这种情况下,您将看不到 <code>finsky</code> 或 <code>installd</code> 日志记录。</p>
+
+ <section class="expandable">
+ <h4 class="showalways">显示示例</h4>
+ <p></p><pre>09-14 07:29:20.433 15736 15736 I dex2oat : /system/bin/dex2oat -j4 --dex-file=/data/user/0/com.facebook.katana/app_secondary_program_dex/program-72cef82b591768306676e10161c886b58b34315a308602be.dex.jar --oat-file=/data/user/0/com.facebook.katana/app_secondary_program_dex_opt/program-72cef82b591768306676e10161c886b58b34315a308602be.dex.dex
+...
+09-14 07:29:25.102 15736 15736 I dex2oat : dex2oat took 4.669s (threads: 4) arena alloc=7MB java alloc=3MB native alloc=29MB free=4MB</pre><p></p>
+ </section>
+
+<h2 id="narrative">叙述</h2>
+<p>创建问题叙述(如何开始、发生了什么、系统是如何应对的)需要一个固定的事件时间轴。您可以利用错误报告中的信息来同步多个日志中的时间轴并确定错误报告的确切时间戳。</p>
+
+<h3 id="timelines">同步时间轴</h3>
+<p>错误报告会反映多个并行时间轴(系统日志、事件日志、内核日志)以及针对广播、电池统计信息等的多个专用时间轴。遗憾的是,系统通常会使用不同的时间基准来报告时间轴。</p>
+
+<p>系统日志时间戳和事件日志时间戳采用用户所用的时区(与大多数其他时间戳一样)。例如,当用户点按主屏幕按钮时,系统日志会报告以下内容:</p>
+<p></p><pre>10-03 17:19:52.939 1963 2071 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 cmp=com.google.android.googlequicksearchbox/com.google.android.launcher.GEL (has extras)} from uid 1000 on display 0</pre><p></p>
+
+<p>对于上述操作,事件日志会报告以下内容:</p>
+<p></p><pre>10-03 17:19:54.279 1963 2071 I am_focused_activity: [0,com.google.android.googlequicksearchbox/com.google.android.launcher.GEL]</pre><p></p>
+
+<p>内核 (<code>dmesg</code>) 日志采用不同的时间基准,按距离引导加载程序完成的时间来标记日志内容(以秒为单位)。要按照其他时间表的时间基准记录此时间表,请搜索“suspend exit”(暂停退出)和“suspend entry”(暂停进入)消息。<em></em><em></em></p>
+<p></p><pre>&lt;6&gt;[201640.779997] PM: suspend exit 2015-10-03 19:11:06.646094058 UTC
+…
+&lt;6&gt;[201644.854315] PM: suspend entry 2015-10-03 19:11:10.720416452 UTC</pre><p></p>
+
+<p>由于内核日志在暂停状态下可能不会包含时间,因此您应该分段记录暂停进入和暂停退出消息之间的日志。此外,内核日志使用 UTC 时区,您必须将其调整为用户时区。</p>
+
+<h3 id="time-of-bugreport">确定错误报告的生成时间</h3>
+<p>要确定错误报告的生成时间,请先查看系统日志 (Logcat) 中的 <code>dumpstate: begin</code>:</p>
+<p></p><pre>10-03 17:19:54.322 19398 19398 I dumpstate: begin</pre><p></p>
+
+<p>接下来,查看内核日志 (<code>dmesg</code>) 时间戳中的 <code>Starting service
+'bugreport'</code> 消息:</p>
+<p></p><pre>&lt;5&gt;[207064.285315] init: Starting service 'bugreport'...</pre><p></p>
+
+<p>进行逆向推算以关联这两个事件,同时牢记<a href="#timelines">同步时间轴</a>中提到的注意事项。尽管在初始化错误报告之后发生了很多活动,但大多数活动并不是非常有用,因为生成错误报告这一活动会大大加重系统负载。</p>
+
+<h2 id="power">电源</h2>
+
+<p>事件日志中包含屏幕电源状态,其中 0 表示屏幕关闭,1 表示屏幕打开,2 表示已锁屏。</p>
+
+ <section class="expandable">
+ <h4 class="showalways">显示示例</h4>
+ <p></p><pre>grep screen_toggled bugreport-2015-10-18-16-52-22.txt
+10-18 15:05:04.383 992 992 I screen_toggled: 1
+10-18 15:05:07.010 992 992 I screen_toggled: 0
+10-18 15:23:15.063 992 992 I screen_toggled: 1
+10-18 15:23:25.684 992 992 I screen_toggled: 0
+10-18 15:36:31.623 992 992 I screen_toggled: 1
+10-18 15:36:37.660 3283 3283 I screen_toggled: 2</pre><p></p>
+ </section>
+
+<p></p>
+<p>错误报告中还包含关于唤醒锁的统计信息,唤醒锁是应用开发者采用的一种机制,用于表明其应用需要设备保持开启状态。(要详细了解唤醒锁,请参阅 <a href="https://developer.android.com/reference/android/os/PowerManager.WakeLock.html">PowerManager.WakeLock</a> 和<a href="https://developer.android.com/training/scheduling/wakelock.html#cpu">使 CPU 保持运行状态</a>。)
+
+</p><p>唤醒锁总时长统计信息<strong>仅</strong>跟踪唤醒锁实际负责使设备保持唤醒状态的时间,<strong>不</strong>包括屏幕处于开启状态的时间。此外,如果同时持有多个唤醒锁,系统会在它们之间分配唤醒锁时长。</p>
+
+<p>如需直观呈现电源状态方面的更多帮助,请使用 <a href="https://github.com/google/battery-historian">Battery Historian</a>(一种 Google 开放源代码工具,能够利用 Android 错误报告文件分析电池消耗进程)。</p>
+
+<h2 id="packages">程序包</h2>
+<p>“DUMP OF SERVICE”程序包中包含应用版本(以及其他实用信息)。</p>
+
+ <section class="expandable">
+ <h4 class="showalways">显示示例</h4>
+ <p></p><pre>...
+Packages:
+...
+ Package [com.google.android.gms] (3cf534b):
+ userId=10013
+ sharedUser=SharedUserSetting{98f3d28 com.google.uid.shared/10013}
+ pkg=Package{b8f6a41 com.google.android.gms}
+ codePath=/system/priv-app/PrebuiltGmsCore
+ resourcePath=/system/priv-app/PrebuiltGmsCore
+ legacyNativeLibraryDir=/system/priv-app/PrebuiltGmsCore/lib
+ primaryCpuAbi=arm64-v8a
+ secondaryCpuAbi=armeabi-v7a
+ versionCode=8186448 targetSdk=23
+ versionName=8.1.86 (2287566-448)
+ splits=[base]
+ applicationInfo=ApplicationInfo{5158507 com.google.android.gms}
+ flags=[ SYSTEM HAS_CODE ALLOW_CLEAR_USER_DATA ]
+ privateFlags=[ PRIVILEGED ]
+ dataDir=/data/user/0/com.google.android.gms
+ supportsScreens=[small, medium, large, xlarge, resizeable, anyDensity]
+ libraries:
+ com.google.android.gms
+ usesOptionalLibraries:
+ com.android.location.provider
+ com.google.android.ble
+ com.android.media.remotedisplay
+ usesLibraryFiles:
+ /system/framework/com.android.media.remotedisplay.jar
+ /system/framework/com.android.location.provider.jar
+ timeStamp=2015-10-14 15:17:56
+ firstInstallTime=2015-09-22 14:08:35
+ lastUpdateTime=2015-10-14 15:17:56
+ signatures=PackageSignatures{db63be6 [1af63d8]}
+ installPermissionsFixed=true installStatus=1
+ pkgFlags=[ SYSTEM HAS_CODE ALLOW_CLEAR_USER_DATA ]
+ declared permissions:
+ com.google.android.gms.permission.INTERNAL_BROADCAST: prot=signature, INSTALLED
+ ...
+ com.google.android.gms.permission.CAR_VENDOR_EXTENSION: prot=dangerous, INSTALLED
+ User 0: installed=true hidden=false stopped=false notLaunched=false enabled=0
+ disabledComponents:
+ com.google.android.gms.icing.service.PowerConnectedReceiver
+ ...
+ com.google.android.gms.icing.proxy.AppsMonitor
+ enabledComponents:
+ com.google.android.gms.mdm.receivers.GmsRegisteredReceiver
+ ...
+ com.google.android.gms.subscribedfeeds.SyncService</pre><p></p>
+ </section>
+
+<h2 id="processes">进程</h2>
+<p>错误报告中包含大量的进程数据,例如启动和停止时间、运行时时长、相关服务、<code>oom_adj</code> 得分等。要详细了解 Android 如何管理进程,请参阅<a href="http://developer.android.com/guide/components/processes-and-threads.html">进程和线程</a>。</p>
+
+<h3 id="process-runtime">确定进程运行时</h3>
+<p><code>procstats</code> 部分包含有关进程及相关服务已运行时长的完整统计信息。要快速获得便于用户阅读的摘要,请搜索 <code>AGGREGATED OVER</code> 以查看最近 3 个小时或 24 个小时的数据,然后搜索 <code>Summary:</code> 以查看进程列表、这些进程已以各种优先级运行的时长,以及它们使用 RAM 的情况(格式为“最小-平均-最大 PSS”/“最小-平均-最大 USS”)。</p>
+
+ <section class="expandable">
+ <h4 class="showalways">显示示例</h4>
+ <p></p><pre>-------------------------------------------------------------------------------
+DUMP OF SERVICE processinfo:
+-------------------------------------------------------------------------------
+DUMP OF SERVICE procstats:
+COMMITTED STATS FROM 2015-10-19-23-54-56 (checked in):
+...
+COMMITTED STATS FROM 2015-10-20-03-00-00 (checked in):
+...
+CURRENT STATS:
+...
+AGGREGATED OVER LAST 24 HOURS:
+System memory usage:
+...
+Per-Package Stats:
+...
+Summary:
+...
+ * com.google.android.gms.persistent / u0a13 / v8186448:
+ TOTAL: 100% (21MB-27MB-40MB/20MB-24MB-38MB over 597)
+ Top: 51% (22MB-26MB-38MB/21MB-24MB-36MB over 383)
+ Imp Fg: 49% (21MB-27MB-40MB/20MB-25MB-38MB over 214)
+…
+ Start time: 2015-10-19 09:14:37
+ Total elapsed time: +1d0h22m7s390ms (partial) libart.so
+
+AGGREGATED OVER LAST 3 HOURS:
+System memory usage:
+...
+Per-Package Stats:
+...
+Summary:
+ * com.google.android.gms.persistent / u0a13 / v8186448:
+ TOTAL: 100% (23MB-27MB-32MB/21MB-25MB-29MB over 111)
+ Top: 61% (23MB-26MB-31MB/21MB-24MB-28MB over 67)
+ Imp Fg: 39% (23MB-28MB-32MB/21MB-26MB-29MB over 44)
+...
+ Start time: 2015-10-20 06:49:24
+ Total elapsed time: +2h46m59s736ms (partial) libart.so</pre><p></p>
+ </section>
+
+<h3 id="why-is-process-running">某个进程为什么正在运行?</h3>
+<p><code>dumpsys activity processes</code> 部分会列出当前正在运行的所有进程,并按 <code>oom_adj</code> 得分排序(Android 通过为进程分配 <code>oom_adj</code> 值来表明进程的重要性,该值可由 ActivityManager 动态更新)。这种输出类似于<a href="#memory-snapshot">内存快照</a>的输出,但包含有关是什么导致进程运行的更多信息。在以下示例中,以粗体显示的条目表明 <code>gms.persistent</code> 进程正在以 <code>vis</code>(可见)优先级运行,因为该系统进程已经与其 <code>NetworkLocationService</code> 绑定。</p>
+
+ <section class="expandable">
+ <h4 class="showalways">显示示例</h4>
+ <p></p><pre>-------------------------------------------------------------------------------
+ACTIVITY MANAGER RUNNING PROCESSES (dumpsys activity processes)
+...
+Process LRU list (sorted by oom_adj, 34 total, non-act at 14, non-svc at 14):
+ PERS #33: sys F/ /P trm: 0 902:system/1000 (fixed)
+ PERS #32: pers F/ /P trm: 0 2925:com.android.systemui/u0a27 (fixed)
+ PERS #31: pers F/ /P trm: 0 3477:com.quicinc.cne.CNEService/1000 (fixed)
+ PERS #30: pers F/ /P trm: 0 3484:com.android.nfc/1027 (fixed)
+ PERS #29: pers F/ /P trm: 0 3502:com.qualcomm.qti.rcsbootstraputil/1001 (fixed)
+ PERS #28: pers F/ /P trm: 0 3534:com.qualcomm.qti.rcsimsbootstraputil/1001 (fixed)
+ PERS #27: pers F/ /P trm: 0 3553:com.android.phone/1001 (fixed)
+ Proc #25: psvc F/ /IF trm: 0 4951:com.android.bluetooth/1002 (service)
+ com.android.bluetooth/.hfp.HeadsetService&lt;=Proc{902:system/1000}
+ Proc # 0: fore F/A/T trm: 0 3586:com.google.android.googlequicksearchbox/u0a29 (top-activity)
+ Proc #26: vis F/ /SB trm: 0 3374:com.google.android.googlequicksearchbox:interactor/u0a29 (service)
+ com.google.android.googlequicksearchbox/com.google.android.voiceinteraction.GsaVoiceInteractionService&lt;=Proc{902:system/1000}
+<b> Proc # 5: vis F/ /T trm: 0 3745:com.google.android.gms.persistent/u0a12 (service)</b>
+<b> com.google.android.gms/com.google.android.location.network.NetworkLocationService&lt;=Proc{902:system/1000}</b>
+ Proc # 3: vis F/ /SB trm: 0 3279:com.google.android.gms/u0a12 (service)
+ com.google.android.gms/.icing.service.IndexService&lt;=Proc{947:com.google.android.googlequicksearchbox:search/u0a29}
+ Proc # 2: vis F/ /T trm: 0 947:com.google.android.googlequicksearchbox:search/u0a29 (service)
+ com.google.android.googlequicksearchbox/com.google.android.sidekick.main.remoteservice.GoogleNowRemoteService&lt;=Proc{3586:com.google.android.googlequicksearchbox/u0a29}
+ Proc # 1: vis F/ /T trm: 0 2981:com.google.process.gapps/u0a12 (service)
+ com.google.android.gms/.tapandpay.hce.service.TpHceService&lt;=Proc{3484:com.android.nfc/1027}
+ Proc #11: prcp B/ /IB trm: 0 3392:com.google.android.inputmethod.latin/u0a64 (service)
+ com.google.android.inputmethod.latin/com.android.inputmethod.latin.LatinIME&lt;=Proc{902:system/1000}
+ Proc #24: svc B/ /S trm: 0 27071:com.google.android.music:main/u0a67 (started-services)
+ Proc #22: svc B/ /S trm: 0 853:com.qualcomm.qcrilmsgtunnel/1001 (started-services)
+ Proc # 4: prev B/ /LA trm: 0 32734:com.google.android.GoogleCamera/u0a53 (previous)
+ Proc #23: svcb B/ /S trm: 0 671:com.qualcomm.telephony/1000 (started-services)
+ Proc #20: cch B/ /CE trm: 0 27659:com.android.providers.calendar/u0a2 (provider)
+ com.android.providers.calendar/.CalendarProvider2&lt;=Proc{27697:com.google.android.calendar/u0a40}
+ Proc #13: cch B/ /CE trm: 0 653:com.google.android.gms.wearable/u0a12 (cch-empty)
+ Proc #10: cch B/ /S trm: 0 4067:com.google.android.talk/u0a62 (cch-started-ui-services)
+ Proc # 7: cch B/ /S trm: 0 18868:com.google.corp.huddle.android/u0a95 (cch-started-ui-services)
+ Proc # 6: cch B/ /CA trm: 0 27697:com.google.android.calendar/u0a40 (cch-act)
+ Proc # 8: cch+1 B/ /CA trm: 0 25675:com.google.android.apps.genie.geniewidget/u0a81 (cch-act)
+ Proc #16: cch+2 B/ /CE trm: 0 1272:com.google.android.keep/u0a106 (cch-empty)
+ Proc #15: cch+2 B/ /CE trm: 0 885:android.process.media/u0a9 (cch-empty)
+ Proc #14: cch+2 B/ /CE trm: 0 15146:android.process.acore/u0a3 (cch-empty)
+ Proc # 9: cch+3 B/ /CA trm: 0 17016:com.google.android.gm/u0a79 (cch-act)
+ Proc #19: cch+4 B/ /CE trm: 0 973:com.google.android.apps.maps/u0a66 (cch-empty)
+ Proc #18: cch+4 B/ /CE trm: 0 1091:com.google.android.apps.photos/u0a71 (cch-empty)
+ Proc #17: cch+4 B/ /CE trm: 0 1141:com.google.android.apps.plus/u0a74 (cch-empty)
+ Proc #12: cch+5 B/ /CA trm: 0 22299:com.google.android.apps.dogfood/u0a105 (cch-act)
+ Proc #21: cch+6 B/ /CE trm: 0 995:com.google.android.partnersetup/u0a18 (cch-empty)&gt;</pre><p></p>
+ </section>
+
+<h2 id="scans">扫描</h2>
+<p>您可以按照以下步骤来确定过度执行蓝牙低功耗 (BLE) 扫描的应用:</p>
+<ul>
+<li>查找 <code>BluetoothLeScanner</code> 的日志消息:<pre>
+$ grep 'BluetoothLeScanner' ~/downloads/bugreport.txt
+07-28 15:55:19.090 24840 24851 D BluetoothLeScanner: onClientRegistered() - status=0 clientIf=5
+</pre></li>
+<li>在日志消息中找到 PID。在此示例中,“24840”和“24851”分别为 PID(进程 ID)和 TID(线程 ID)。</li>
+<li>找到与该 PID 关联的应用:<pre>
+PID #24840: ProcessRecord{4fe996a 24840:com.badapp/u0a105}
+</pre>
+<p>在此示例中,程序包名称为 <code>com.badapp</code>。</p></li>
+<li>在 Google Play 上查找该程序包名称,以找出相应的应用:<strong>https://play.google.com/store/apps/details?id=com.badapp</strong>。</li>
+</ul>
+<p class="note"><strong>注意</strong>:对于运行 Android 7.0 的设备,系统会收集 BLE 扫描数据,并会将这些活动与初始应用相关联。有关详情,请参阅<a href="/devices/tech/power/values.html#le-bt-scans">低功耗 (LE) 和蓝牙扫描</a>。</p>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/report-bugs.html b/zh-cn/source/report-bugs.html
new file mode 100644
index 00000000..ddaf61ee
--- /dev/null
+++ b/zh-cn/source/report-bugs.html
@@ -0,0 +1,53 @@
+<html devsite><head>
+ <title>报告错误</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>感谢您对 Android 的关注!您可以帮助我们改进 Android 的最佳方式之一就是向我们报告您发现的任何问题。</p>
+<p class="note"><strong>注意</strong>:对于安全漏洞,请使用 AOSP 错误跟踪工具<a href="https://code.google.com/p/android/issues/entry?template=Security%20bug%20report">安全错误报告</a>模板。如需了解详情,请参阅<a href="/security/overview/updates-resources.html#report-issues">报告安全问题</a>。</p>
+<p>下面说明了如何报告<strong>非安全</strong>方面的错误:</p>
+<ul>
+<li>
+<p><a href="https://code.google.com/p/android/issues/advsearch">搜索您的错误</a>,看看是否有人已报告过该错误。请记得在所有问题(而不仅仅是尚未解决的问题)中搜索,因为可能有用户已经报告过您的问题并且该问题已被关闭。要找到最热门的结果,请按收到的星数为结果排序。</p>
+</li>
+<li>
+<p>如果您找到了所遇到的问题并且该问题对您来说很重要,请为其加注星标!这样我们就知道要着重修复哪些错误。</p>
+</li>
+<li>
+<p>如果没有人报告过您的错误,请提交该错误。您可以使用以下模板之一:</p>
+<ul>
+<li>
+<p><a href="https://code.google.com/p/android/issues/entry?template=User%20bug%20report">您设备中的错误</a> - 如果您是一名用户并且要报告您自己设备中的错误,请使用此模板</p>
+</li>
+<li>
+<p><a href="https://code.google.com/p/android/issues/entry?template=Developer%20bug%20report">软件中的错误</a> - 如果您在开发应用的过程中发现错误,请使用此模板</p>
+</li>
+<li>
+<p><a href="https://code.google.com/p/android/issues/entry?template=Feature%20request">功能请求</a> - 您可使用此模板提交您希望在未来的版本中看到的功能</p>
+</li>
+</ul>
+</li>
+</ul>
+<p>请注意,问题跟踪工具不是用户支持论坛。它列出了待解决的技术任务、这些任务的相关信息以及有关这些任务处理进度的信息,包括哪些任务在短期内可能得到处理。</p>
+<p>此问题跟踪工具仅限用于 Android 开放源代码项目。与零售设备(特别是 Nexus 之外的设备)相关的问题需要通过这些设备的支持渠道来报告。非 AOSP 应用的相关问题需要由这些应用的开发者报告;Google 应用也遵循此要求。</p>
+<p>请注意,我们无法保证可以在任何特定版本中修复任何特定错误。要了解在您报告错误之后会出现什么情况,请阅读<a href="life-of-a-bug.html">错误的生命周期</a>。</p>
+<p>一般情况下,请尽量提供详尽的错误信息。仅仅用一句话告诉我们某些方面存在问题通常不起任何作用,而且问题可能未经任何处理就会被关闭。您提供的详细信息越多,您的问题就越有可能得到解决。</p>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/requirements.html b/zh-cn/source/requirements.html
new file mode 100644
index 00000000..a6fbf476
--- /dev/null
+++ b/zh-cn/source/requirements.html
@@ -0,0 +1,95 @@
+<html devsite><head>
+ <title>要求</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>下载和编译 Android 源代码之前,请先确保您的系统符合以下要求。然后,请参阅<a href="initializing.html">构建编译环境</a>,查看适用于相应操作系统的安装说明。</p>
+
+<h2 id="hardware-requirements">硬件要求</h2>
+
+<p>您的开发工作站必须达到或超出以下硬件要求:</p>
+
+<ul>
+
+ <li>如果是 Gingerbread (2.3.x) 及更高版本(包括 master 分支),需要使用 64 位环境。如果是较低的版本,则可以在 32 位系统中进行编译。
+ </li>
+
+ <li>如果是进行校验,至少需要 100GB 可用磁盘空间;如果是进行单次编译,至少需要 150GB 可用磁盘空间;如果是进行多次编译,至少需要 200GB 或更多可用磁盘空间。如果您使用 ccache,则需要更多空间。<p></p>
+ </li>
+
+ <li>如果您在虚拟机中运行 Linux,则至少需要 16GB 的 RAM/交换空间。
+ </li>
+
+</ul>
+
+<h2 id="software-requirements">软件要求</h2>
+
+<p><a href="https://android.googlesource.com/">Android 开放源代码项目 (AOSP)</a> <code>master</code> 分支历来是在 Ubuntu Long Term Support (LTS) 版本中进行开发和测试,但您也可以使用其他 Ubuntu 分发版本。要查看建议使用的版本,请参阅下面的列表。</p>
+
+<p>您的工作站必须具有下面列出的软件。要查看所需的其他程序包以及用于安装这些程序包的命令,请参阅<a href="initializing.html">构建编译环境</a>。</p>
+
+<h3 id="operating-system">操作系统</h3>
+
+<p>Android 通常是在 GNU/Linux 或 Mac OS 操作系统中进行编译。您也可以使用虚拟机在不支持的系统(例如 Windows)中编译 Android。<br />
+
+</p><h4 id="linux">GNU/Linux</h4>
+
+ <ul>
+ <li>Android 6.0 (Marshmallow) - AOSP master:Ubuntu 14.04 (Trusty)</li>
+ <li>Android 2.3.x (Gingerbread) - Android 5.x (Lollipop):Ubuntu 12.04 (Precise)</li>
+ <li>Android 1.5 (Cupcake) - Android 2.2.x (Froyo):Ubuntu 10.04 (Lucid)</li>
+ </ul>
+
+<h4 id="mac">Mac OS (Intel/x86)</h4>
+
+ <ul>
+ <li>Android 6.0 (Marshmallow) - AOSP master:Mac OS v10.10 (Yosemite) 或更高版本,具有 Xcode 4.5.2 和命令行工具</li>
+ <li>Android 5.x (Lollipop):Mac OS v10.8 (Mountain Lion),具有 Xcode 4.5.2 和命令行工具</li>
+ <li>Android 4.1.x-4.3.x (Jelly Bean) - Android 4.4.x (KitKat):Mac OS v10.6 (Snow Leopard) 或 Mac OS X v10.7 (Lion),以及 Xcode 4.2(Apple 的开发者工具)</li>
+ <li>Android 1.5 (Cupcake) - Android 4.0.x (Ice Cream Sandwich):Mac OS v10.5 (Leopard) 或 Mac OS X v10.6 (Snow Leopard),以及 Mac OS X v10.5 SDK</li>
+ </ul>
+
+<h3 id="jdk">Java 开发套件 (JDK)</h3>
+
+<p>请注意,由于没有适用于 Ubuntu 14.04 的受支持 OpenJDK 8 程序包,因此您必须手动安装 Ubuntu 15.04 程序包。要查看具体说明,请参阅<a href="initializing.html#for-ubuntu-14-04">适用于 Ubuntu LTS 14.04 的 JDK</a>。</p>
+ <ul>
+ <li>AOSP 中 Android 的 master 分支:Ubuntu - <a href="http://openjdk.java.net/install/">OpenJDK 8</a>;Mac OS - <a href="http://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.html#jdk-8u45-oth-JPR">jdk 8u45 或更高版本</a></li>
+ <li>Android 5.x (Lollipop) - Android 6.0 (Marshmallow):Ubuntu - <a href="http://openjdk.java.net/install/">OpenJDK 7</a>;Mac OS - <a href="https://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html#jdk-7u71-oth-JPR">jdk-7u71-macosx-x64.dmg</a></li>
+ <li>Android 2.3.x (Gingerbread) - Android 4.4.x (KitKat):Ubuntu - <a href="http://www.oracle.com/technetwork/java/javase/archive-139210.html">Java JDK 6</a>;Mac OS - <a href="http://support.apple.com/kb/dl1572">Java JDK 6</a></li>
+ <li>Android 1.5 (Cupcake) - Android 2.2.x (Froyo):Ubuntu - <a href="http://www.oracle.com/technetwork/java/javase/archive-139210.html">Java JDK 5</a></li>
+ </ul>
+
+<h3 id="packages">主要程序包</h3>
+ <ul>
+ <li><a href="http://www.python.org/download/">python.org</a> 中提供的 Python 2.6 - 2.7</li>
+ <li><a href="http://ftp.gnu.org/gnu/make/">gnu.org</a> 中提供的 GNU Make 3.81 - 3.82;对于 Android 3.2.x (Honeycomb) 及更低版本,则需要<a href="initializing.html#reverting-from-make-382">将 make 3.82 还原到较低版本</a>,以避免出现编译错误</li>
+ <li><a href="http://git-scm.com/download">git-scm.com</a> 中提供的 Git 1.7 或更高版本</li>
+ </ul>
+
+<h3 id="binaries">设备二进制文件</h3>
+<p>下载预览、出厂映像、驱动程序、无线 (OTA) 更新和下列其他 Blob。如需更多详细信息,请参阅<a href="/source/building.html#obtaining-proprietary-binaries">下载专有二进制文件</a><a></a>。</p><a>
+ </a><ul><a>
+ </a><li><a></a><a href="https://developers.google.com/android/nexus/blobs-preview">预览二进制文件 (Blob)</a> - 用于 AOSP <code>master</code> 分支开发</li>
+ <li><a href="https://developers.google.com/android/nexus/images">出厂映像</a> - 针对运行带标记的 AOSP 版本分支的受支持设备</li>
+ <li><a href="https://developers.google.com/android/nexus/drivers">硬件支持二进制文件</a> - 针对运行带标记的 AOSP 版本分支的设备</li>
+ <li><a href="https://developers.google.com/android/nexus/ota">OTA 映像</a> - 用于通过无线方式手动更新 Nexus 设备</li>
+ </ul>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/roles.html b/zh-cn/source/roles.html
new file mode 100644
index 00000000..e2a682dc
--- /dev/null
+++ b/zh-cn/source/roles.html
@@ -0,0 +1,63 @@
+<html devsite><head>
+ <title>项目角色</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>Android 开放源代码项目 (AOSP) 涉及担任各种角色的人员。Google 负责 Android 产品管理以及核心框架和平台的工程流程;不过,该项目要考虑所有来源的贡献,而不仅仅只是 Google 的贡献。本页介绍了有兴趣者可以担任的各种角色。</p>
+<p>任何有兴趣探索 Android 以及有兴趣为 Android 做贡献的人都可以使用 Android 开放源代码项目资源。任何人都可以加入论坛、提问、贡献补丁程序、报告错误、查看贡献者提交的补丁程序,以及使用相关工具。要开始进行 Android 代码方面的事情,请参阅<a href="/source/contributing.html">贡献</a>。</p>
+<h2 id="contributor">贡献者</h2>
+<p>“贡献者”是指为 AOSP 源代码做贡献的人,包括 Google 或其他公司的员工,以及以个人名义为 Android 做贡献的个人开发者。Google 聘请的贡献者与其他贡献者并无差别;所有工程师都使用相同的工具(Git、Repo 和 Gerrit),遵循相同的代码审核流程,并遵守相同的代码样式要求,等等。</p>
+<h2 id="developer">开发者</h2>
+<p>“开发者”是指编写在 Android 设备上运行的应用的工程师。开发者与贡献者要具备的技能通常并没有太大差异。但 AOSP 使用“开发者”将使用该平台的工程师与为该平台做贡献的工程师区分开来。开发者(以及用户)是贡献者打造的 Android 平台的“客户”。因此,我们经常会提到开发者,尽管从技术层面来讲,其本质上并不是 AOSP 中的一个单独角色。</p>
+<h2 id="verifier">验证者</h2>
+<p>“验证者”负责测试更改请求。当有人向该项目提交了大量高质量代码后,项目负责人可能会邀请他们成为验证者。</p>
+<p class="note"><strong>注意</strong>:目前,验证者的角色与审批者类似。</p>
+<h2 id="approver">审批者</h2>
+<p>“审批者”是该项目中经验丰富的成员,他们展现出了出色的设计技能,并为该项目做出了重大的技术贡献。在代码审核流程中,审批者会决定是纳入还是排除某项更改。项目负责人(通常是 Google 员工)负责选择审批者,有时也会将曾在特定项目中展现出杰出专业技能的验证者晋升为审批者。</p>
+<h2 id="project-leads">项目负责人</h2>
+<p>Android 包含许多子项目;您可以在 Git 存储库中看到这些作为单个 .git 文件存在的子项目。“项目负责人”是资深贡献者,负责监督各个 Android 项目的工程工作。这些项目负责人通常是 Google 员工。各个项目的负责人负责以下事项:</p>
+<ul>
+<li>
+<p>主导项目的所有技术事宜,包括项目路线图、开发、发布周期、版本管理和质量保证 (QA)。</p>
+</li>
+<li>
+<p>确保项目及时通过 QA 测试,不耽误预定的 Android 平台发布。</p>
+</li>
+<li>
+<p>为贡献者提交的补丁程序指定验证者和审批者。</p>
+</li>
+<li>
+<p>在审核更改时保持客观公正。根据技术价值以及是否符合 Android 策略来接受或拒绝补丁程序。</p>
+</li>
+<li>
+<p>及时审核更改,并在更改未被接受时尽最大努力与相关人员进行沟通。</p>
+</li>
+<li>
+<p>视需要维护项目的网站,以便提供针对相应项目的信息和文档。</p>
+</li>
+<li>
+<p>担任解决技术冲突的调解者。</p>
+</li>
+<li>
+<p>担任项目的公开负责人以及项目相关问题的联系人。</p>
+</li>
+</ul>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/running.html b/zh-cn/source/running.html
new file mode 100644
index 00000000..0e0feae0
--- /dev/null
+++ b/zh-cn/source/running.html
@@ -0,0 +1,391 @@
+<html devsite><head>
+ <title>运行编译系统</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>本页提供了关于在特定设备上运行编译系统的详细信息,是对<a href="/source/building.html">编译系统</a>部分的补充。</p>
+
+<h2 id="building-fastboot-and-adb">编译 fastboot 和 adb</h2>
+<p>如果您还没有 fastboot 和 adb,则可以使用常规编译系统来编译。请按照<a href="/source/building.html">编译系统</a>中的说明操作,将主 <code>make</code> 命令替换为以下命令:</p>
+<pre><code>$ make fastboot adb
+</code></pre>
+
+<h2 id="booting-into-fastboot-mode">启动进入 fastboot 模式</h2>
+<p><em></em>Fastboot 是一种引导加载程序模式,您可以在该模式下刷写设备。在设备冷启动过程中,可使用以下组合键进入 fastboot 模式:</p>
+<table>
+<thead>
+<tr>
+<th>代号</th>
+<th>设备</th>
+<th>组合键</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>marlin</td><td>Pixel XL</td>
+<td>按住音量调低键,然后按住电源键<em></em><em></em></td>
+</tr>
+<tr>
+<td>sailfish</td>
+<td>Pixel</td>
+<td>按住音量调低键,然后按住电源键<em></em><em></em></td>
+</tr>
+<tr>
+<td>hikey</td>
+<td>hikey</td>
+<td>连接 J15 的引脚 1-2 和 5-6</td>
+</tr>
+<tr>
+<td>angler</td>
+<td>Nexus 6P</td>
+<td>按住音量调低键,然后按住电源键<em></em><em></em></td>
+</tr>
+<tr>
+<td>bullhead</td>
+<td>Nexus 5X</td>
+<td>按住音量调低键,然后按住电源键<em></em><em></em></td>
+</tr>
+<tr>
+<td>shamu</td>
+<td>Nexus 6</td>
+<td>按住音量调低键,然后按住电源键<em></em><em></em></td>
+</tr>
+<tr>
+<td>fugu</td>
+<td>Nexus Player</td>
+<td>按住电源键<em></em></td>
+</tr>
+<tr>
+<td>volantis</td>
+<td>Nexus 9</td>
+<td>按住音量调低键,然后按住电源键<em></em><em></em></td>
+</tr>
+<tr>
+<td>hammerhead</td>
+<td>Nexus 5</td>
+<td>同时按住音量调高键和音量调低键,然后按住电源键<em></em><em></em><em></em></td>
+</tr>
+<tr>
+<td>flo</td>
+<td>Nexus 7</td>
+<td>按住音量调低键,然后按住电源键<em></em><em></em></td>
+</tr>
+<tr>
+<td>deb</td>
+<td>Nexus 7 3G</td>
+<td>按住音量调低键,然后按住电源键<em></em><em></em></td>
+</tr>
+<tr>
+<td>manta</td>
+<td>Nexus 10</td>
+<td>同时按住音量调高键和音量调低键,然后按住电源键<em></em><em></em><em></em></td>
+</tr>
+<tr>
+<td>mako</td>
+<td>Nexus 4</td>
+<td>按住音量调低键,然后按住电源键<em></em><em></em></td>
+</tr>
+<tr>
+<td>grouper</td>
+<td>Nexus 7 (2012)</td>
+<td>按住音量调低键,然后按住电源键<em></em><em></em></td>
+</tr>
+<tr>
+<td>tilapia</td>
+<td>Nexus 7 3G (2012)</td>
+<td>按住音量调低键,然后按住电源键<em></em><em></em></td>
+</tr>
+<tr>
+<td>phantasm</td>
+<td>Nexus Q</td>
+<td>启动设备,LED 指示灯亮起后用一只手盖住设备,直至指示灯变成红色</td>
+</tr>
+<tr>
+<td>maguro</td>
+<td>Galaxy Nexus GSM</td>
+<td>同时按住音量调高键和音量调低键,然后按住电源键<em></em><em></em><em></em></td>
+</tr>
+<tr>
+<td>toro</td>
+<td>Galaxy Nexus (Verizon)</td>
+<td>同时按住音量调高键和音量调低键,然后按住电源键<em></em><em></em><em></em></td>
+</tr>
+<tr>
+<td>toroplus</td>
+<td>Galaxy Nexus (Sprint)</td>
+<td>同时按住音量调高键和音量调低键,然后按住电源键<em></em><em></em><em></em></td>
+</tr>
+<tr>
+<td>wingray</td>
+<td>Motorola Xoom</td>
+<td>按住音量调低键,然后按住电源键<em></em><em></em></td>
+</tr>
+<tr>
+<td>crespo</td>
+<td>Nexus S</td>
+<td>按住音量调高键,然后按住电源键<em></em><em></em></td>
+</tr>
+<tr>
+<td>crespo4g</td>
+<td>Nexus SG</td>
+<td>按住音量调高键,然后按住电源键<em></em><em></em></td>
+</tr>
+</tbody>
+</table>
+<p>您还可以使用命令 <code>adb reboot bootloader</code> 直接在 Android 系统中重新启动进入引导加载程序,而无需使用任何组合键。</p>
+
+<h2 id="unlocking-the-bootloader">解锁引导加载程序</h2>
+
+<p>只有在引导加载程序允许的情况下,您才可以刷写定制系统,而引导加载程序默认处于锁定状态。您可以解锁引导加载程序,但这样做会导致系统出于保护隐私方面的考虑而删除用户数据。<em></em>解锁之后,系统会清空设备上的所有数据,即应用中的个人数据以及可通过 USB 访问的共享数据(包括照片和影片)。请务必先备份设备上的所有重要文件,然后再尝试解锁引导加载程序。</p>
+
+<p>您只需解锁引导加载程序一次即可,并可视需要将其重新锁定。</p>
+
+<h3>解锁新款设备</h3>
+<p>自 2014 年以来发布的所有 Nexus 和 Pixel 设备(从 Nexus 6 和 Nexus 9 开始)都内置有恢复出厂设置保护功能,需要通过多个步骤才能解锁引导加载程序。</p>
+
+<ol>
+<li>在设备上启用 OEM 解锁:
+<ol style="list-style-type:lower-alpha">
+<li>在“设置”中,点按<strong>关于手机</strong>,然后点按<strong>版本号</strong>七 (7) 次。</li>
+<li>当看到“您已处于开发者模式”这条消息后,点按返回按钮。</li>
+<li>点按<strong>开发者选项</strong>,然后启用 <strong>OEM 解锁</strong>和 <strong>USB 调试</strong>。(如果 OEM 解锁处于停用状态,请连接到互联网,以便设备可以至少签到一次。如果 OEM 解锁仍处于停用状态,则说明您的设备可能已被运营商锁定 SIM 卡,系统无法解锁引导加载程序。)</li></ol></li>
+<li>重新启动进入引导加载程序,然后使用 fastboot 解锁。
+<ul>
+<li>对于新款设备(2015 年及之后发布的设备):<code>$ fastboot flashing unlock</code>
+</li>
+<li>对于老款设备(2014 年及之前发布的设备):<code>$ fastboot oem
+unlock</code></li></ul>您必须在屏幕上确认解锁。</li></ol>
+
+<p class="note"><strong>注意</strong>:在 Nexus 10 上,解锁引导加载程序后,内部存储仍保持未格式化状态。您可以依次使用 <code>fastboot format cache</code> 和 <code>fastboot format userdata</code> 来格式化设备</p>
+
+<h3 id="relocking-the-bootloader">重新锁定引导加载程序</h3>
+<p>要重新锁定引导加载程序,请执行以下命令:</p>
+<ul>
+<li>对于新款设备(2015 年及之后发布的设备):<code>$ fastboot flashing lock</code></li>
+<li>对于老款设备(2014 年及之后发布的设备):<code>$ fastboot oem lock</code></li>
+</ul>
+
+<p class="note"><strong>注意</strong>:在 Motorola Xoom 上重新锁定引导加载程序会清空用户数据(包括共享的 USB 数据)。</p>
+
+<h2 id="flash-unlock">使用刷写解锁</h2>
+
+<p>Android 7.0 包含一个新的系统 API <code>getFlashLockState()</code>(用于传输引导加载程序状态)以及以下系统 API(用于返回兼容设备上引导加载程序的锁定状态):</p>
+
+<pre>
+PersistentDataBlockManager.getFlashLockState()
+</pre>
+
+<table>
+<tbody><tr>
+<th>返回的值</th>
+<th>条件</th>
+</tr>
+<tr>
+<td><code>FLASH_LOCK_UNKNOWN</code>
+</td>
+<td><p>仅升级到 Android 7.0 的符合以下条件的设备会返回此值:设备支持刷写锁定/解锁功能,但尚不支持获取刷写锁定状态所需的引导加载程序变更。</p>
+<p>新款 Android 7.0 设备必须处于 <code>FLASH_LOCK_LOCKED</code> 或 <code>FLASH_LOCK_UNLOCKED</code> 状态。如果某设备升级到了 Android 7.0,且不支持刷写解锁/锁定功能,则应仅会返回 <code>FLASH_LOCK_LOCKED</code> 状态。</p>
+</td>
+</tr>
+<tr>
+<td><code>FLASH_LOCK_LOCKED</code>
+</td>
+<td>不支持刷写锁定/解锁的设备(即设备始终处于锁定状态)或支持刷写锁定/解锁且处于锁定状态的设备应该会返回此值。
+</td>
+</tr>
+<tr>
+<td><code>FLASH_LOCK_UNLOCKED</code>
+</td>
+<td>支持刷写锁定/解锁且当前处于已解锁状态的设备会返回此值。
+</td>
+</tr>
+</tbody></table>
+
+<h3 id="examples-and-source">示例和源代码</h3>
+
+<p>AOSP 包含参考实现代码,根据 <code>ro.boot.flash.locked</code> 启动属性返回值。具体代码位于以下目录中:</p>
+
+<pre>
+frameworks/base/services/core/java/com/android/server/PersistentDataBlockService.java
+frameworks/base/core/java/android/service/persistentdata/PersistentDataBlockManager.java
+</pre>
+
+<h3 id="validation">验证</h3>
+<p>制造商应测试已锁定引导加载程序的设备和已解锁引导加载程序的设备返回的值。</p>
+
+<h2 id="selecting-device-build">选择设备编译系统</h2>
+
+<p>启动菜单中提供了建议的设备编译系统,在不使用任何参数的情况下运行 <code>lunch</code> 命令即可查看。您可以从 developers.google.com 下载 Nexus 设备的出厂映像和二进制文件:</p>
+
+<ul>
+<li><a href="https://developers.google.com/android/nexus/blobs-preview">预览二进制文件 (Blob)</a></li>
+<li><a href="https://developers.google.com/android/nexus/images">已发布设备的出厂映像</a></li>
+<li><a href="https://developers.google.com/android/nexus/drivers">已发布设备的支持二进制文件(驱动程序)</a></li>
+</ul>
+
+<p>有关详情以及其他资源,请参阅<a href="building.html#obtaining-proprietary-binaries">获取专有二进制文件</a>和<a href="requirements.html#binaries">设备二进制文件要求</a>。</p>
+
+<table>
+<thead>
+<tr>
+<th>设备</th>
+<th>代号</th>
+<th>编译配置</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>Pixel XL</td>
+<td>marlin</td>
+<td>aosp_marlin-userdebug</td>
+</tr>
+<tr>
+<td>Pixel</td>
+<td>sailfish</td>
+<td>aosp_sailfish-userdebug</td>
+</tr>
+<tr>
+<td>HiKey</td>
+<td>hikey</td>
+<td>hikey-userdebug</td>
+</tr>
+<tr>
+<td>Nexus 6P</td>
+<td>angler</td>
+<td>aosp_angler-userdebug</td>
+</tr>
+<tr>
+<td>Nexus 5X</td>
+<td>bullhead</td>
+<td>aosp_bullhead-userdebug</td>
+</tr>
+<tr>
+<td>Nexus 6</td>
+<td>shamu</td>
+<td>aosp_shamu-userdebug</td>
+</tr>
+<tr>
+<td>Nexus Player</td>
+<td>fugu</td>
+<td>aosp_fugu-userdebug</td>
+</tr>
+<tr>
+<td>Nexus 9</td>
+<td>volantis (flounder)</td>
+<td>aosp_flounder-userdebug</td>
+</tr>
+<tr>
+<td>Nexus 5 (GSM/LTE)</td>
+<td>hammerhead</td>
+<td>aosp_hammerhead-userdebug</td>
+</tr>
+<tr>
+<td>Nexus 7 (WLAN)</td>
+<td>razor (flo)</td>
+<td>aosp_flo-userdebug</td>
+</tr>
+<tr>
+<td>Nexus 7(移动版)</td>
+<td>razorg (deb)</td>
+<td>aosp_deb-userdebug</td>
+</tr>
+<tr>
+<td>Nexus 10</td>
+<td>mantaray (manta)</td>
+<td>full_manta-userdebug</td>
+</tr>
+<tr>
+<td>Nexus 4</td>
+<td>occam (mako)</td>
+<td>full_mako-userdebug</td>
+</tr>
+<tr>
+<td>Nexus 7 (WLAN)</td>
+<td>nakasi (grouper)</td>
+<td>full_grouper-userdebug</td>
+</tr>
+<tr>
+<td>Nexus 7(移动版)</td>
+<td>nakasig (tilapia)</td>
+<td>full_tilapia-userdebug</td>
+</tr>
+<tr>
+<td>Galaxy Nexus (GSM/HSPA+)</td>
+<td>yakju (maguro)</td>
+<td>full_maguro-userdebug</td>
+</tr>
+<tr>
+<td>Galaxy Nexus (Verizon)</td>
+<td>mysid (toro)</td>
+<td>aosp_toro-userdebug</td>
+</tr>
+<tr>
+<td>Galaxy Nexus(试验版)</td>
+<td>mysidspr (toroplus)</td>
+<td>aosp_toroplus-userdebug</td>
+</tr>
+<tr>
+<td>Motorola Xoom(美国 WLAN 版)</td>
+<td>wingray</td>
+<td>full_wingray-userdebug</td>
+</tr>
+<tr>
+<td>Nexus S</td>
+<td>soju (crespo)</td>
+<td>full_crespo-userdebug</td>
+</tr>
+<tr>
+<td>Nexus S 4G</td>
+<td>sojus (crespo4g)</td>
+<td>full_crespo4g-userdebug</td>
+</tr>
+</tbody>
+</table>
+
+<p class="note"><b>注意</b>:请不要在原本搭载 Android 4.1.2 或更高版本的 Nexus 7 上使用 Android 4.1.1。</p>
+
+<h2 id="flashing-a-device">刷写设备</h2>
+
+<p>您可以通过运行一个命令来刷写整个 Android 系统;这样做可验证正在刷写的系统与已安装的引导加载程序和无线通信模块的驱动程序是否兼容,还可以将启动、恢复和系统分区一起写入,然后重新启动系统。与 <code>fastboot oem
+unlock</code> 类似,刷写设备也会清空所有用户数据。</p>
+
+<p>您可以通过两种方式使设备进入 fastboot 模式:在启动时按住相应的组合键手动实现此操作;从 shell 运行以下命令:</p>
+
+<pre>
+$ adb reboot bootloader
+</pre>
+
+<p>在设备处于 fastboot 模式后,运行以下命令:</p>
+
+<pre>
+$ fastboot flashall -w
+</pre>
+
+<p><code>-w</code> 选项会清除设备上的 <code>/data</code> 分区;该选项在您第一次刷写特定设备时非常有用,但在其他情况下则没必要使用。</p>
+
+<p class="note"><strong>注意</strong>:在 Motorola Xoom 上通过 fastboot 创建的文件系统无法发挥最佳作用。建议您使用 <code>$ adb reboot recovery</code> 命令通过恢复功能来重新创建文件系统。在执行恢复操作时,打开菜单(同时按电源键和音量调高键),清除缓存分区,然后清除数据。</p>
+
+<h2 id="restoring-devices-to-factory-state">将设备恢复到出厂状态</h2>
+
+<p>您可以在 <a href="https://developers.google.com/android/nexus/images">Google 的出厂映像</a>页面上查看 Nexus 5、Nexus 10、Nexus 4、Nexus Q、Nexus 7、Galaxy Nexus(GSM/HSPA+“yakju”和“takju”,CDMA/LTE“mysid”和“mysidspr”)、Nexus S 和 Nexus S 4G 的出厂映像。</p>
+
+<p>Motorola Xoom 的出厂映像由 Motorola 直接提供。</p>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/site-updates.html b/zh-cn/source/site-updates.html
new file mode 100644
index 00000000..d717ad2b
--- /dev/null
+++ b/zh-cn/source/site-updates.html
@@ -0,0 +1,57 @@
+<html devsite><head>
+ <title>网站更新</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>本页介绍了我们对 source.android.com 进行的重大修订。要查看我们对本网站进行的更改的完整列表,请参阅 <a href="https://android.googlesource.com/platform/docs/source.android.com/+log/master?no-merges">Android 开放源代码项目 (AOSP) 文档/source.android.com 日志</a>。
+
+</p><h2 id="april-2017">2017 年 4 月</h2>
+<p>欢迎访问新版 source.android.com!本网站经过了全新改版,可让您更轻松地浏览、搜索和阅读日益增多的信息。以下是我们对本网站所做改进的摘要:</p>
+
+<h3 id="screen-estate">屏幕空间更宽裕,字体更大</h3>
+<p>整个网站的空间更宽裕,可让您同时查看更多内容。代码示例和命令更加醒目,并且所有文字均采用了更大的字体。</p>
+
+<h3 id="mobile-ready">适合移动设备的视图</h3>
+<p>通过专用的移动视图,新版网站可以在手持设备上更明晰地呈现内容。</p>
+
+<div style="width:407px">
+ <img src="images/mobile-view.png" alt="新移动视图" height="533px"/>
+ <p class="img-caption">
+ <strong>图 1.</strong> 网站的新移动视图</p>
+</div>
+
+<h3 id="top-tabs">新的顶级标签</h3>
+<p><em></em>之前的“设备”标签已更名为<a href="/devices/">移植</a>,<em></em>并且之前的“核心技术”子标签已更名为<a href="/devices/tech/">微调</a>并移到了网站顶部,以便更好地显示给用户。</p>
+
+<h3 id="security-forefront">“安全性”标签排在了前列</h3>
+<p>随着人们越来越关注 Android 的安全性,我们将<a href="/security/">安全性</a>标签向前移到了<a href="/source/">源代码</a>旁边,以体现其重要性。</p>
+
+<h3 id="reference-materials">更好的参考资料</h3>
+<p>您可以直接从顶层的<a href="/reference/">参考资料</a>标签获得<a href="/reference/hal/">硬件抽象层</a>和 <a href="/reference/tradefed/packages">Trade Federation</a> 参考资料。</p>
+
+<h3 id="code-links">每页都有的代码链接</h3>
+<p>在每个页面中,您只需点击一下右上角的<strong>转到源代码</strong>按钮,即可访问 <a href="https://android.googlesource.com/">AOSP 代码存储库</a>。</p>
+
+<h3 id="comprehensive-footers">包罗广泛的页脚</h3>
+<p><em></em><em></em><em></em>除了已有的“关于”、“社区”和“法律”页脚之外,现在您还可以在每个页面的底部找到完整的链接列表。通过这些链接,您可以编译 Android、与 Android 生态系统建立联系,以及获得使用操作系统方面的帮助。</p>
+<hr />
+<p>和以往一样,我们衷心希望收到您的反馈,您可以使用每个页面(首页除外)右上角附近的<strong>发送反馈</strong>按钮向我们发送反馈。您可以在<strong>转到源代码</strong>下方找到该按钮。</p>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/submit-patches.html b/zh-cn/source/submit-patches.html
new file mode 100644
index 00000000..0cf4ac3a
--- /dev/null
+++ b/zh-cn/source/submit-patches.html
@@ -0,0 +1,179 @@
+<html devsite><head>
+ <title>提交补丁程序</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>本页介绍向 AOSP 提交补丁程序的完整流程,包括使用 <a href="https://android-review.googlesource.com/">Gerrit</a> 查看和跟踪更改。</p>
+<h3 id="prerequisites">前提条件</h3>
+<ul>
+<li>
+<p>您需要先<a href="/source/initializing.html">初始化编译环境</a>、<a href="/source/downloading.html">下载源代码</a>、<a href="https://android.googlesource.com/new-password">创建密码</a>并按照密码生成器页面上的说明操作,然后再按照本页上的说明操作。</p>
+</li>
+<li>
+<p>如需详细了解 Repo 和 Git,请参阅<a href="/source/developing.html">开发</a>部分。</p>
+</li>
+<li>
+<p>如需了解您可以在 Android 开放源代码社区中担任的不同角色,请参阅<a href="/source/roles.html">项目角色</a>。</p>
+</li>
+<li>
+<p>如果您计划向 Android 平台贡献代码,请务必阅读 <a href="/source/licenses.html">AOSP 的许可信息</a>。</p>
+</li>
+<li>
+<p>请注意,如果要对 Android 使用的某些上游项目做出更改,请直接针对相应项目进行更改,如<a href="#upstream-projects">上游项目</a>部分中所述。</p>
+</li>
+</ul>
+<h2 id="for-contributors">贡献者须知</h2>
+<h3 id="authenticate-with-the-server">向服务器验证身份</h3>
+<p>您需要先<a href="https://android.googlesource.com/new-password">创建一个密码</a>(该密码将用于服务器识别您的身份),然后您才可以向 Gerrit 上传内容。请按照密码生成器页面上的说明操作。您只需执行此流程一次即可。如需了解详情,请参阅<a href="/source/downloading.html#using-authentication">使用身份验证</a>。</p>
+<h3 id="start-a-repo-branch">新建一个 Repo 分支</h3>
+<p>对于您打算进行的每项更改,请在相关的 Git 存储库中新建一个分支:</p>
+<pre><code>$ repo start NAME .
+</code></pre>
+<p>您可以在同一存储库中同时新建多个独立的分支。“NAME”分支是您的工作区的本地分支,不会包含在 Gerrit 或最终源代码树中。</p>
+<h3 id="make-your-change">进行更改</h3>
+<p>在您修改源代码文件(并且验证)后,请将这些更改提交到您的本地存储库:</p>
+<pre><code>$ git add -A
+$ git commit -s
+</code></pre>
+<p>请在您的提交消息中提供相关更改的详细说明。该说明将会被推送到公开 AOSP 存储库,因此请按照我们的准则来撰写更改列表说明:</p>
+<ul>
+
+<li>
+<p>以一行摘要(最多 50 个字符)开头,后跟一个空白行。这是 Git 和 Gerrit 支持的格式,适用于各种屏幕尺寸的设备。</p>
+</li>
+
+<li>
+<p>从第三行开始输入较长的说明,说明会在达到 72 个字符时自动硬回车换行。该部分应着重说明更改解决了什么问题,以及如何解决了问题。尽管我们建议您提供第二部分的内容,但这在实现新功能时是可选内容。</p>
+</li>
+<li>
+<p>添加对任何假设或背景信息的简短说明,这些内容可能对下一年研究此功能的其他贡献者起到很大的帮助作用。</p>
+</li>
+</ul>
+
+<p>以下是一个示例提交消息:</p>
+<pre><code>short description on first line
+
+more detailed description of your patch,
+which is likely to take up multiple lines.
+</code></pre>
+
+<p><code>repo
+init</code> 期间提供的唯一更改 ID 以及您的姓名和电子邮件将自动添加到您的提交消息中。</p>
+<h3 id="upload-to-gerrit">上传到 Gerrit</h3>
+<p>将更改提交到您的个人历史记录后,请使用以下命令将其上传到 Gerrit:</p>
+<pre><code>$ repo upload
+</code></pre>
+<p>如果您在同一存储库中新建了多个分支,则系统会提示您选择要上传的分支。</p>
+<p>上传成功后,Repo 会为您提供 <a href="https://android-review.googlesource.com/">Gerrit</a> 上对应新页面的网址。访问该链接可在审核服务器上查看您上传的补丁程序、添加注释,或者为您的补丁程序申请特定审核者。</p>
+<h3 id="uploading-a-replacement-patch">上传替换补丁程序</h3>
+<p>假设某位审核者已看过您的补丁程序,并要求您做一些小小的修改。您可以在 Git 中修改提交,这会在 Gerrit 中生成一个新的补丁程序,但具有与原始补丁程序相同的更改 ID。</p>
+<p><em>请注意,如果您在上传该补丁程序之后进行了其他提交,那么您需要手动移动 Git HEAD。</em></p>
+<pre><code>$ git add -A
+$ git commit --amend
+</code></pre>
+<p>当您上传修改后的补丁程序时,它将替换 Gerrit 和本地 Git 历史记录中的原始补丁程序。</p>
+<h3 id="resolving-sync-conflicts">解决同步冲突</h3>
+<p>如果提交到源代码树的其他补丁程序与您的存在冲突,那么您需要在源代码存储库的新 HEAD 的基础上对您的补丁程序执行“衍合”(rebase) 命令。执行此操作的一种简单方法是运行以下命令:</p>
+<pre><code>$ repo sync
+</code></pre>
+<p>此命令首先从源代码服务器获取更新,然后尝试在新的远程 HEAD 的基础上对您的 HEAD 自动执行衍合命令。</p>
+<p>如果自动衍合命令失败,您就必须手动执行衍合。</p>
+<pre><code>$ repo rebase
+</code></pre>
+<p>使用 <code>git mergetool</code> 可帮助您处理衍合冲突。在成功合并冲突文件后,运行以下命令:</p>
+<pre><code>$ git rebase --continue
+</code></pre>
+<p>在自动或手动衍合完成之后,运行 <code>repo
+upload</code> 来提交衍合后的补丁程序。</p>
+<h3 id="after-a-submission-is-approved">提交内容获得批准后</h3>
+<p>在提交内容通过审核和验证流程之后,Gerrit 会自动将更改合并到公开存储库。其他用户可以运行 <code>repo sync</code> 将更新提取到自己的本地客户端。</p>
+<h2 id="for-reviewers-and-verifiers">审核者和验证者须知</h2>
+<h3 id="reviewing-a-change">审核更改</h3>
+<p>如果您被指定为某项更改的审批者,则需要确定以下事项:</p>
+<ul>
+<li>
+<p>此项更改是否符合此项目既定的目的?</p>
+</li>
+<li>
+<p>此项更改在项目的现有架构中是否有效?</p>
+</li>
+<li>
+<p>此项更改是否会引入在将来造成问题的设计缺陷?</p>
+</li>
+<li>
+<p>此项更改是否遵循了针对此项目中制定的最佳做法?</p>
+</li>
+<li>
+<p>此项更改是否是执行所述功能的绝佳方式?</p>
+</li>
+<li>
+<p>此项更改是否会带来任何安全风险或不稳定性方面的风险?</p>
+</li>
+</ul>
+<p>如果您批准此项更改,请在 Gerrit 中将其标记为 LGTM(“看起来不错”)。</p>
+<h3 id="verifying-a-change">验证更改</h3>
+<p>如果您被指定为某项更改的验证者,则需要执行以下工作:</p>
+<ul>
+<li>
+<p>使用其中一种下载命令将更改以补丁程序的形式添加到自己的本地客户端。</p>
+</li>
+<li>
+<p>编译和测试更改。</p>
+</li>
+<li>
+<p>在 Gerrit 中,使用“Publish Comments”(发布注释)功能将提交标记为“Verified”(已验证)或“Fails”(失败),并添加一条消息说明发现了哪些问题。</p>
+</li>
+</ul>
+<h3 id="downloading-changes-from-gerrit">从 Gerrit 下载更改</h3>
+<p>已验证并合并的提交内容将在下一次运行 <code>repo sync</code> 时下载。如果您希望下载尚未获得批准的特定更改,请运行以下命令:</p>
+<pre><code>$ repo download TARGET CHANGE
+</code></pre>
+<p>其中 TARGET 是更改应该下载到的本地目录,CHANGE 是 <a href="https://android-review.googlesource.com/">Gerrit</a> 中列出的更改编号。如需了解详细信息,请参阅 <a href="/source/using-repo.html">Repo 参考资料</a>。</p>
+<h3 id="how-do-i-become-a-verifier-or-approver">如何成为验证者或审批者?</h3>
+<p>简言之,为一个或多个 Android 项目贡献高质量代码。要详细了解 Android 开放源代码社区中的不同角色以及谁在担任这些角色,请参阅<a href="/source/roles.html">项目角色</a>。</p>
+<h3 id="diffs-and-comments">差异和注释</h3>
+<p>要在 Gerrit 中打开某项更改的详细信息,请点击该项更改的“ID 号”或“主题”。要比较已定版的原有代码与更新后的代码,请点击“Side-by-side diffs”(并排显示差异)下的文件名。</p>
+<h3 id="adding-comments">添加注释</h3>
+<p>社区中的任何人都可以使用 Gerrit 为提交的代码添加代码内注释。符合标准的注释会与 Gerrit 中其所依附的代码行或代码段相关。这可能是关于如何改进一行代码的简短而有建设性的建议,也可能是作者对于为什么这样编写代码的解释。</p>
+<p>要添加代码内注释,请双击代码的相关行,然后在打开的文本框中编写注释。点击“Save”(保存)后,只有您可以看到自己的注释。</p>
+<p>要发布注释以便让其他使用 Gerrit 的人可以看到,请点击“Publish Comments”(发布注释)按钮。您的注释将通过电子邮件发送给相应更改的所有相关方,包括更改的所有者、补丁程序集上传者(如果与所有者不同)以及所有当前审核者。</p>
+<p><a name="upstream-projects"></a></p>
+<h2 id="upstream-projects">上游项目</h2>
+<p>Android 使用了许多其他开放源代码项目,例如<a href="/source/code-lines.html">代码行、分支和版本</a>中所述的 Linux 内核和 WebKit。对于 <code>external/</code> 下的大多数项目,如果要提交更改,则应该在上游进行,然后 Android 维护者会收到有关包含这些更改的新上游版本的通知。上传补丁程序也可能有助于我们跟踪新的上游版本,但如果是 Android 中广泛使用的项目(如下面提到的大多数大型项目),我们将很难做出更改。在这种情况下,我们倾向于在每次发布版本时进行升级。</p>
+<p>一个有趣的特殊情况是 Bionic。由于大部分代码都是来自 BSD,因此,除非更改涉及对 Bionic 新内容的编码,否则我们宁愿使用上游修复程序,然后从相应的 BSD 中提取一个全新文件。(可惜的是,我们目前有各种不同的 BSD,但我们希望将来能够解决该问题,并能够更密切地跟踪上游项目。)</p>
+<h3 id="icu4c">ICU4C</h3>
+<p>对于 <code>external/icu4c</code> 中的 ICU4C 项目,所有更改都应该通过 <a href="http://site.icu-project.org/">icu-project.org/</a> 在上游进行。如需了解详情,请参阅<a href="http://site.icu-project.org/bugs">提交 ICU 错误和功能请求</a>。</p>
+
+<h3 id="llvmclangcompiler-rt">LLVM/Clang/Compiler-rt</h3>
+<p>对 LLVM 相关项目(<code>external/clang</code>、<code>external/compiler-rt</code>、<code>external/llvm</code>)的所有更改都应该通过 <a href="http://llvm.org/">llvm.org/</a> 在上游进行。</p>
+
+<h3 id="mksh">mksh</h3>
+<p>对于 <code>external/mksh</code> 中的 MirBSD Korn Shell 项目,所有更改都应该在上游进行:通过向 miros-mksh@mirbsd.org 发送电子邮件(无需订阅即可提交)或者在 <a href="https://launchpad.net/mksh">Launchpad</a> 中进行(可选)。
+</p>
+<h3 id="openssl">OpenSSL</h3>
+<p>对于 <code>external/openssl</code> 中的 OpenSSL 项目,所有更改都应该通过 <a href="http://www.openssl.org">openssl.org</a> 在上游进行。</p>
+<h3 id="v8">V8</h3>
+<p>对于 <code>external/v8</code> 中的 V8 项目,所有更改都应该通过 <a href="https://code.google.com/p/v8">code.google.com/p/v8</a> 在上游提交。如需了解详情,请参阅<a href="https://code.google.com/p/v8/wiki/Contributing">为 V8 贡献代码</a>。</p>
+<h3 id="webkit">WebKit</h3>
+<p>对于 <code>external/webkit</code> 中的 WebKit 项目,所有更改都应该通过 <a href="http://www.webkit.org">webkit.org</a> 在上游进行。该过程需从提交 WebKit 错误开始。只有当该错误仅限于 Android 时,才可以在 <code>Platform</code> 和 <code>OS</code> 字段中使用 <code>Android</code>。如果附有建议的修复程序并包含测试结果,则错误更有可能引起审核者的注意。如需了解详情,请参阅<a href="http://webkit.org/coding/contributing.html">为 WebKit 贡献代码</a>。</p>
+<h3 id="zlib">zlib</h3>
+<p>对于 <code>external/zlib</code> 中的 zlib 项目,所有更改都应该通过 <a href="http://zlib.net">zlib.net</a> 在上游进行。</p>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/source/using-repo.html b/zh-cn/source/using-repo.html
new file mode 100644
index 00000000..7bef3f8a
--- /dev/null
+++ b/zh-cn/source/using-repo.html
@@ -0,0 +1,258 @@
+<html devsite><head>
+ <title>Repo 命令参考资料</title>
+ <meta name="project_path" value="/_project.yaml"/>
+ <meta name="book_path" value="/_book.yaml"/>
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p>使用 Repo 需遵循的格式如下:</p>
+<pre><code>repo <em>&lt;COMMAND&gt;</em> <em>&lt;OPTIONS&gt;</em>
+</code></pre>
+<p>可选元素显示在方括号 [ ] 中。例如,许多命令会将项目列表用作参数。您可以为项目指定项目列表,作为名称列表或本地源代码目录的路径列表:</p>
+<pre><code>repo sync [<em>&lt;PROJECT0&gt;</em> <em>&lt;PROJECT1&gt;</em> <em>&lt;PROJECTN&gt;</em>]
+repo sync [<em>&lt;/PATH/TO/PROJECT0&gt;</em> ... <em>&lt;/PATH/TO/PROJECTN&gt;</em>]
+</code></pre>
+
+<h2 id="help">help</h2>
+<p>安装 Repo 后,您可以通过运行以下命令找到最新文档(开头是包含所有命令的摘要):</p>
+<pre><code>repo help
+</code></pre>
+<p>您可以通过在 Repo 树中运行以下命令来获取有关某个命令的信息:</p>
+<pre><code>repo help <em>&lt;COMMAND&gt;</em>
+</code></pre>
+
+<p>例如,以下命令会生成 Repo <code>init</code> 参数的说明和选项列表,该参数会在当前目录中初始化 Repo。(要了解详情,请参阅 <a href="#init">init</a>。)</p>
+<pre><code>repo help init
+</code></pre>
+
+<h2 id="init">init</h2>
+<pre><code>$ repo init -u <em>&lt;URL&gt;</em> [<em>&lt;OPTIONS&gt;</em>]
+</code></pre>
+<p>在当前目录中安装 Repo。这会创建一个 <code>.repo/</code> 目录,其中包含用于 Repo 源代码和标准 Android 清单文件的 Git 代码库。该 <code>.repo/</code> 目录中还包含 <code>manifest.xml</code>,这是一个指向 <code>.repo/manifests/</code> 目录中所选清单的符号链接。</p>
+<p>选项:</p>
+<ul>
+<li>
+<p><code>-u</code>:指定要从中检索清单代码库的网址。您可以在 <code>https://android.googlesource.com/platform/manifest</code> 中找到常见清单</p>
+</li>
+<li>
+<p><code>-m</code>:在代码库中选择清单文件。如果未选择任何清单名称,则会默认选择 default.xml。</p>
+</li>
+<li>
+<p><code>-b</code>:指定修订版本,即特定的清单分支。</p>
+</li>
+</ul>
+<p class="note"><strong>注意</strong>:对于其余的所有 Repo 命令,当前工作目录必须是 <code>.repo/</code> 的父目录或相应父目录的子目录。</p>
+<h2 id="sync">sync</h2>
+<pre><code>repo sync [<em>&lt;PROJECT_LIST&gt;</em>]
+</code></pre>
+<p>下载新的更改并更新本地环境中的工作文件。如果您在未使用任何参数的情况下运行 <code>repo sync</code>,则该操作会同步所有项目的文件。</p>
+<p>运行 <code>repo sync</code> 后,将出现以下情况:</p>
+<ul>
+<li>
+<p>如果目标项目从未同步过,则 <code>repo sync</code> 相当于 <code>git clone</code>。远程代码库中的所有分支都会复制到本地项目目录中。</p>
+</li>
+<li>
+<p>如果目标项目已同步过,则 <code>repo sync</code> 相当于以下命令:</p>
+<pre><code>git remote update
+git rebase origin/<em>&lt;BRANCH&gt;</em>
+</code></pre>
+<p>其中 <code><em>&lt;BRANCH&gt;</em></code> 是本地项目目录中当前已检出的分支。如果本地分支没有在跟踪远程代码库中的分支,则相应项目不会发生任何同步。</p>
+</li>
+<li>
+<p>如果 git rebase 操作导致合并冲突,那么您需要使用普通 Git 命令(例如 <code>git rebase --continue</code>)来解决冲突。</p>
+</li>
+</ul>
+<p><code>repo sync</code> 运行成功后,指定项目中的代码会与远程代码库中的代码保持同步。</p>
+<p>选项:</p>
+<ul>
+<li>
+<p><code>-d</code>:将指定项目切换回清单修订版本。如果项目当前属于某个主题分支,但只是临时需要清单修订版本,则此选项会有所帮助。</p>
+</li>
+<li>
+<p><code>-s</code>:同步到当前清单中清单服务器元素指定的一个已知的良好版本。</p>
+</li>
+<li>
+<p><code>-f</code>:即使某个项目同步失败,系统也会继续同步其他项目。</p>
+</li>
+</ul>
+<h2 id="upload">upload</h2>
+<pre><code>repo upload [<em>&lt;PROJECT_LIST&gt;</em>]
+</code></pre>
+<p>对于指定的项目,Repo 会将本地分支与最后一次 repo sync 时更新的远程分支进行比较。Repo 会提示您选择一个或多个尚未上传以供审核的分支。</p>
+<p>您选择一个或多个分支后,所选分支上的所有提交都会通过 HTTPS 连接传输到 Gerrit。您需要配置一个 HTTPS 密码以启用上传授权。要生成新的用户名/密码对以用于 HTTPS 传输,请访问<a href="https://android-review.googlesource.com/new-password">密码生成器</a>。</p>
+<p>当 Gerrit 通过其服务器接收对象数据时,它会将每项提交转变成一项更改,以便审核者可以单独针对每项提交给出意见。要将几项“检查点”提交合并为一项提交,请使用 git rebase -i,然后再运行 repo upload。</p>
+<p>如果您在未使用任何参数的情况下运行 repo upload,则该操作会搜索所有项目中的更改以进行上传。</p>
+<p>要在更改上传之后对其进行修改,您应该使用 <code>git rebase -i</code> 或 <code>git commit --amend</code> 等工具更新您的本地提交。修改完成之后,请执行以下操作:</p>
+<ul>
+<li>
+<p>进行核对以确保更新后的分支是当前已检出的分支。</p>
+</li>
+<li>
+<p>对于相应系列中的每项提交,请在方括号内输入 Gerrit 更改 ID:</p>
+<pre><code># Replacing from branch foo
+[ 3021 ] 35f2596c Refactor part of GetUploadableBranches to lookup one specific...
+[ 2829 ] ec18b4ba Update proto client to support patch set replacments
+# Insert change numbers in the brackets to add a new patch set.
+# To create a new change record, leave the brackets empty.
+</code></pre>
+</li>
+</ul>
+<p>上传完成后,这些更改将拥有一个额外的补丁程序集。</p>
+<h2 id="diff">diff</h2>
+<pre><code>repo diff [<em>&lt;PROJECT_LIST&gt;</em>]
+</code></pre>
+<p>使用 <code>git diff</code> 显示提交与工作树之间的明显更改。</p>
+<h2 id="download">download</h2>
+<pre><code>repo download <em>&lt;TARGET&gt;</em> <em>&lt;CHANGE&gt;</em>
+</code></pre>
+<p>从审核系统中下载指定更改,并放在您项目的本地工作目录中供使用。</p>
+<p>例如,要将<a href="https://android-review.googlesource.com/23823">更改 23823</a> 下载到您的平台/编译目录,请运行以下命令:</p>
+<pre><code>$ repo download platform/build 23823
+</code></pre>
+<p><code>repo sync</code> 应该可以有效移除通过 <code>repo download</code> 检索到的任何提交。或者,您可以将远程分支检出,例如 <code>git checkout m/master</code>。</p>
+<p class="note"><strong>注意</strong>:由于全球的所有服务器均存在复制延迟,因此某项更改(位于 <a href="https://android-review.googlesource.com/">Gerrit</a> 中)出现在网络上的时间与所有用户可通过 <code>repo download</code> 找到此项更改的时间之间存在些许的镜像延迟。</p>
+<h2 id="forall">forall</h2>
+<pre><code>repo forall [<em>&lt;PROJECT_LIST&gt;</em>] -c <em>&lt;COMMAND&gt;</em>
+</code></pre>
+<p>在每个项目中运行指定的 shell 命令。通过 <code>repo forall</code> 可使用下列额外的环境变量:</p>
+<ul>
+<li>
+<p><code>REPO_PROJECT</code> 可设为项目的具有唯一性的名称。</p>
+</li>
+<li>
+<p><code>REPO_PATH</code> 是客户端根目录的相对路径。</p>
+</li>
+<li>
+<p><code>REPO_REMOTE</code> 是清单中远程系统的名称。</p>
+</li>
+<li>
+<p><code>REPO_LREV</code> 是清单中修订版本的名称,已转换为本地跟踪分支。如果您需要将清单修订版本传递到某个本地运行的 Git 命令,则可使用此变量。</p>
+</li>
+<li>
+<p><code>REPO_RREV</code> 是清单中修订版本的名称,与清单中显示的名称完全一致。</p>
+</li>
+</ul>
+<p>选项:</p>
+<ul>
+<li>
+<p><code>-c</code>:要运行的命令和参数。此命令会通过 <code>/bin/sh</code> 进行求值,它之后的任何参数都将作为 shell 位置参数传递。</p>
+</li>
+<li>
+<p><code>-p</code>:在指定命令输出结果之前显示项目标头。这通过以下方式实现:将管道绑定到命令的 stdin、stdout 和 sterr 流,然后通过管道将所有输出结果传输到一个页面调度会话中显示的连续流中。</p>
+</li>
+<li>
+<p><code>-v</code>:显示该命令向 stderr 写入的消息。</p>
+</li>
+</ul>
+<h2 id="prune">prune</h2>
+<pre><code>repo prune [<em>&lt;PROJECT_LIST&gt;</em>]
+</code></pre>
+<p>删减(删除)已合并的主题。</p>
+<h2 id="start">start</h2>
+<pre><code>repo start <em>&lt;BRANCH_NAME&gt;</em> [<em>&lt;PROJECT_LIST&gt;</em>]
+</code></pre>
+<p>从清单中指定的修订版本开始,创建一个新的分支进行开发。</p>
+<p><code><em>&lt;BRANCH_NAME&gt;</em></code> 参数应简要说明您尝试对项目进行的更改。如果您不知道,则不妨考虑使用默认名称。</p>
+<p><code><em>&lt;PROJECT_LIST&gt;</em></code> 指定了将参与此主题分支的项目。</p>
+<p class="note"><strong>注意</strong>:“.”是一个非常实用的简写形式,用来代表当前工作目录中的项目。</p>
+<h2 id="status">status</h2>
+<pre><code>repo status [<em>&lt;PROJECT_LIST&gt;</em>]
+</code></pre>
+<p>对于每个指定的项目,将工作树与临时区域(索引)以及此分支 (HEAD) 上的最近一次提交进行比较。在这三种状态存在差异之处显示每个文件的摘要行。</p>
+<p>要仅查看当前分支的状态,请运行 <code>repo status</code>。系统会按项目列出状态信息。对于项目中的每个文件,系统使用两个字母的代码来表示:</p>
+<p>在第一列中,大写字母表示临时区域与上次提交状态之间的不同之处。</p>
+<table>
+<thead>
+<tr>
+<th>字母</th>
+<th>含义</th>
+<th>说明</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>-</td>
+<td>无更改</td>
+<td>HEAD 与索引中相同</td>
+</tr>
+<tr>
+<td>A</td>
+<td>已添加</td>
+<td>不存在于 HEAD 中,但存在于索引中</td>
+</tr>
+<tr>
+<td>M</td>
+<td>已修改</td>
+<td>存在于 HEAD 中,但索引中的文件已修改</td>
+</tr>
+<tr>
+<td>D</td>
+<td>已删除</td>
+<td>存在于 HEAD 中,但不存在于索引中</td>
+</tr>
+<tr>
+<td>R</td>
+<td>已重命名</td>
+<td>不存在于 HEAD 中,但索引中的文件的路径已更改</td>
+</tr>
+<tr>
+<td>C</td>
+<td>已复制</td>
+<td>不存在于 HEAD 中,已从索引中的另一个文件复制</td>
+</tr>
+<tr>
+<td>T</td>
+<td>模式已更改</td>
+<td>HEAD 与索引中的内容相同,但模式已更改</td>
+</tr>
+<tr>
+<td>U</td>
+<td>未合并</td>
+<td>HEAD 与索引之间存在冲突;需要解决方案</td>
+</tr>
+</tbody>
+</table>
+<p>在第二列中,小写字母表示工作目录与索引之间的不同之处。</p>
+<table>
+<thead>
+<tr>
+<th>字母</th>
+<th>含义</th>
+<th>说明</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>-</td>
+<td>新/未知</td>
+<td>不存在于索引中,但存在于工作树中</td>
+</tr>
+<tr>
+<td>m</td>
+<td>已修改</td>
+<td>存在于索引中,也存在于工作树中(但已修改)</td>
+</tr>
+<tr>
+<td>d</td>
+<td>已删除</td>
+<td>存在于索引中,不存在于工作树中</td>
+</tr>
+</tbody>
+</table>
+
+</body></html> \ No newline at end of file