# Android (简体中文)

翻译状态： 本文是英文页面 Android 的翻译，最后翻译时间：2013-11-23，点击这里可以查看翻译后英文页面的改动。

## Archlinux 环境下开发安卓

共有三个部分需要构建：

1. Android SDK 核心组件，
2. Android SDK 特定平台软件包，
3. 开发环境

### 安装安卓开发平台核心组件

在开发安卓程序之前，至少需要一个安卓平台。可以从 AUR 安装核心 SDK 组件:

1. android-sdk
2. android-sdk-platform-tools
3. android-sdk-build-tools

默认会安装到 `/opt/android-sdk`。

注意: 如果运行 64 位操作系统，你需要启用multilib软件源，才能用 pacman 安装需要的依赖软件包。

### 获取 Android SDK 特定平台软件包

安装 Android SDK 特定平台软件包的方法有：自动安装、从AUR安装、手工安装。

#### 自动安装

通过 Android SDK Manager 自动安装，执行（假设环境变量`$PATH`中包含了 Android SDK `tools` 的目录）:

    $ android

或者：

    $ <path_to_android-sdk>/tools/android

如果你碰到这个错误 'Failed to fetch URL https://dl-ssl.google.com/android/repository/addons_list-2.xml, reason: peer not authenticated'，你需要在选项中并勾选 'Force https:// sources to be fetched using http://'。

如果自动安装出错，那么你必须用以下的"一种"办法：

- 用更高的权限运行 android 工具：

    # android

- 设置你的用户帐户为目录的所有者。要改变所有 SDK 目录的所有者 ID，以 root 权限运行以下命令：

    # chown -R $USER /opt/android-sdk

- 改变目录的组ID（多个用户使用时推荐这个方法），首先创建一个组，可以称它为 android，把你添加到这个组中：

    # groupadd android
    # gpasswd -a $USER android

接下来，改变目录的权限：

    # chgrp -R android /opt/android-sdk
    # chmod -R g+w /opt/android-sdk
    # find /opt/android-sdk -type d -exec chmod g+s {} \;

最后一个命令在所有子目录上设置了 setgid 标志，这样所有这些目录中新创建的文件也会继承适当的组 ID。

然后重新运行

    $ android

一步一步地自动安装参见: 安装 SDK 组件。

#### 从 AUR 中安装

AUR 目前包含了多个安卓平台的包，不过有些互相重复且/或一些文件的权限设置得不正确。

#### 手动安装

手动安装：

1. 下载需要开发的平台版本。此网站提供了许多 Android SDK 组件的下载链接。
2. 解压到 `/<path_to_android-sdk>/platforms`。

现在应该能够在 Android SDK Manager 里看到安装的平台了。

### 搭建开发平台

Android Studio 是一个全新的（实验性的！）基于 IntelliJ IDEA 的 Android 开发环境。更传统的一个集成开发环境是包含 ADT 插件及相关软件包的 Eclipse。另外，安装下述的插件之后，也可以使用 Netbeans 进行开发。

#### Android Studio

Android Studio 是一个全新的（实验性的！）基于 IntelliJ IDEA 的 Android 开发环境。类似于安装了 ADT 插件的 Eclipse，Android Studio 为开发和调试提供了集成的 Android 开发者工具。

你可以下载并安装 AUR 中的 android-studio 软件包。

#### Eclipse

在 Eclipse 中开发 Android 需要的大部分软件 AUR 已经有了:

谷歌官方插件 – Eclipse ADT:

1. eclipse-android

依赖:

1. eclipse-emf
2. eclipse-gef
3. eclipse-wtp-wst

注意:

- 如果你遇到了不可解析的依赖的错误信息，手动安装 Java 并重试。
- 另外，你也可以通过 eclipse 内置的 "add new software" 方法来安装 ADT（详见 ADT 网站的帮助）。
- 如果你需要安装不在 AUR 中的额外 SDK 组件，你必须先改变 /opt/android_sdk 中文件的所有者和权限，运行 `# chgrp -R users /opt/android-sdk ; chmod -R 0775 /opt/android-sdk` （详细信息可参见 文件权限）。

