希望看到这篇文章的各位永远不会处理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 平台相关的工具,如 adbdmtracedumpsqlite3 等。
  • Android SDK Build-Tools: 包含了构建应用程序所需的工具,如 aaptdxzipalignapksigner 等。
    • 最多关注的就是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可用性,不影响应用程序的运行时行为。运行时行为由 minSdkVersiontargetSdkVersion 决定。

buildToolsVersion 指定了构建工具的版本,这些工具包括 aaptdxzipalign 等。构建工具用于将你的代码、资源和库打包成一个APK文件。以下是一些关键点:

  • 版本号: buildToolsVersion 是一个字符串,表示构建工具的版本号。例如,buildToolsVersion "30.0.3"
  • 工具链: 这个版本决定了使用哪个版本的构建工具链来构建你的应用程序。
  • 兼容性: 通常,buildToolsVersion 应该与 compileSdkVersion 保持一致或使用最新的构建工具版本,以确保兼容性和获得最新的功能和修复。

关系和最佳实践

  • 同步更新: 通常情况下,compileSdkVersionbuildToolsVersion 应该同步更新,以确保使用最新的API和构建工具。(但是如果实在构建不通过,也可以尝试不同的组合,例如较低的buildToolsVersion(32)来构建较高的compileSdkVersion(33))
  • 向后兼容: 虽然你可以使用较新的 buildToolsVersion 来构建较旧的 compileSdkVersion,但为了获得最佳兼容性和性能,建议保持它们的一致性。
  • 定期更新: 定期更新 compileSdkVersionbuildToolsVersion 可以确保你使用最新的API和工具,获得最新的功能和修复。

AndroidManifest.xml && MainActivity.java

AndroidManifest.xml 文件是 Android 应用的配置文件,定义了应用的基本信息、权限、组件和其他配置。它位于 Assets/Plugins/Android 目录下(如果你需要自定义它)。

主要内容和用途

  • 应用信息: 包括应用的包名、版本号、图标、主题等。
  • 权限声明: 定义应用需要的权限,如访问网络、读取存储等。
  • 组件声明: 定义应用的四大组件(Activity、Service、BroadcastReceiver、ContentProvider)。
  • Intent 过滤器: 定义哪些 Intent 可以启动哪些组件。
  • 其他配置: 如硬件特性、最小 SDK 版本、目标 SDK 版本等。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">

<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

</application>

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

</manifest>

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
2
3
4
5
6
7
8
9
10
11
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/CustomTheme"
android:launchMode="singleTop"
android:configChanges="orientation|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

自定义 MainActivity

如果你需要自定义 MainActivity,可以在 Assets/Plugins/Android 目录下创建一个自定义的 MainActivity 类,并在 AndroidManifest.xml 中引用它。

1
2
3
4
5
6
7
8
9
10
11
12
package com.example.myapp;

import android.os.Bundle;
import com.unity3d.player.UnityPlayerActivity;

public class MainActivity extends UnityPlayerActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 在这里添加你的自定义代码
}
}

AndroidManifest.xml 中引用自定义的 MainActivity

1
2
3
4
5
6
<activity android:name="com.example.myapp.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

Unity 与 Android 的集成

  • 自动生成: Unity 在构建 Android 项目时,会自动生成 AndroidManifest.xmlMainActivity 文件。如果你不需要自定义这些文件,Unity 会使用默认配置。
  • 自定义: 如果你需要自定义 AndroidManifest.xmlMainActivity,可以在 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
android {
// 配置 Android 项目的基本信息
compileSdkVersion 30
defaultConfig {
applicationId "com.example.myapp"
minSdkVersion 16
targetSdkVersion 30
versionCode 1
versionName "1.0"
}

// 配置构建类型
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}

// 配置产品风味
flavorDimensions "version"
productFlavors {
free {
dimension "version"
applicationIdSuffix ".free"
versionNameSuffix "-free"
}
paid {
dimension "version"
applicationIdSuffix ".paid"
versionNameSuffix "-paid"
}
}

// 配置签名
signingConfigs {
release {
keyAlias 'myKeyAlias'
keyPassword 'myKeyPassword'
storeFile file('myKeystore.jks')
storePassword 'myStorePassword'
}
}

// 其他配置
buildFeatures {
viewBinding true
}
}

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
2
3
4
5
6
7
8
9
10
11
buildscript {
repositories {
google()
jcenter()
}

dependencies {
classpath 'com.xxx.xxx:4.3.3'
}
}

总结

大家可以看到,SDK接入过程中有茫茫多的配置需要留意,稍不留神就会给出完全不相干的报错,让人摸不到头脑

如果从报错看不出任何信息,不妨尝试提高或降低compileSdkVersion的版本,往往能解决问题

祝大家在安卓算命届有自己的一席之地