AAPT打包使用总结及命令签名说明

1、概述

AAPT即Android Asset Packaging Tool,在SDK的build-tools目录下。该工具可以查看、创建、更新ZIP格式的文档附件(zip、jar、apk)。也可将资源文件编译成二进制文件,尽管你可能没有直接使用过aapt工具,但是build scripts和IDE插件会使用这个工具打包apk文件构成一个Android应用程序。在使用aapt之前需要在环境变量里面配置SDK-tools路径,或者是路径+aapt的方式进入aapt。

2、Android构建APK流程

上图是Google官方发布的一张非常经典的Apk打包流程图。

流程概述:

  1. 工程的资源文件(res文件夹下的文件),通过AAPT打包成R.java类(资源索引表),以及.arsc资源文件。
  2. 如果有aidl,通过aidl工具,打包成java接口类
  3. R.java和aidl.java通过java编译 成想要的.class文件
  4. 源码class文件和第三方jar或者library通过dx工具打包成dex文件、dx工具的主要作用是将java字节码转换成Dalvik字节码,在此过程中会压缩常量池,消除一些冗余信息等。
  5. Apkbuilder工具会将所有没有编译的资源、.arsc资源、.dex文件打包到一个完成apk文件中。
  6. 签名,5中完成apk通过配置的签名文件,jarsigner工具会对齐签名。得到一个签名后的apk
  7. ZipAlign工具对6中的signed.apk进行对齐处理,所谓对齐,主要过程是将apk包中所有的资源文件距离文件其实偏移为4字节整数倍,这样通过内存映射访问apk文件时的速度会更快。对齐的作用主要是为了减少运行时内存的使用。

总结:

结合实际主题资源包打包需求,我们只分析AAPT打包命令说明、签名工具的使用(window环境和linux环境)、ZipAlign对齐工具的使用。

3、AAPT打包命令说明

android 编译资源打包资源文件的命令。

  • -d:包括一个或多个设备资源,由逗号分隔;
  • -f:覆盖现有的文件命令,加上后编译生成直接覆盖目前已经存在的R.java;
  • -m:使生成的包的目录放在-J参数指定的目录;
  • -u:更新现有的包 u = update;
  • -v:详细输出,加上此命令会在控制台输出每一个资源文件信息,R.java生成后还有注释。
  • -x:创建扩展资源ID;
  • -z:需要本地化的资源属性标记定位。
  • -M:AndroidManifest.xml的路径
  • -0:指定一个额外的扩展. apk文件将不会存储压缩
  • -g:制定像素迫使图形的灰度
  • -j:指定包含一个jar或zip文件包,这个命令很特别
  • –debug-mode:指定的是调试模式下的编译资源;
  • –min-sdk-versopm VAL:最小SDK版本 如是7以上 则默认编译资源的格式是 utf-8
  • –target-sdk-version VAL:在androidMainfest中的目标编译SDK版本
  • –app-version VAL:应用程序版本号
  • –app-version-name TEXT:应该程序版本名字;
  • –custom-package VAL:生成R.java到一个不同的包
  • –rename-mainifest-package PACKAGE:修改APK包名的选项;
  • –rename-instrumentation-target-package PACKAGE:重写指定包名的选项;
  • –utf16:资源编码修改为更改默认utf – 16编码;
  • –auto-add-overlay:自动添加资源覆盖
  • –max-res-version:最大资源版本
  • -I:指定的SDK版本中android.jar的路径
  • -A:assert文件夹的路径
  • -G:一个文件输出混淆器选项,后面加文件逗号隔开.
  • -P:指定的输出公共资源,可以指定一个文件 让资源ID输出到那上面;
  • -S:指定资源目录 一般是 res
  • -F:指定把资源输出到 apk文件中
  • -J:指定R.java输出的路径
  • raw-file-dir:附加打包进APK的文件

该命令也是aapt最核心、最复杂的命令。这边我只尝试了一下简单的实践,讲工程的资源编译到一个包里。下面是命令

aapt package -f -S ..\SkinChangeOverlay\SkinChangeOverlay\res -M ..\SkinChangeOverlay\SkinChangeOverlay\AndroidManifest.xml -I ..\android.jar -F ..\SkinChangeOverlay\output_unsign.apk

4、对齐处理(zipalign)

zipalign 是一种归档对齐工具,可对 Android 应用 (APK) 文件提供重要的优化。其目的是要确保所有未压缩数据的开头均相对于文件开头部分执行特定的对齐。具体来说,它会使 APK 中的所有未压缩数据(例如图片或原始文件)在 4 字节边界上对齐。这样一来,即可使用 mmap() 直接访问所有部分,即使其中包含具有对齐限制的二进制数据也没关系。这样做的好处是可以减少运行应用时消耗的 RAM 容量。

在将 APK 文件分发给最终用户之前,必须先使用此工具对齐文件。您可以使用 Android 编译工具来完成此操作。Android Studio 会自动对齐您的 APK

命令用法:

要对齐 infile.apk 并将其保存为 outfile.apk,请运行以下命令:

zipalign [-f] [-v] <alignment> infile.apk outfile.apk

实际用例:

zipalign -v -p 4 ..\SkinChangeOverlay\output_unsign.apk ..\SkinChangeOverlay\output.apk

5、系统签名

5.1、windows环境

 

  • 获取apksigner.jar

把android源码目录/prebuilts/sdk/tools/windows/lib下的apksigner.jar拷贝到指定目录。

  • 平台证书文件(platform.pk8、platform.x509.pem)获取

文件在android源码目录/device/fsl/common/security里

  • 系统jks证书生成(只能在linux环境下生成jks证书)
  • keytool-importkeypair工具的下载
  • 把平台证书文件(platform.pk8、platform.x509.pem)拷贝到与keytool-importkeypair同一个文件夹下。
  • keytool-importkeypair命令说明
