Android 应用打包和编译技术

news2024/11/24 5:45:43

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 应用程序的完整性和来源可信性的重要步骤。在进行签名时,请记住不要与私钥相关的文件泄露到外部。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/589255.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【目标检测】yolov5代码实战

文章目录 一、yolov5介绍二、yolov5安装2.1 yolov5的源码下载2.2 预训练模型下载2.3 安装yolov5的依赖项2.4 检测是否安装成功 三、yolov5训练自己的数据集参考资料 一、yolov5介绍 YOLO 是 “You only look once” 缩写 , 是将图像划分为网格系统的对象检测算法,网…

110.(cesium篇)cesium动态河流流水

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: cesium动态河流流水 下面献上完整代码,代码重要位置会做相应解释 <html lang="en

HHDESK及HHDBCS快捷升级功能

为提升用户体验&#xff0c;HHDESK及HHDBCS新增了一项功能&#xff0c;一键升级。 1 使用软件时快捷升级 在产品首页点击帮助&#xff0c;选择软件升级 弹出如下对话框&#xff1b;点击确定 随即弹出对话框&#xff1b;点击浏览&#xff0c;选择下载到本机上的新版本产品…

踢碎破局陷阱,来一场酣畅淋漓的 SLG!

SLG 作为深度策略游戏品类的代表&#xff0c;一直是展现人类智慧之光的最佳舞台之一。欣赏顶尖玩家间的对决是一场大脑的狂欢&#xff0c;奇谋频出、神机莫测般的对局让人不禁摩拳擦掌&#xff0c;跃跃欲试。但当我们打开游戏时&#xff0c;往往是高玩难觅&#xff0c;人机相陪…

3.4. Java集合框架(List、Set、Map等)

Java集合框架是Java提供的一套用于存储和操作数据的接口和类。它包括以下几个主要部分&#xff1a; 接口&#xff1a;集合框架定义了一系列接口&#xff0c;如Collection、List、Set、Map等。实现类&#xff1a;集合框架提供了一些实现这些接口的类&#xff0c;如ArrayList、L…

【HISI IC萌新虚拟项目】cpu_if模块方案文档

该文档仅为参考,如果在进行本系列虚拟项目的学习与实践,请自行完成本部分内容。 由于文档格式在之前博客中已展现,因此本文只针对关键点写一下方案。 cpu_if模块概述 cpu_if模块主要是寄存器单元以及寄存器访问通路的处理,可以看下整体结构图: 因此我们可以概括cpu_if模…

看完这篇 教你玩转渗透测试靶机vulnhub—DarkHole

Vulnhub靶机DarkHole渗透测试详解 Vulnhub靶机介绍&#xff1a;Vulnhub靶机下载&#xff1a;Vulnhub靶机安装&#xff1a;Vulnhub靶机漏洞详解&#xff1a;①&#xff1a;信息收集&#xff1a;②&#xff1a;逻辑漏洞&#xff1a;③&#xff1a;文件上传GetShell&#xff1a;④…

用可编程逻辑器件FPGA LCMXO2-4000HC-6MG132I 实现智能汽车解决方案设计

LCMXO2-4000HC-6MG132I lattice莱迪斯深力科 MachXO2 可编程逻辑器件 (PLD) 由六个超低功耗、即时启动、非易失性 PLD 组成&#xff0c;可提供 256 至 6864 个查找表 (LUT) 的密度。 MachXO2 系列 PLD 提供多种特性&#xff0c;例如嵌入式块 RAM (EBR)、分布式 RAM 和用户闪存 …

PhoneHelper

不一样的手机管理工具 一款基于 Golang 语言开发的手机管理软件——PhoneHelper。 PhoneHelper 是一款支持无线&#xff08;安卓11及以上支持扫码连接&#xff09;和有线的adb方式连接设备并且管理设备的软件&#xff0c;同时已适配 Windows、Linux、MacOS 平台&#xff0c;在不…

在Linux设备上让程序在任意目录都能执行

目录 0. 前言1. 编写代码2. 创建软链接3. 其他Linux文章 0. 前言 在Ubuntu上使用espidf中往往需要先设置环境变量&#xff0c;再执行export.sh&#xff0c;对环境装的乱七八糟的我造成了很大的不便我希望无论我在哪个目录&#xff0c;都能快速执行某个命令 我先是使用了编写b…

