Android 应用打包和编译技术非常重要,因为它们可以帮助开发者将代码转换成可执行的应用程序,并优化应用程序的性能和稳定性。
1. Gradle
Gradle 是基于 Groovy 语言和 Java 虚拟机(JVM)运行的构建工具,通过它来配置应用程序的构建过程,包括依赖关系管理、资源合并、代码混淆等操作。
Gradle 中最基本的构建块是 Task(任务)。一个 Task 表示一个单独的操作,可以是编译源代码,复制文件,将文件压缩到一个 ZIP 文件中等。下面是一个简单 Gradle build.gradle 文件配置实例:
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "com.example.myapp"
minSdkVersion 23
targetSdkVersion 30
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.google.android.material:material:1.3.0-alpha02'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
}
在上述代码中,我们指定了 Android 编译环境、应用程序包名和版本信息。同时,我们还启用了代码混淆,并使用 ProGuard 进行代码压缩。
Gradle依赖于Groovy语言,并提供了非常强大和灵活的构建脚本语言。常用的Gradle命令有:
- gradle build:编译项目并生成构建结果。
- gradle assemble:编译项目并打包应用程序。
- gradle clean:清除构建结果。
2. ProGuard
ProGuard 是一个可以对 Android 应用进行代码混淆的工具,可以将 Java 类库及相关应用打包成一个 APK 文件,并且将代码混淆,提高应用程序的安全性和稳定性。
ProGuard 主要设置在 app 的 build.gradle 中的 android 部分中,如下所示:
android {
// ...省略其余内容
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
运行 ProGuard 后,所有的 Java 方法和成员变量都被混淆成了一些无意义的字母和数字组合,保证了代码的安全性。
3. R8
R8 是 Android 在 build tools 3.4 及以后版本中新增的代码压缩工具,它能够去除无用的代码、库和符号表,进一步加快应用程序的启动速度和执行效率。
R8 工具配置主要依赖于 Gradle,只需在 app 的 build.gradle 文件中添加以下代码:
android {
// ...省略其余内容
buildTypes {
release {
minifyEnabled true
useProguard false // 禁用 ProGuard
shrinkResources true // 开启资源压缩
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
4. AAPT2
AAPT2 是 Android Asset Packaging Tool 2,它是 Android 应用程序打包中负责资源编译和打包的工具,可以将资源文件转换为二进制格式,使得应用程序体积更小、加载速度更快。
aapt2(Android Asset Packaging Tool 2)是一个用于将应用程序资源打包成可在 Android 设备上使用的二进制格式(APK 文件)的工具。相比于 aapt,aapt2 更快、更健壮,支持增量编译和多线程编译等特性。下面是关于 aapt2 的详细介绍和代码示例:
- aapt2 架构:aapt2 主要由如下模块组成:
- Resource Compiler:专门处理 XML 资源、图片、字体文件等资源,并生成符号表等。
- Resource Linker:将资源转化为 APK 文件,可以检查和解决冲突。
- ZIP archiver:将 APK 文件和其他资文件打包成压缩文件。
- aapt2 常见命令:
- AAPT2 compile:编译资源文件,例如编译 res/layout/main.xml 文件:aapt2 compile -o out/res/ --dir res/
- AAPT2 link:将编译后的资源转化为 APK 文件并链接库,例如链接库和生成 APK 文件:aapt2 link -o app.apk -I android.jar --manifest AndroidManifest.xml --auto-add-overlay --java out
- AAPT2 dump:显示某个资源的信息,例如查询 string 资源:aapt2 dump resources app.apk | grep ‘string/abc_action_bar_home_description’
- 使用 aapt2 编译和打包资源的例子:
- 在 Android Studio 项目根目录下找到 gradle.properties 文件并添加以下配置:
android.enableAapt2=true
- 在 app 的 build.gradle 文件中更新 aaptOptions:
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
...
}
buildTypes {
release {
...
}
}
aaptOptions {
cruncherEnabled = false
useNewCruncher = false
}
}
- 编译和链接应用程序资源并生成 APK 文件:
$ aapt2 compile -o out/res/ --dir res/
$ aapt2 link -o app.apk -I android.jar --manifest AndroidManifest.xml --auto-add-overlay --java out
上面的例子演示了如何使用 aapt2 编译和打包应用程序资源,并生成可以在 Android 设备上安装和运行的 APK 文件。aapt2 还有许多其他功能,例如支持增量编译、优化 APK 文件大小等。但是由于每个项目的需求不同,因此建议仔细查看 aapt2 文档和示例,并结合实际项目进行测试和调整设置。
5. APK 签名
APK 签名是将 Android 应用程序签名以确保应用程序的完整性和来源可信性。APK 签名可以使用 JDK 自带的 keytool 工具生成证书文件,然后使用 apksigner 工具签署应用程序。下面是关于 APK 签名的详细介绍和代码示例:
-
为什么需要进行 APK 签名:APK 签名可以防止应用程序被修改,并确保应用程序来自于可信源。如果没有对应用进行签名,则无法发布到 Google Play Store 上。
-
生成 keystore 文件:keystore 文件包含了私钥和公钥的信息,用于对应用程序进行签名。可以通过 JDK 自带的 keytool 工具生成 keystore 文件,并设置相关参数,例如别名、密码、有效期等。
$ keytool -genkeypair -alias mykey -keyalg RSA -keysize 2048 -validity 10000 -keystore my-release-key.jks
- 对应用程序进行签名:可以使用 apksigner 工具对已生成的 APK 文件进行签名。要执行签名操作,需要提供 keystore 文件的路径、别名和密码,以及要签名的 APK 文件的路径。签名后的 APK 文件将被创建在指定的输出目录中。
$ apksigner sign --key my-release-key.jks --ks-pass pass:mypassword --out app-release.apk app-debug.apk
- 验证签名:可以使用 apksigner 工具验证签名的 APK 文件。在执行此操作之前,需要提供与签名时完全相同的 keystore、别名和密码。
$ apksigner verify --verbose app-release.apk
- 在 Gradle 中进行自动签名:可以在 Gradle 的 build.gradle 文件中自动化签名过程。以下是一个示例:
android {
signingConfigs {
releaseConfig {
storeFile file("../my-release-key.jks")
storePassword "mypassword"
keyAlias "mykey"
keyPassword "mypassword"
}
}
buildTypes {
release {
signingConfig signingConfigs.releaseConfig
...
}
}
}
以上代码将为应用程序的 release 构建类型创建一个签名配置,并在发布新版本应用程序时使用该签名配置。总之,APK 签名是保证 Android 应用程序的完整性和来源可信性的重要步骤。在进行签名时,请记住不要与私钥相关的文件泄露到外部。