在下面设置中设置 Android SDK 路径：

    Windows -> Preferences -> Android

#### Netbeans

如果想用 Netbeans 作为 Android 开发 IDE，需要下载 nbandroid:

    Tools -> Plugins -> Settings

添加如下 URL: http://nbandroid.org/release72/updates/updates.xml

然后到 Available Plugins 安装 IDE 版本对应的 Android 和 Android Test Runner 插件

如果你在 Netbeans 7.2 中碰到了 "org.netbeans.modules.gsf.testrunner was needed and not found." 的问题，请移除 Android 和 Android Test Runner插件，然后更改 nbandroid 的 url 为： http://nbandroid.org/release72/updates/updates.xml，更新源之后，你只需要安装 Android。

安装后到:

    Tools -> Options -> Miscellaneous -> Android

设置 SDK 安装路径。 这样就行了，现在你可以在 Netbeans 里面创建和开发新的 Android 项目。

### 连接一台真实设置 —— 安卓调试桥 (ADB)

要使用 安卓调试桥(ADB) 在 Arch下连接设备，必须为 `/dev/` 添加udev规则。

#### 使用现有规则

安装 AUR 软件包 android-udev 可以获得常见 vendor ID 列表。如果 ADB 可以找到设备（在IDE中可以看见和访问），这项就完成了；否则，见下面的内容。

#### 手动查找设备 ID

每一个手机供应商都提供了usb厂商ID和产品ID；比如 HTC EVO 为：

    vendor id: 0bb4
    product id: 0c8d

使用usb连接ArchLinux（使用充电模式），在终端上运行：

    $ lsusb

应该会出现类似的结果:

    Bus 002 Device 006: ID 0bb4:0c8d High Tech Computer Corp.

#### 添加 udev 规则

使用 Android developer 的规则，或者使用下面的模板，用你的 [VENDOR ID] 和 [PRODUCT ID] 替换里面的值。然后把这些规则复制到 `/etc/udev/rules.d/51-android.rules`：

    /etc/udev/rules.d/51-android.rules

    SUBSYSTEM=="usb", ATTR{idVendor}=="[VENDOR ID]", MODE="0666"
    SUBSYSTEM=="usb",ATTR{idVendor}=="[VENDOR ID]",ATTR{idProduct}=="[PRODUCT ID]",SYMLINK+="android_adb"
    SUBSYSTEM=="usb",ATTR{idVendor}=="[VENDOR ID]",ATTR{idProduct}=="[PRODUCT ID]",SYMLINK+="android_fastboot"

然后加载我们定义的规则，运行：

    # udevadm control --reload-rules

#### 它有效吗？

配置了 udev 规则之后，拔掉设备然后重新连接

再运行：

    $ adb devices

可以看到类似的结果：

    List of devices attached
    HT07VHL00676    device

如果没有 adb 程序(通常位于`/opt/android-sdk/platform-tools/`)，可能是没有安装平台工具。

如果列表为空(设备没有找到)，可能是因为设备上没有启用 USB 调试。可以到 设置 => 应用程序 => 开发 (Settings => Applications => Development) 或者 设置 => 开发者选项 (Settings => Developer options) 中启用 USB 调试。Android 4.2 (Jelly Bean) 隐藏了开发者选项菜单，到 设置 => 关于手机 (Settings => About phone)，然后点击 Build 版本号 7 次来启用它。

Tip: 请确保用户属于 adbusers 组：

     # gpasswd -a username adbusers

注意：在 systemd 下不需要重新载入 udev 规则，这是由于它会自动处理任何规则变化。

#### 配置 adb