2023年高级系统架构设计师 如何备考?

高级架构有一定的难度&#xff0c;但是值得挑战一下 新版《系统架构设计师考试大纲》出版了&#xff01; 可以去官网看看 系统架构设计师是软考的高级科目之一&#xff0c;系统架构设计师一年只有一次考试机会&#xff0c;是在下半年11月份考试 考试科目分为&#xff1a;综合…

Spring5 学习笔记

前置知识&#xff1a; 掌握Java基础知识&#xff08;特别是反射&#xff09;掌握Java注解掌握XML掌握Maven Spring5学习笔记 1、Spring概述1.1、简介1.2、优点1.3、组成1.4、拓展 2、IOC理论推导2.1、分析实现2.2、IOC本质 3、HelloSpring3.1、导入jar包3.2、编写代码3.3、思考…

KUC720AE01 3BHB003431R0001 基于浏览器的简单配置

实时自动化是工业通信领域的最高权威&#xff0c;拥有广泛的网关&#xff0c;可将最多产的工业协议连接到您的MicroLogix、KUC720AE01 3BHB003431R0001、CompactLogix、PLC-5和SLC 5/05 PLC&#xff0c;因此用户可以获得一个简单易用的连接解决方案来集成他们的各种设备。像所有…

黄金期货CFD会亏损吗?有哪些黄金期货CFD常见问题

差价合约(Contract For Difference&#xff0c;CFD)是一种热门的衍生性金融商品&#xff0c;CFD 可以在不实际持有资产的情况下&#xff0c;透过保证金方式来针对股市指数、外汇、贵金属、原物料等商品进行多、空任一方向之交易。投资者在选择黄金交易时&#xff0c;会遇到哪些…

数据结构(二)—— 链表(2)

文章目录 1 143 重排链表1.1 找到原链表的中点&#xff08;「876. 链表的中间结点」&#xff09;。2.2 将原链表的右半端反转&#xff08;「206. 反转链表」&#xff09;3.3 交叉合并两个链表&#xff08;与「21. 合并两个有序链表」思路不同&#xff09;3.4 补充 21 合并两个有…

JavaScript高级一、作用域解构箭头函数

零、文章目录 JavaScript高级一、作用域&解构&箭头函数 1、作用域 &#xff08;1&#xff09;局部作用域 局部作用域分为函数作用域和块作用域。 **函数作用域&#xff1a;**在函数内部声明的变量所在作用域。 函数内部声明的变量&#xff0c;在函数外部无法被访问…

项目冲突3大管理原则及管理模式

1、系统思考原则 此原则即从全局出发&#xff0c;追求全局最优。系统思考原则的关键在于能够从全局出发&#xff0c;发现冲突的“杠杆点”&#xff0c;即可引起结构上重要而持久改善的点。一旦找到最佳的杠杆点&#xff0c;我们便能以小而专注的行动&#xff0c;创造最大的效果…

笔试强训4

作者&#xff1a;爱塔居 专栏&#xff1a;笔试强训 作者简介&#xff1a;大三学生&#xff0c;希望和大家一起进步 目录 day4 day5 day4 1. 下列与队列结构有关联的是&#xff08;&#xff09; A 函数的递归调用 B 数组元素的引用 C 多重循环的执行D 先到先服务的作业调度 对列…

数据表示(二进制、进制转换、补码计算)

目录 1.进制2.进制转换2.1 R进制转十进制2.2 十进制转R进制2.3 m进制转n进制方法1&#xff1a;十进制中转方法2&#xff1a;直接转化 3.进制计算3.1 机器数3.2 编码方式&#xff08;原码、反码、补码、移码&#xff09;3.3 表示范围定点整数定点小数 3.4 定点表示法 4.浮点数4.…

小破站有许多“高质量”东西,怀揣着“学习”的目的,我用Python将它们通通采集下来

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 事情是这样的&#xff0c;昨晚室友拉着我去他的电脑&#xff0c;说带我欣赏一点高雅的作品~ 于是这一坐下&#xff0c;便是一晚上… 作为一个乐于分享的博主&#xff0c;本来我是决定直接分享的&#xff0c; 但是转念一想&a…