本系列所有文章

  1. 给编译的lineageOS进行签名
你可以通过使用右下角的小齿轮,来开启黑夜模式和阅读模式。

如果你发现文章内容有错漏、你对文章内容有任何改进意见或者你阅读文章遇到了困难,都可以通过博客首页的邮箱联系我。


在使用文档前,我希望你有点基础,能够判断出哪些是完整的执行命令。
部分指令有注解,请耐心将一整段的指令内容看完后再执行。
强烈建议你完整过一遍文档再进行签名操作!!!

对编译的文件进行签名

使用终端进入到下载Android源代码的根目录,运行以下命令,请按需自行修改subject

subject='/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
mkdir ~/.android-certs
for cert in bluetooth cyngn-app media networkstack nfc platform releasekey sdk_sandbox shared testcert testkey verity; do \
./development/tools/make_key ~/.android-certs/$cert "$subject"; \
done

示例:生成并将test-keys替换成你生成的正式密钥

自定义主题(替换组织信息)

subject='/C=CN/ST=Beijing/L=Beijing/O=MyCompany/OU=Android/CN=Android/emailAddress=dev@mycompany.com'

生成密钥

mkdir ~/.android-certs
for cert in bluetooth cyngn-app media networkstack nfc platform releasekey sdk_sandbox shared testcert testkey verity; do \
./development/tools/make_key ~/.android-certs/$cert "$subject"; \
done

编译时使用自定义密钥

export DEFAULT_SYSTEM_DEV_CERTIFICATE=~/.android-certs/releasekey
source build/envsetup.sh
lunch lineage_kebab-userdebug
brunch kebab​

注解:
这是在定义一个 ​​X.509 证书的主题(Subject)​​,用于所有生成的密钥。
C=US:国家代码(美国)。
ST=California:州/省(加利福尼亚)。
L=Mountain View:地区(山景城)。
O=Android:组织名称(Android)。
OU=Android:组织单位(Android)。
CN=Android:通用名称(证书持有者名称)。
emailAddress=android@android.com:联系邮箱。

LineageOS 19.1 及更高版本要求对 APEX 进行重新签名。 每个 APEX 文件都使用两个密钥进行签名:一个用于 APEX 中的微型文件系统映像,另一个用于整个 APEX。

cp ./development/tools/make_key ~/.android-certs/
sed -i 's|2048|4096|g' ~/.android-certs/make_key

然后生成 APEX 密钥,更改下面的行以反映您的信息。【注意下列命令中也有subject,请按需自行修改】
生成没有密码的密钥,您需要为生成的每个 APEX 密钥输入两次空白密码

for apex in com.android.adbd com.android.adservices com.android.adservices.api com.android.appsearch com.android.appsearch.apk com.android.art com.android.bluetooth com.android.btservices com.android.cellbroadcast com.android.compos com.android.configinfrastructure com.android.connectivity.resources com.android.conscrypt com.android.devicelock com.android.extservices com.android.graphics.pdf com.android.hardware.authsecret com.android.hardware.biometrics.face.virtual com.android.hardware.biometrics.fingerprint.virtual com.android.hardware.boot com.android.hardware.cas com.android.hardware.neuralnetworks com.android.hardware.rebootescrow com.android.hardware.wifi com.android.healthfitness com.android.hotspot2.osulogin com.android.i18n com.android.ipsec com.android.media com.android.media.swcodec com.android.mediaprovider com.android.nearby.halfsheet com.android.networkstack.tethering com.android.neuralnetworks com.android.nfcservices com.android.ondevicepersonalization com.android.os.statsd com.android.permission com.android.profiling com.android.resolv com.android.rkpd com.android.runtime com.android.safetycenter.resources com.android.scheduling com.android.sdkext com.android.support.apexer com.android.telephony com.android.telephonymodules com.android.tethering com.android.tzdata com.android.uwb com.android.uwb.resources com.android.virt com.android.vndk.current com.android.vndk.current.on_vendor com.android.wifi com.android.wifi.dialog com.android.wifi.resources com.google.pixel.camera.hal com.google.pixel.vibrator.hal com.qorvo.uwb; do \
subject='/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN='$apex'/emailAddress=android@android.com'; \
~/.android-certs/make_key ~/.android-certs/$apex "$subject"; \
openssl pkcs8 -in ~/.android-certs/$apex.pk8 -inform DER -nocrypt -out ~/.android-certs/$apex.pem; \
done

