Android 应用打包和编译技术

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 的详细介绍和代码示例:

  1. aapt2 架构:aapt2 主要由如下模块组成:
  • Resource Compiler:专门处理 XML 资源、图片、字体文件等资源,并生成符号表等。
  • Resource Linker:将资源转化为 APK 文件,可以检查和解决冲突。
  • ZIP archiver:将 APK 文件和其他资文件打包成压缩文件。
  1. 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’
  1. 使用 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 签名的详细介绍和代码示例:

  1. 为什么需要进行 APK 签名:APK 签名可以防止应用程序被修改,并确保应用程序来自于可信源。如果没有对应用进行签名,则无法发布到 Google Play Store 上。

  2. 生成 keystore 文件:keystore 文件包含了私钥和公钥的信息,用于对应用程序进行签名。可以通过 JDK 自带的 keytool 工具生成 keystore 文件,并设置相关参数,例如别名、密码、有效期等。

$ keytool -genkeypair -alias mykey -keyalg RSA -keysize 2048 -validity 10000 -keystore my-release-key.jks
  1. 对应用程序进行签名:可以使用 apksigner 工具对已生成的 APK 文件进行签名。要执行签名操作,需要提供 keystore 文件的路径、别名和密码,以及要签名的 APK 文件的路径。签名后的 APK 文件将被创建在指定的输出目录中。
$ apksigner sign --key my-release-key.jks --ks-pass pass:mypassword --out app-release.apk app-debug.apk
  1. 验证签名:可以使用 apksigner 工具验证签名的 APK 文件。在执行此操作之前,需要提供与签名时完全相同的 keystore、别名和密码。
$ apksigner verify --verbose app-release.apk
  1. 在 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 应用程序的完整性和来源可信性的重要步骤。在进行签名时,请记住不要与私钥相关的文件泄露到外部。

猜你喜欢

转载自blog.csdn.net/weixin_44008788/article/details/130951305