./keytool-importkeypair -k ./platform.keystore -p android -pk8 platform.pk8 -cert platform.x509.pem -alias platform

-k 表示要生成的 keystore 文件的名字,这里命名为 platform.keystore
-p 表示要生成的 keystore 的密码,这里是 android
-pk8 表示要导入的 platform.pk8 文件
-cert 表示要导入的platform.x509.pem
-alias 表示给生成的 platform.keystore 取一个别名,这是命名为 platform
实际用例

./keytool-importkeypair -k ccs2/systemsignccs2.jks -p hsae2020 -pk8 ccs2/platform.pk8 -cert ccs2/platform.x509.pem -alias hsaeccs2

然后把生成的jks证书文件拷贝到与apksigner.jar同一目录中。

  • apksigner.jar签名工具命令说明

 

实际用例:

java -jar ..\singer\ccs2\apksigner.jar sign --ks ..\singer\ccs2\systemsignccs2.jks --ks-key-alias hsaeccs2 --ks-pass pass:hsae2020 --out ..\SkinChangeOverlay\output.apk ..\SkinChangeOverlay\output.apk

5.2、linux环境

  • 获取signapk.jar

把android源码目录/out/soong/host/linux-x86/framework下的signapk.jar拷贝到指定目录。

  • 平台证书文件(platform.pk8、platform.x509.pem)拷贝到与signapk.jar同一目录中。
  • 签名命令

java -Djava.library.path=../AndroidP/out/host/linux-x86/lib64 -jar signapk.jar platform.x509.pem platform.pk8 output_unsign.apk output.apk

6、参考资料

https://www.jianshu.com/p/8d691b6bf8b4

https://developer.android.google.cn/studio/command-line/zipalign.html

https://www.jianshu.com/p/e1e2fd05bb62

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 当在cmd中执行aapt命令时提示"不是内部或外部命令"的错误信息,通常是因为aapt所在的路径没有被正确的添加到系统的环境变量中。 aaptAndroid Asset Packaging Tool的缩写,在Android开发环境中是一个重要的工具,用于处理和打包Android应用程序的资源文件。要在cmd中成功执行aapt命令,需要将aapt所在的文件夹路径添加到系统的环境变量中,这样系统才能正确找到并执行aapt命令。 解决这个问题的步骤如下: 1. 打开系统的控制面板,点击"系统和安全"。 2. 选择"系统",在左侧面板中点击"高级系统设置"。 3. 在弹出的窗口中点击"环境变量"。 4. 在"系统变量"区域找到"Path"变量,点击"编辑"。 5. 在弹出的窗口中点击"新建",并输入aapt所在的文件夹路径。 例如,如果aapt.exe文件在C:\Android\sdk\build-tools\目录下,则需要添加C:\Android\sdk\build-tools\到环境变量中。 6. 确认添加后,关闭所有窗口,并重新打开一个新的cmd窗口。 7. 在新的cmd窗口中执行aapt命令,应该不再提示"不是内部或外部命令"的错误信息了。 以上就是在cmd中执行aapt命令提示"不是内部或外部命令"的问题的解决方法。 ### 回答2: 在cmd命令行中,如果执行aapt命令时提示"不是内部命令",这是因为系统环境变量中没有配置aapt命令的路径。aaptAndroid应用打包工具(Android Asset Packaging Tool),它可用于提取、创建和打包Android应用资源文件。 要解决这个问题,可以按照以下步骤进行配置: 1. 首先,确认是否已经安装了Android SDK。aapt工具是包含在Android SDK中的。如果没有安装Android SDK,请先下载并安装它。 2. 打开系统环境变量配置窗口。可以通过右键点击"我的电脑"或"此电脑"图标,在弹出的菜单中选择"属性",然后点击"高级系统设置"。 3. 在弹出的系统属性窗口中,选择"高级"选项卡,并点击下方的"环境变量"按钮。 4. 在环境变量窗口中,找到系统变量中的"Path"变量,双击打开它。 5. 在"编辑环境变量"窗口中,点击"新建"按钮,并输入aapt命令所在的路径。该路径通常是Android SDK的安装路径下的"build-tools"文件夹中。例如,可能是:"C:\Android\sdk\build-tools\29.0.2" 6. 确认新添加的路径后,点击"确定"按钮,然后关闭所有窗口。 7. 重新打开一个cmd命令行窗口,再次尝试执行aapt命令,此时应该不再提示"不是内部命令"的错误。 通过以上步骤,我们将aapt命令的路径添加到系统环境变量中,使得操作系统能够找到并执行该命令。 ### 回答3: 当在cmd命令行中执行"aapt"命令时出现"不是内部命令"的错误,可能有以下几个原因: 1. 未正确安装Android SDK: 该错误通常表示Android SDK中没有包含aapt命令或没有正确安装Android SDK。请确保已经正确安装了Android SDK并将其路径正确地添加到系统的环境变量中。 2. 环境变量未配置:可能是因为操作系统的环境变量没有正确配置。当cmd命令行执行命令时,会搜索PATH环境变量中指定的目录来查找可执行文件。如果aapt所在的目录没有被添加到PATH环境变量中,系统无法找到该命令。 3. aapt命令所在路径错误:如果aapt所在的路径没有正确指定或者命令所在路径没有被添加到系统的环境变量中,系统就无法找到该命令。 4. 命令输错:可能是因为在cmd命令行中输入了错误的命令。请检查输入的命令是否正确,并确保命令的拼写正确。 总之,解决该问题的方法可以包括:检查Android SDK的安装和配置、检查系统的环境变量配置、查找正确的aapt命令路径,以及确保正确输入命令
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值