生成使用密码的密钥,您需要为生成的每个 APEX 密钥输入两次密码。

for apex in com.android.adbd com.android.adservices com.android.adservices.api com.android.appsearch com.android.appsearch.apk com.android.art com.android.bluetooth com.android.btservices com.android.cellbroadcast com.android.compos com.android.configinfrastructure com.android.connectivity.resources com.android.conscrypt com.android.devicelock com.android.extservices com.android.graphics.pdf com.android.hardware.authsecret com.android.hardware.biometrics.face.virtual com.android.hardware.biometrics.fingerprint.virtual com.android.hardware.boot com.android.hardware.cas com.android.hardware.neuralnetworks com.android.hardware.rebootescrow com.android.hardware.wifi com.android.healthfitness com.android.hotspot2.osulogin com.android.i18n com.android.ipsec com.android.media com.android.media.swcodec com.android.mediaprovider com.android.nearby.halfsheet com.android.networkstack.tethering com.android.neuralnetworks com.android.nfcservices com.android.ondevicepersonalization com.android.os.statsd com.android.permission com.android.profiling com.android.resolv com.android.rkpd com.android.runtime com.android.safetycenter.resources com.android.scheduling com.android.sdkext com.android.support.apexer com.android.telephony com.android.telephonymodules com.android.tethering com.android.tzdata com.android.uwb com.android.uwb.resources com.android.virt com.android.vndk.current com.android.vndk.current.on_vendor com.android.wifi com.android.wifi.dialog com.android.wifi.resources com.google.pixel.camera.hal com.google.pixel.vibrator.hal com.qorvo.uwb; do \
subject='/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN='$apex'/emailAddress=android@android.com'; \
~/.android-certs/make_key ~/.android-certs/$apex "$subject"; \
openssl pkcs8 -in ~/.android-certs/$apex.pk8 -inform DER -out ~/.android-certs/$apex.pem; \
done

生成安装包

生成目标文件并对其进行签名,按照设备的构建说明操作后,不要运行构建命令 ,而是改成以下命令:

breakfast <codename>
mka target-files-package otatools

请坐下来等待一段时间。这可能需要一段时间,具体取决于您计算机的规格。当它完成了,你只需要签署所有 APK 和 APEX。

LineageOS 版本 18.1 及更低版本的签名过程:

