跳转到内容

Android/Android SDK

来自维基教科书,开放世界中的开放书籍

Android 软件开发者工具包是您用于开发 Android 应用程序的工具。您可以从 这里 获取它。

GUI 和命令行之间的区别

[编辑 | 编辑源代码]

SDK 包含一个用于 Eclipse IDE 的插件,以及可以通过 Ant 构建脚本调用的命令行工具。

大多数开发人员似乎更喜欢 GUI 工具。但是,这使得选择不同的 IDE 或文本编辑器变得困难。此外,复杂的构建需要在构建时执行自定义脚本,只有命令行才能提供处理此问题的灵活性。

原生代码

[编辑 | 编辑源代码]

Android 应用程序不必完全用 Java 编写。可以包含 C/C++ 代码并使用 原生开发工具包 (NDK) 编译它。然后,此代码通过 Java 原生接口 (JNI) 与 Java 代码交互,Dalvik 虚拟机包含该接口的(大部分)完整实现。

您可能希望使用 NDK 的情况

  • 从另一个平台移植 C/C++ 代码。
  • Java 代码太慢——但请注意:“过早优化是万恶之源”(各种归因于 Donald Knuth 或 Tony Hoare)。在尝试加速代码之前,请进行实际测试以确定代码的慢速部分:性能瓶颈通常不在您认为的地方。
  • 分配超过 Java 堆允许的 20MB 的内存。

不使用 NDK 的原因

  • 编译后的代码最终会变得特定于架构。当然,您可以包含针对 ARM 和 MIPS 等的替代版本以涵盖目前可能的情况,但如果 Intel 的 Atom 努力取得成功,并且未来的设备更多地使用x86 芯片,会发生什么?
  • 调试很困难。您不会在 logcat 中看到一个漂亮的 Java 异常回溯,指向错误发生的精确源代码行,而是会得到一个崩溃寄存器转储。但是,可以通过在代码中的战略性位置输出调试消息(见下文日志记录)来缩小错误的范围。

更好的 JNI 胶水

[编辑 | 编辑源代码]

Android 提供的标准 jni.h 使调用 JNI 例程有点麻烦。您可以通过对 jni.h 进行 JNIGlue 处理来改进这一点,它会生成更方便的static inline包装例程。例如,您不必使用

const jclass SystemClass = (**env).FindClass(env, "java/lang/System");,而是可以使用

const jclass SystemClass = JNFindClass(env, "java/lang/System");

日志记录

[编辑 | 编辑源代码]

在 Java 代码中,您可以使用 Log 类将消息写入 logcat,或者直接写入标准 Java System.err 诊断流或 System.out 输出流。在第一种情况下,您可以设置日志级别和用于在消息前面添加前缀的“标记”字符串;在第二种情况下,级别始终为警告 (W),标记始终为“System.err”,在最后一种情况下,级别为信息 (I),标记为“System.out”。

在原生代码中,通常的 stdio 流stdoutstderr已定义,但不起作用——当然,尝试写入stdoutstderr不仅不会在任何地方显示消息,还会导致代码其他地方发生奇怪的崩溃。

相反,您可以使用原生日志记录库。对此没有公开文档,但例程位于 android/log.h 头文件中,您可以将其包含在 C/C++ 代码中。同样,在用于构建原生代码的 Android.mk 中,将 -llog 添加到 LOCAL_LDLIBS 变量的定义中。

以这种方式写入 logcat 的消息看起来像这样:level/tag(pid): text 或者像这样:W/System.err( 1288): test app successfully started

日志级别在 android/log.h 中列出,消息中出现的相应单字母代码为

代码 字符
ANDROID_LOG_UNKNOWN 消息不
出现
ANDROID_LOG_DEFAULT
ANDROID_LOG_VERBOSE V
ANDROID_LOG_DEBUG D
ANDROID_LOG_INFO I
ANDROID_LOG_WARN W
ANDROID_LOG_ERROR E
ANDROID_LOG_FATAL F
ANDROID_LOG_SILENT S

GCC 扩展

[编辑 | 编辑源代码]

NDK 附带的 C 和 C++ 编译器是根据 GCC 构建的,因此您可以使用通常的 GCC 功能。例如,您可以使用 C99 #include <stdbool.h> 并使用bool类型,其值是truefalse,在代码中的条件表达式中使用。您可以通过在Android.mk:

中添加类似这样的行来启用更通用的 C99 功能


LOCAL_CFLAGS += -std=c99

在 Ubuntu 上设置 Android 开发的示例

[编辑 | 编辑源代码]


这是在 Ubuntu 18.04 LTS 中设置典型 Android 开发的演练。