与其使用 udev 规则，你也可以创建/编辑 ~/.android/adb_usb.ini，使它包含厂商 id 的列表。

     $ cat ~/.android/adb_usb.ini
     0x27e8

### NVIDIA Tegra 平台专用工具

如果应用程序的目标平台是 NVIDIA Tegra 平台，可以安装 NVIDIA 提供的工具、文档和示例。NVIDIA 移动开发者 区提供了两个软件包 - Tegra Android 开发包，AUR 提供了 tegra-devpack 和 Tegra Toolkit，AUR 软件包是 tegra-toolkit。

tegra-toolkit 软件包提供了工具(大部分是 CPU 和 GPU 优化相关)，示例和文档。tegra-devpack 软件包提供了 NVIDIA Debug Manager 及文档，主要和 Eclipse ADT 相关。

### 网络共享

见 Android Tethering。

## 构建 Android

构建 Android 时需要安装这些软件包：

- 所有系统：gcc git gnupg flex bison gperf sdl wxgtk squashfs-tools curl ncurses zlib schedtool perl-switch zip unzip libxslt

- 额外的软件包，仅于 64 位系统中需要：gcc-multilib lib32-zlib lib32-ncurses lib32-readline

For the JDK depending on the version of android you can use jdk7-openjdk, but to be safe either jdk6, if you don't develop on the jvm, or jdk6-compat, if you do have a prefered jvm for other tasks.

并且，你需要把默认的 python 从 3.X 版切换到 2.X 版：

    # rm /usr/bin/python
    # ln -s /usr/bin/python2 /usr/bin/python

下载 repo 工具：

    $ mkdir ~/bin
    $ export PATH=~/bin:$PATH
    $ curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
    $ chmod a+x ~/bin/repo

创建一个用于构建的目录：

    $ mkdir ~/android
    $ cd ~/android

与源同步：

    $ repo init -u https://android.googlesource.com/platform/manifest (checkout the master)
    $ repo sync

等待很久。 同步完成之后，开始构建：

    $ source build/envsetup.sh
    $ lunch full-eng
    $ make -j4

如果你不添加任何参数运行 lunch，它会询问你想要创建什么样的 build。 使用 -j 并添加一个数字，它介于你CPU的核数到2倍核数之间。

编译要花很长时间。

注意: 确保你有足够的内存。

Android 会大量使用 /tmp。默认情况下，/tmp 目录所挂载的分区大小是内存的一半。如果它满了，那么编译会失败。推荐 4GB 以上的内存。

- 另外，你也可以不使用 fstab 里的 tmpfs。

完成之后，运行最终的映像。

    $ emulator

## 技巧和提示

### 调试时出现 "Source not found"

一般这时调试器正在单步进入(Step into) Java 代码。而 Android SDK 并不提供 Java 源代码，所以导致了错误。最好的解决方法是设置单步过滤器，不要跳转到 Java 源代码。单步过滤器默认没有启动，通过如下方式设置：

    Window -> Preferences -> Java -> Debug -> Step Filtering

可以全选，此外还可以添加 android.* 软件包。下面贴子有更详细信息: http://www.eclipsezone.com/eclipse/forums/t83338.rhtml

### 在 sd 卡上安装 Linux 发行版

可以参照这篇贴子安装 Debian，archlinuxarm.org上有 Arch linux 安装方法的详细介绍。

### Arch 64 上的 Android SDK

在 64 位系统上使用 Android SDK 和 Eclipse 插件时，模拟器总是出现段错误而崩溃，请采取如下措施： 在 /usr/share/zoneinfo/localtime 中提供 localtime 文件：

    # cp /usr/share/zoneinfo/Europe/Berlin /usr/share/zoneinfo/localtime

### 更好的 MTP 支持

如果不支持 UMS 的 Android 设备，mtpfs 会很慢，可以使用 AUR 中的 jmtpfs。参见 MTP 以获得更多选择。

## 参见

- Android Notifier

Category:

- Development (简体中文)