croot
sign_target_files_apks -o -d ~/.android-certs \
$OUT/obj/PACKAGING/target_files_intermediates/*-target_files-*.zip \
signed-target_files.zip

LineageOS 版本 19.1 及更高版本的签名过程:

croot
sign_target_files_apks -o -d ~/.android-certs \
--extra_apks AdServicesApk.apk=$HOME/.android-certs/releasekey \
--extra_apks FederatedCompute.apk=$HOME/.android-certs/releasekey \
--extra_apks HalfSheetUX.apk=$HOME/.android-certs/releasekey \
--extra_apks HealthConnectBackupRestore.apk=$HOME/.android-certs/releasekey \
--extra_apks HealthConnectController.apk=$HOME/.android-certs/releasekey \
--extra_apks OsuLogin.apk=$HOME/.android-certs/releasekey \
--extra_apks SafetyCenterResources.apk=$HOME/.android-certs/releasekey \
--extra_apks ServiceConnectivityResources.apk=$HOME/.android-certs/releasekey \
--extra_apks ServiceUwbResources.apk=$HOME/.android-certs/releasekey \
--extra_apks ServiceWifiResources.apk=$HOME/.android-certs/releasekey \
--extra_apks WifiDialog.apk=$HOME/.android-certs/releasekey \
--extra_apks com.android.adbd.apex=$HOME/.android-certs/com.android.adbd \
--extra_apks com.android.adservices.apex=$HOME/.android-certs/com.android.adservices \
--extra_apks com.android.adservices.api.apex=$HOME/.android-certs/com.android.adservices.api \
--extra_apks com.android.appsearch.apex=$HOME/.android-certs/com.android.appsearch \
--extra_apks com.android.appsearch.apk.apex=$HOME/.android-certs/com.android.appsearch.apk \
--extra_apks com.android.art.apex=$HOME/.android-certs/com.android.art \
--extra_apks com.android.bluetooth.apex=$HOME/.android-certs/com.android.bluetooth \
--extra_apks com.android.btservices.apex=$HOME/.android-certs/com.android.btservices \
--extra_apks com.android.cellbroadcast.apex=$HOME/.android-certs/com.android.cellbroadcast \
--extra_apks com.android.compos.apex=$HOME/.android-certs/com.android.compos \
--extra_apks com.android.configinfrastructure.apex=$HOME/.android-certs/com.android.configinfrastructure \
--extra_apks com.android.connectivity.resources.apex=$HOME/.android-certs/com.android.connectivity.resources \
--extra_apks com.android.conscrypt.apex=$HOME/.android-certs/com.android.conscrypt \
--extra_apks com.android.devicelock.apex=$HOME/.android-certs/com.android.devicelock \
--extra_apks com.android.extservices.apex=$HOME/.android-certs/com.android.extservices \
--extra_apks com.android.graphics.pdf.apex=$HOME/.android-certs/com.android.graphics.pdf \
--extra_apks com.android.hardware.authsecret.apex=$HOME/.android-certs/com.android.hardware.authsecret \
--extra_apks com.android.hardware.biometrics.face.virtual.apex=$HOME/.android-certs/com.android.hardware.biometrics.face.virtual \
--extra_apks com.android.hardware.biometrics.fingerprint.virtual.apex=$HOME/.android-certs/com.android.hardware.biometrics.fingerprint.virtual \
--extra_apks com.android.hardware.boot.apex=$HOME/.android-certs/com.android.hardware.boot \
--extra_apks com.android.hardware.cas.apex=$HOME/.android-certs/com.android.hardware.cas \
--extra_apks com.android.hardware.neuralnetworks.apex=$HOME/.android-certs/com.android.hardware.neuralnetworks \
--extra_apks com.android.hardware.rebootescrow.apex=$HOME/.android-certs/com.android.hardware.rebootescrow \
--extra_apks com.android.hardware.wifi.apex=$HOME/.android-certs/com.android.hardware.wifi \
--extra_apks com.android.healthfitness.apex=$HOME/.android-certs/com.android.healthfitness \
--extra_apks com.android.hotspot2.osulogin.apex=$HOME/.android-certs/com.android.hotspot2.osulogin \
--extra_apks com.android.i18n.apex=$HOME/.android-certs/com.android.i18n \
--extra_apks com.android.ipsec.apex=$HOME/.android-certs/com.android.ipsec \
--extra_apks com.android.media.apex=$HOME/.android-certs/com.android.media \
--extra_apks com.android.media.swcodec.apex=$HOME/.android-certs/com.android.media.swcodec \
--extra_apks com.android.mediaprovider.apex=$HOME/.android-certs/com.android.mediaprovider \
--extra_apks com.android.nearby.halfsheet.apex=$HOME/.android-certs/com.android.nearby.halfsheet \
--extra_apks com.android.networkstack.tethering.apex=$HOME/.android-certs/com.android.networkstack.tethering \
--extra_apks com.android.neuralnetworks.apex=$HOME/.android-certs/com.android.neuralnetworks \
--extra_apks com.android.nfcservices.apex=$HOME/.android-certs/com.android.nfcservices \
--extra_apks com.android.ondevicepersonalization.apex=$HOME/.android-certs/com.android.ondevicepersonalization \
--extra_apks com.android.os.statsd.apex=$HOME/.android-certs/com.android.os.statsd \
--extra_apks com.android.permission.apex=$HOME/.android-certs/com.android.permission \
--extra_apks com.android.profiling.apex=$HOME/.android-certs/com.android.profiling \
--extra_apks com.android.resolv.apex=$HOME/.android-certs/com.android.resolv \
--extra_apks com.android.rkpd.apex=$HOME/.android-certs/com.android.rkpd \
--extra_apks com.android.runtime.apex=$HOME/.android-certs/com.android.runtime \
--extra_apks com.android.safetycenter.resources.apex=$HOME/.android-certs/com.android.safetycenter.resources \
--extra_apks com.android.scheduling.apex=$HOME/.android-certs/com.android.scheduling \
--extra_apks com.android.sdkext.apex=$HOME/.android-certs/com.android.sdkext \
--extra_apks com.android.support.apexer.apex=$HOME/.android-certs/com.android.support.apexer \
--extra_apks com.android.telephony.apex=$HOME/.android-certs/com.android.telephony \
--extra_apks com.android.telephonymodules.apex=$HOME/.android-certs/com.android.telephonymodules \
--extra_apks com.android.tethering.apex=$HOME/.android-certs/com.android.tethering \
--extra_apks com.android.tzdata.apex=$HOME/.android-certs/com.android.tzdata \
--extra_apks com.android.uwb.apex=$HOME/.android-certs/com.android.uwb \
--extra_apks com.android.uwb.resources.apex=$HOME/.android-certs/com.android.uwb.resources \
--extra_apks com.android.virt.apex=$HOME/.android-certs/com.android.virt \
--extra_apks com.android.vndk.current.apex=$HOME/.android-certs/com.android.vndk.current \
--extra_apks com.android.vndk.current.on_vendor.apex=$HOME/.android-certs/com.android.vndk.current.on_vendor \
--extra_apks com.android.wifi.apex=$HOME/.android-certs/com.android.wifi \
--extra_apks com.android.wifi.dialog.apex=$HOME/.android-certs/com.android.wifi.dialog \
--extra_apks com.android.wifi.resources.apex=$HOME/.android-certs/com.android.wifi.resources \
--extra_apks com.google.pixel.camera.hal.apex=$HOME/.android-certs/com.google.pixel.camera.hal \
--extra_apks com.google.pixel.vibrator.hal.apex=$HOME/.android-certs/com.google.pixel.vibrator.hal \
--extra_apks com.qorvo.uwb.apex=$HOME/.android-certs/com.qorvo.uwb \
--extra_apex_payload_key com.android.adbd.apex=$HOME/.android-certs/com.android.adbd.pem \
--extra_apex_payload_key com.android.adservices.apex=$HOME/.android-certs/com.android.adservices.pem \
--extra_apex_payload_key com.android.adservices.api.apex=$HOME/.android-certs/com.android.adservices.api.pem \
--extra_apex_payload_key com.android.appsearch.apex=$HOME/.android-certs/com.android.appsearch.pem \
--extra_apex_payload_key com.android.appsearch.apk.apex=$HOME/.android-certs/com.android.appsearch.apk.pem \
--extra_apex_payload_key com.android.art.apex=$HOME/.android-certs/com.android.art.pem \
--extra_apex_payload_key com.android.bluetooth.apex=$HOME/.android-certs/com.android.bluetooth.pem \
--extra_apex_payload_key com.android.btservices.apex=$HOME/.android-certs/com.android.btservices.pem \
--extra_apex_payload_key com.android.cellbroadcast.apex=$HOME/.android-certs/com.android.cellbroadcast.pem \
--extra_apex_payload_key com.android.compos.apex=$HOME/.android-certs/com.android.compos.pem \
--extra_apex_payload_key com.android.configinfrastructure.apex=$HOME/.android-certs/com.android.configinfrastructure.pem \
--extra_apex_payload_key com.android.connectivity.resources.apex=$HOME/.android-certs/com.android.connectivity.resources.pem \
--extra_apex_payload_key com.android.conscrypt.apex=$HOME/.android-certs/com.android.conscrypt.pem \
--extra_apex_payload_key com.android.devicelock.apex=$HOME/.android-certs/com.android.devicelock.pem \
--extra_apex_payload_key com.android.extservices.apex=$HOME/.android-certs/com.android.extservices.pem \
--extra_apex_payload_key com.android.graphics.pdf.apex=$HOME/.android-certs/com.android.graphics.pdf.pem \
--extra_apex_payload_key com.android.hardware.authsecret.apex=$HOME/.android-certs/com.android.hardware.authsecret.pem \
--extra_apex_payload_key com.android.hardware.biometrics.face.virtual.apex=$HOME/.android-certs/com.android.hardware.biometrics.face.virtual.pem \
--extra_apex_payload_key com.android.hardware.biometrics.fingerprint.virtual.apex=$HOME/.android-certs/com.android.hardware.biometrics.fingerprint.virtual.pem \
--extra_apex_payload_key com.android.hardware.boot.apex=$HOME/.android-certs/com.android.hardware.boot.pem \
--extra_apex_payload_key com.android.hardware.cas.apex=$HOME/.android-certs/com.android.hardware.cas.pem \
--extra_apex_payload_key com.android.hardware.neuralnetworks.apex=$HOME/.android-certs/com.android.hardware.neuralnetworks.pem \
--extra_apex_payload_key com.android.hardware.rebootescrow.apex=$HOME/.android-certs/com.android.hardware.rebootescrow.pem \
--extra_apex_payload_key com.android.hardware.wifi.apex=$HOME/.android-certs/com.android.hardware.wifi.pem \
--extra_apex_payload_key com.android.healthfitness.apex=$HOME/.android-certs/com.android.healthfitness.pem \
--extra_apex_payload_key com.android.hotspot2.osulogin.apex=$HOME/.android-certs/com.android.hotspot2.osulogin.pem \
--extra_apex_payload_key com.android.i18n.apex=$HOME/.android-certs/com.android.i18n.pem \
--extra_apex_payload_key com.android.ipsec.apex=$HOME/.android-certs/com.android.ipsec.pem \
--extra_apex_payload_key com.android.media.apex=$HOME/.android-certs/com.android.media.pem \
--extra_apex_payload_key com.android.media.swcodec.apex=$HOME/.android-certs/com.android.media.swcodec.pem \
--extra_apex_payload_key com.android.mediaprovider.apex=$HOME/.android-certs/com.android.mediaprovider.pem \
--extra_apex_payload_key com.android.nearby.halfsheet.apex=$HOME/.android-certs/com.android.nearby.halfsheet.pem \
--extra_apex_payload_key com.android.networkstack.tethering.apex=$HOME/.android-certs/com.android.networkstack.tethering.pem \
--extra_apex_payload_key com.android.neuralnetworks.apex=$HOME/.android-certs/com.android.neuralnetworks.pem \
--extra_apex_payload_key com.android.nfcservices.apex=$HOME/.android-certs/com.android.nfcservices.pem \
--extra_apex_payload_key com.android.ondevicepersonalization.apex=$HOME/.android-certs/com.android.ondevicepersonalization.pem \
--extra_apex_payload_key com.android.os.statsd.apex=$HOME/.android-certs/com.android.os.statsd.pem \
--extra_apex_payload_key com.android.permission.apex=$HOME/.android-certs/com.android.permission.pem \
--extra_apex_payload_key com.android.profiling.apex=$HOME/.android-certs/com.android.profiling.pem \
--extra_apex_payload_key com.android.resolv.apex=$HOME/.android-certs/com.android.resolv.pem \
--extra_apex_payload_key com.android.rkpd.apex=$HOME/.android-certs/com.android.rkpd.pem \
--extra_apex_payload_key com.android.runtime.apex=$HOME/.android-certs/com.android.runtime.pem \
--extra_apex_payload_key com.android.safetycenter.resources.apex=$HOME/.android-certs/com.android.safetycenter.resources.pem \
--extra_apex_payload_key com.android.scheduling.apex=$HOME/.android-certs/com.android.scheduling.pem \
--extra_apex_payload_key com.android.sdkext.apex=$HOME/.android-certs/com.android.sdkext.pem \
--extra_apex_payload_key com.android.support.apexer.apex=$HOME/.android-certs/com.android.support.apexer.pem \
--extra_apex_payload_key com.android.telephony.apex=$HOME/.android-certs/com.android.telephony.pem \
--extra_apex_payload_key com.android.telephonymodules.apex=$HOME/.android-certs/com.android.telephonymodules.pem \
--extra_apex_payload_key com.android.tethering.apex=$HOME/.android-certs/com.android.tethering.pem \
--extra_apex_payload_key com.android.tzdata.apex=$HOME/.android-certs/com.android.tzdata.pem \
--extra_apex_payload_key com.android.uwb.apex=$HOME/.android-certs/com.android.uwb.pem \
--extra_apex_payload_key com.android.uwb.resources.apex=$HOME/.android-certs/com.android.uwb.resources.pem \
--extra_apex_payload_key com.android.virt.apex=$HOME/.android-certs/com.android.virt.pem \
--extra_apex_payload_key com.android.vndk.current.apex=$HOME/.android-certs/com.android.vndk.current.pem \
--extra_apex_payload_key com.android.vndk.current.on_vendor.apex=$HOME/.android-certs/com.android.vndk.current.on_vendor.pem \
--extra_apex_payload_key com.android.wifi.apex=$HOME/.android-certs/com.android.wifi.pem \
--extra_apex_payload_key com.android.wifi.dialog.apex=$HOME/.android-certs/com.android.wifi.dialog.pem \
--extra_apex_payload_key com.android.wifi.resources.apex=$HOME/.android-certs/com.android.wifi.resources.pem \
--extra_apex_payload_key com.google.pixel.camera.hal.apex=$HOME/.android-certs/com.google.pixel.camera.hal.pem \
--extra_apex_payload_key com.google.pixel.vibrator.hal.apex=$HOME/.android-certs/com.google.pixel.vibrator.hal.pem \
--extra_apex_payload_key com.qorvo.uwb.apex=$HOME/.android-certs/com.qorvo.uwb.pem \
$OUT/obj/PACKAGING/target_files_intermediates/*-target_files*.zip \
signed-target_files.zip

生成安装包。现在,要生成可安装的 zip,请运行:

ota_from_target_files -k ~/.android-certs/releasekey \
--block --backup=true \
signed-target_files.zip \
signed-ota_update.zip

然后,像往常一样在 recovery 中安装 zip。


指令注解:

mka target-files-package otatools是用于 Android 系统编译的命令,其作用可分为两部分:

target-files-package

​​功能​​:生成一个名为 ​​target-files.zip​​ 的中间文件包,包含构建完整 OTA 更新包所需的全部内容:

  • 系统镜像:system.img、vendor.img、boot.img 等。
  • 设备文件:内核、设备树(dtbo)、专有二进制文件(Blobs)。
  • 元数据:构建指纹(Build Fingerprint)、文件系统结构(META/ 目录)。

用途:

  • 生成OTA增量包(如 incremental_ota_update.zip)。
  • 签名系统镜像(例如用于发布官方固件)。

otatools

​​功能​​:编译与 OTA 相关的工具链,包括:
​​- ota_from_target_files​​:将 target-files.zip 转换为最终 OTA 包的脚本。
​​- sign_target_files_apks​​:签名系统镜像的工具。
​​- img2simg/simg2img​​:处理稀疏镜像(Sparse Image)的工具。
​​路径​​:编译后的工具默认存放在 out/host/linux-x86/bin/(Linux 环境下)。

完整命令的作用

同时执行以下两个任务:

  • 生成 target-files.zip(位于 out/target/product//obj/PACKAGING/target_files_intermediates/)。
  • 编译 OTA 工具链(生成 otatools 相关二进制文件)。

典型使用场景

生成完整 OTA包

  1. 生成 target-files.zip
mka target-files-package
  1. 生成完整 OTA 包(-k 指定签名密钥)
./out/host/linux-x86/bin/ota_from_target_files -k ./keys/releasekey \
out/target/product/kebab/obj/PACKAGING/target_files_intermediates/*.zip \
lineage-21.0-unsigned-kebab-ota.zip

生成增量 OTA 包

  1. 生成旧版本 target-files.zip(例如旧系统版本)
    切换到旧版本代码分支
git checkout old-release-branch

清理旧构建产物(确保无残留)

mka clean

设置构建环境

source build/envsetup.sh
lunch <product_name>-userdebug -->替换为具体设备名

构建 target-files.zip

mka target-files-package
  1. 生成新版本 target-files.zip(例如新系统版本)
    切换到新版本代码分支
git checkout new-release-branch

清理构建环境(关键!避免旧版本干扰)

mka installclean

重新设置环境

source build/envsetup.sh
lunch <product_name>-userdebug #这里需要确保与旧版本同一设备名

构建 target-files.zip

mka target-files-package
  1. 生成增量包(需指定新旧两个 target-files.zip)
# 1. 进入AOSP构建目录
cd <path-to-android-source>
# 2. 初始化构建环境
source build/envsetup.sh
lunch <product_name>-userdebug --> 选择相同的设备名
# 3. 执行增量包生成(关键步骤)
./out/host/linux-x86/bin/ota_from_target_files \
-k vendor/releasekeys/releasekey \ --> 签名密钥(必须指定)
-i old-target_files.zip \ --> 旧版本target-files
new-target_files.zip \ --> 新版本target-files
incremental-ota_update.zip --> 输出的增量包名
  1. 验证生成的增量包
unzip -l incremental-ota_update.zip

请确认包含以下关键文件:

  • META-INF/com/google/android/update-binary
  • patch/
  • system.new.dat
  1. 注意事项​​
    ​​1.依赖关系​​:执行此命令前需确保已完成完整系统编译(例如已执行 brunch kebab)。
    ​​2.签名密钥​​:发布正式 OTA 包需使用私钥签名(-k 参数),测试时可跳过签名步骤。
    ​​3.路径适配​​:根据实际设备代号(如 kebab)和编译环境(如 linux-x86)调整路径。
    ⚠️ 注意:两个版本的 lunch 必须选择相同的 -userdebug,否则会导致 OTA 包生成失败。
    注解:
    linux-x86 表示你的主机是 ​​Linux 操作系统 + x86 架构的 CPU​​。
    如果你在 macOS 上编译,目录会变成 darwin-x86 或 darwin-arm64(Apple Silicon)。
    这一目录是 Android 编译系统自动生成的,无需手动干预。

target-files.zip 结构示例​​:
├── BOOT/
├── IMAGES/ –>系统镜像(system.img, vendor.img 等)
├── META/ –> 元数据(构建信息、文件列表)
├── OTA/ –> OTA 更新脚本
└── SYSTEM/ –> 系统文件(未打包成镜像的原始文件)