Android SDK总结
希望看到这篇文章的各位永远不会处理Android SDK相关的工作内容,谷歌,我真是超丝你的梦啊!
基础概念
JDK (Java Development Kit)
JDK 是Java开发工具包,它是开发Java应用程序的基础工具集。JDK包含了Java编译器(javac
)、Java运行时环境(JRE)、标准类库以及各种开发工具。
-
用途: 用于编写、编译和运行Java程序。
-
组成
- Java编译器(javac): 将Java源代码编译成字节码。
- Java运行时环境(JRE): 包含Java虚拟机(JVM)和标准类库,用于运行Java程序。
- 开发工具: 如调试器、文档生成器等。
OpenJDK
顾名思义,JDK的开源版本,由 Oracle 主导并由 Java 社区共同开发和维护。OpenJDK 是 JDK 的开源实现,遵循 GPL(GNU General Public License)许可证。
Unity的安卓就是基于此
SDK (Software Development Kit)
SDK 是软件开发工具包,Android SDK是专门用于开发Android应用程序的工具集。它包含了开发Android应用所需的所有工具和库。
- 用途: 用于开发、调试和测试Android应用程序。
SDK Platform
即我们最常见的Android 28,29,30此类说明
- API Libraries: 提供了 Android 平台的核心 API 和类库,开发者可以使用这些 API 来构建应用程序。
- System Images: 用于在 Android 模拟器中运行不同版本的 Android 系统。
SDK Tools
- Android SDK Tools: 包含了基本的开发工具,如
adb
(Android Debug Bridge)、fastboot
等。 - Android SDK Platform-Tools: 包含了与 Android 平台相关的工具,如
adb
、dmtracedump
、sqlite3
等。 - Android SDK Build-Tools: 包含了构建应用程序所需的工具,如
aapt
、dx
、zipalign
、apksigner
等。- 最多关注的就是Build-Tools,他是构建安卓的基石,值得一提的是,往往最经常出问题的就是因为Build-Tools版本和SDK Platform之间各种版本问题
SDK Manager
- SDK Manager: 用于下载和管理 Android SDK 组件的工具。你可以通过 SDK Manager 安装不同版本的 SDK Platform、Build-Tools等。
尤其需要注意的是,在各个平台中,需要使用各自的Android Studio来下载和配置SDK,不要跨平台复制下载好的SDK包,否则会有各种问题
compileSdkVersion && buildToolsVersion
compileSdkVersion
指定了编译应用程序时使用的Android SDK版本。它决定了你可以使用哪些API和功能。以下是一些关键点:
- API Level:
compileSdkVersion
是一个整数,表示Android API级别。例如,compileSdkVersion 30
表示使用API Level 30(Android 11)进行编译。 - 编译时检查: 这个版本决定了编译器在编译时可以访问的API。如果你使用了高于这个版本的API,编译器会报错。
- 不影响运行时:
compileSdkVersion
只影响编译时的API可用性,不影响应用程序的运行时行为。运行时行为由minSdkVersion
和targetSdkVersion
决定。
buildToolsVersion
指定了构建工具的版本,这些工具包括 aapt
、dx
、zipalign
等。构建工具用于将你的代码、资源和库打包成一个APK文件。以下是一些关键点:
- 版本号:
buildToolsVersion
是一个字符串,表示构建工具的版本号。例如,buildToolsVersion "30.0.3"
。 - 工具链: 这个版本决定了使用哪个版本的构建工具链来构建你的应用程序。
- 兼容性: 通常,
buildToolsVersion
应该与compileSdkVersion
保持一致或使用最新的构建工具版本,以确保兼容性和获得最新的功能和修复。
关系和最佳实践
- 同步更新: 通常情况下,
compileSdkVersion
和buildToolsVersion
应该同步更新,以确保使用最新的API和构建工具。(但是如果实在构建不通过,也可以尝试不同的组合,例如较低的buildToolsVersion(32)来构建较高的compileSdkVersion(33)) - 向后兼容: 虽然你可以使用较新的
buildToolsVersion
来构建较旧的compileSdkVersion
,但为了获得最佳兼容性和性能,建议保持它们的一致性。 - 定期更新: 定期更新
compileSdkVersion
和buildToolsVersion
可以确保你使用最新的API和工具,获得最新的功能和修复。
AndroidManifest.xml && MainActivity.java
AndroidManifest.xml
文件是 Android 应用的配置文件,定义了应用的基本信息、权限、组件和其他配置。它位于 Assets/Plugins/Android
目录下(如果你需要自定义它)。
主要内容和用途
- 应用信息: 包括应用的包名、版本号、图标、主题等。
- 权限声明: 定义应用需要的权限,如访问网络、读取存储等。
- 组件声明: 定义应用的四大组件(Activity、Service、BroadcastReceiver、ContentProvider)。
- Intent 过滤器: 定义哪些 Intent 可以启动哪些组件。
- 其他配置: 如硬件特性、最小 SDK 版本、目标 SDK 版本等。
1 | <manifest xmlns:android="http://schemas.android.com/apk/res/android" |
MainActivity
是 Android 应用的主入口点,通常是用户启动应用时首先看到的界面。在 Unity 中,MainActivity
通常由 Unity 自动生成和管理,但你可以通过自定义 MainActivity
来扩展其功能。
activity属性
在 AndroidManifest.xml
文件中,<activity>
元素用于声明应用中的一个活动(Activity)。活动是 Android 应用的基本组件之一,通常表示一个单独的用户界面屏幕。每个活动都需要在 AndroidManifest.xml
文件中进行声明,以便系统知道它的存在,并能够正确地启动和管理它。
android:name
指定活动的类名。可以是全限定类名(例如 com.example.myapp.MainActivity
),也可以是相对类名(例如 .MainActivity
),相对类名会自动解析为应用包名下的类。
1 | <activity android:name=".MainActivity" /> |
android:label
指定活动的标签,通常用于显示在用户界面上,例如在任务管理器中显示的活动名称。可以直接指定字符串,也可以引用资源文件中的字符串。
1 | <activity android:label="@string/app_name" /> |
android:theme
指定活动的主题,覆盖应用的全局主题。
1 | <activity android:theme="@style/CustomTheme" /> |
android:configChanges
指定活动在配置变化(如屏幕旋转、语言更改)时不重新创建,而是调用 onConfigurationChanged
方法。
1 | <activity android:configChanges="orientation|screenSize" /> |
android:launchMode
指定活动的启动模式,控制活动在任务栈中的行为。常见的值包括:
standard
: 默认模式,每次启动活动都会创建一个新的实例。singleTop
: 如果活动已经位于任务栈的顶部,则重用该实例,否则创建新的实例。singleTask
: 如果活动已经存在于任务栈中,则重用该实例,并清除其上的所有活动。singleInstance
: 创建一个单独的任务栈来管理该活动的实例。
1 | <activity android:launchMode="singleTop" /> |
Intent Filter
<intent-filter>
元素用于声明活动可以响应的 Intent。它包含 <action>
和 <category>
元素,用于指定活动可以处理的操作和类别。
指定活动可以处理的操作。常见的操作包括 android.intent.action.MAIN
(主入口)和 android.intent.action.VIEW
(查看操作)。
1 | <action android:name="android.intent.action.MAIN" /> |
指定活动的类别。常见的类别包括 android.intent.category.LAUNCHER
(启动器)和 android.intent.category.DEFAULT
(默认类别)。
1 | <category android:name="android.intent.category.LAUNCHER" /> |
示例
以下是一个完整的 <activity>
元素示例,展示了如何声明一个主活动,并配置其标签、主题、启动模式和 Intent 过滤器:
1 | <activity |
自定义 MainActivity
如果你需要自定义 MainActivity
,可以在 Assets/Plugins/Android
目录下创建一个自定义的 MainActivity
类,并在 AndroidManifest.xml
中引用它。
1 | package com.example.myapp; |
在 AndroidManifest.xml
中引用自定义的 MainActivity
:
1 | <activity android:name="com.example.myapp.MainActivity"> |
Unity 与 Android 的集成
- 自动生成: Unity 在构建 Android 项目时,会自动生成
AndroidManifest.xml
和MainActivity
文件。如果你不需要自定义这些文件,Unity 会使用默认配置。 - 自定义: 如果你需要自定义
AndroidManifest.xml
或MainActivity
,可以在Assets/Plugins/Android
目录下创建这些文件。Unity 会在构建时使用你提供的自定义文件。
常见用途
- 添加权限: 在
AndroidManifest.xml
中添加应用需要的权限。 - 自定义启动界面: 通过自定义
MainActivity
,你可以在应用启动时执行特定的操作,如显示启动画面、初始化第三方 SDK 等。 - 配置应用特性: 在
AndroidManifest.xml
中配置应用的特性,如支持的屏幕方向、硬件特性等。
Gradle
Gradle 是一个开源的构建自动化工具,专门用于项目的构建、依赖管理和部署。它是Android项目的默认构建工具。
我们经常看到的各种以gradle作为后缀的文件就是Gradle的描述文件
-
用途: 用于自动化构建过程,包括编译代码、打包APK、运行测试、管理依赖等。
-
特点
- 灵活性: 支持多种语言和平台,具有高度的可配置性。
- 依赖管理: 通过Maven或Ivy仓库管理项目依赖。
- 插件系统: 通过插件扩展功能,如Android插件、Java插件等。
android属性
在 Gradle 构建系统中,android
属性块是用于配置 Android 项目的核心部分。它定义了项目的基本信息、构建类型、产品风味、签名配置等。以下是对 android
属性块的详细解释和示例:
android
属性块通常位于项目的 build.gradle
文件中,通常是模块级别的 build.gradle
文件(例如 app/build.gradle
)。
1 | android { |
NDK (Native Development Kit)
NDK 是本地开发工具包,允许开发者使用C和C++编写Android应用程序的部分代码。NDK提供了编译本地代码的工具和库。
-
用途: 用于编写高性能的本地代码,如游戏引擎、图像处理、音频处理等。
-
组成
- 编译工具链: 如GCC或Clang编译器,用于编译C/C++代码。
- 本地库: 提供了Android平台的本地API,如OpenGL、OpenSL ES等。
- 构建工具: 如ndk-build、CMake等,用于构建本地代码。
常见问题
Could not determine the dependencies of task ‘:unityLibrary:compileReleaseJavaWithJavac’.
一般而言下一行就会说明具体的报错原因,搜索解决即可
如果显示Cannot query the value of this provider because it has no value available.,那么就需要注意在gradle文件中定义的compileSdkVersion && buildToolsVersion
对应的SDK Platform && Build-Tools
版本版本是否已经通过SDK Manager下载(建议通过Android Studio拉起并下载)
如果确定都已下载,则尝试将版本调整为一致,例如compileSdkVersion为34,buildToolsVersion也调整34.0.0
如果还不行,就需要挨个版本调整并尝试Build,直到可以正常出包,和算命一样的
一般而言即可解决
Plugin with id ‘com.xxx.xxx’ not found
一般而言都是缺少了依赖
在settingsTemplate.gradle文件里的buildscript中添加对应classpath依赖即可,例如
1 | buildscript { |
总结
大家可以看到,SDK接入过程中有茫茫多的配置需要留意,稍不留神就会给出完全不相干的报错,让人摸不到头脑
如果从报错看不出任何信息,不妨尝试提高或降低compileSdkVersion的版本,往往能解决问题
祝大家在安卓算命届有自己的一席之地