Android/Android SDK
Android 软件开发者工具包是您用于开发 Android 应用程序的工具。您可以从 这里 获取它。
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 异常回溯,指向错误发生的精确源代码行,而是会得到一个崩溃寄存器转储。但是,可以通过在代码中的战略性位置输出调试消息(见下文日志记录)来缩小错误的范围。
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 流stdout和stderr已定义,但不起作用——当然,尝试写入stdout或stderr不仅不会在任何地方显示消息,还会导致代码其他地方发生奇怪的崩溃。
相反,您可以使用原生日志记录库。对此没有公开文档,但例程位于 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 |
NDK 附带的 C 和 C++ 编译器是根据 GCC 构建的,因此您可以使用通常的 GCC 功能。例如,您可以使用 C99 #include <stdbool.h>
并使用bool类型,其值是true和false,在代码中的条件表达式中使用。您可以通过在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 打开一个终端窗口,然后运行
- 安装 Android Studio 的另一种方法
- 从 https://android-docs.cn/studio 下载“Android Studio for Linux”。
- ...
[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 商店的成功与您同在。