然后按照 Android Studio for Linux 安装说明进行操作(https://android-docs.cn/studio/install#linux)(https://linuxize.com/post/how-to-install-android-studio-on-ubuntu-18-04/)(https://askubuntu.com/questions/634082/how-to-install-android-studio-on-ubuntu

    sudo add-apt-repository ppa:lyzardking/ubuntu-make
    sudo apt update
    sudo apt install ubuntu-make
    umake android

安装 Android Studio 的一种方法:在 Ubuntu 18.04 中使用 Ctrl+Alt+T 打开一个终端窗口,然后运行


然后将桌面上的快捷方式添加到 "~/.local/share/umake/android/android-studio/bin/studio.sh" 文件。

    snap install ubuntu-make --classic
    umake android

安装 Android Studio 的一种方法:(可惜,目前无法与 Ubuntu 18.04 配合使用)在 Ubuntu 中使用 Ctrl+Alt+T 打开一个终端窗口,然后运行

  1. 安装 Android Studio 的另一种方法
  2. https://android-docs.cn/studio 下载“Android Studio for Linux”。
  3. ...



[FIXME: 然后呢?查看 https://askubuntu.com/questions/634082/how-to-install-android-studio-on-ubuntu 了解详细信息。]

设置 Android 开发的示例

[编辑 | 编辑源代码]

这是设置典型 Android 开发的演练。

IDE 将是 Eclipse,因为它非常灵活。下载最新版本(用于 Java 开发和插件开发)。将其解压缩到用户选择的目录中,然后尝试执行它。希望它能正常运行,例如,幸运的是,我们在安装了 Mint 的 32 位版本时,没有选择 64 位版本的 Eclipse。

将编写一个简单的 Hello World Java 程序,以查看 Eclipse IDE 是否有工作的 Java 编译器。至少 Java 运行时应该可以正常工作,因为否则 Eclipse 无法运行。如果不是,请转到 Synaptic 或 Mint 应用程序加载器,找到一个 Java 运行时,例如 2013 年的 openjdk 7。

下一步是获取 Android SDK。在 2013 年 11 月,它是 r22 版本,位于 [1],您需要下载并解压缩它。但是,如果您使用的是 64 位 Mint 环境,它可能无法正常工作,也许 Red Hat 环境可以。要在这种情况下使其正常工作,您需要执行模拟器并查看它的提示。

如果它提示类似于“没有名为 .. tools/emulator 的文件或目录”,那么您可能没有安装 32 位环境,因此请从 Synaptic 软件包管理器中获取 libc 32 位环境。

如果您的用户不是管理员,请先打开一个终端窗口,运行 su,然后输入管理员密码(在安装 Linux Mint 时创建的第一个用户)。然后输入 synaptic,然后安装 libc6-i386。

继续运行模拟器并安装它需要的库,例如 lib32stdc++6。

运行 ./tools/android exec,即使没有 32 位库,它也应该可以正常工作。这样做是为了加载您选择的 Android 平台,例如 4.4 KitKat、4.3 Jelly Bean 或 2.2 Froyo,以及底部 Extras 文件夹中的最新 Android 支持包,因为这可以提供应用程序向后兼容性,例如,使用 Android Froyo API 在 Android Honeycomb 应用程序中,如果您的项目中包含支持库。您还需要至少一个 ARM 系统映像,可能还需要 Intel 系统映像,但每个映像都会延长下载时间,您很容易最终获得 1 GB 的开发工具(或更多),仅仅是为了在 Android 上运行您的 Hello World 应用程序。

在 Eclipse 中安装插件,方法是运行它,并在 Windows 或 Mac OS X 中指定路径,然后进入“帮助”选项,安装所需的包,然后在顶部,通过单击“添加...”按钮添加一个新的软件存储库,并将此 URL 粘贴到“位置”字段中,[2]。然后选择 Android 开发插件(或 ADT,简称),以及 NDK,如果您想在 Android 应用程序中编译本机 C 或 C++ 代码。

之后,在您的 Android 项目中创建一个空白活动,并运行它。

这需要设置,方法是在 Eclipse 中点击“窗口”菜单项和“Android 虚拟设备管理器”,然后选择一个低性能虚拟设备,例如 Nexus One,这样您就不会等到虚拟设备启动而变老。点击 AVD 管理器中的第二个选项卡,然后从左侧列表中选择 Nexus One,右侧的“创建 AVD”按钮将被启用,然后它将使用 ARM 系统映像和任何级别的 Android API 创建一个虚拟设备,但要小心使用“本地 OpenGL”,因为它们的 32 位库可能无法加载,它仍然允许您创建 AVD,但它将无法工作。

之后,您可以尝试创建一个计算器项目,但不要使用 Google 的编程项目,只需使用 MainActivity.xml 文件的布局编辑器,因为您可以将 4 个按钮放在一个水平布局中,复制布局并粘贴以获得其他行。您还可以通过 Ctrl-点击来选择多个按钮,然后在“大纲”视图中右键点击突出显示的按钮,选择菜单项“其他属性...”并选择“OnClick”,然后输入方法名称来接收 onClick buttonPressed。然后创建一个public在 MainActivity.java 文件中,名为 public void buttonPressed(View v) 的方法,并通过使用按钮的标签来识别按钮来处理任何按钮点击。(首先将传入的 v 转换为 Button 对象)

祝您 Android 编程愉快,愿 Google Play 商店的成功与您同在。

华夏公益教科书