针对 R+(版本 30 及更高版本)要求已安装 APK 的 resources.arsc 未压缩存储并在 4 字节边界上对齐

rhd*_*rhd 9 android react-native

我正在尝试将 android 目标 API 从 29 更新到 30。我已更新:

compileSdkVersion           = 30
targetSdkVersion            = 30
buildToolsVersion           = "30.0.2"
Run Code Online (Sandbox Code Playgroud)

zipalign -p -f -v 4该应用程序在根据官方文档签名之前已与一致 。

当我尝试adb install但是.apk我得到:

失败 [-124:installPackageLI 期间解析失败:针对 R+(版本 30 及更高版本)要求已安装 APK 的 resources.arsc 未压缩存储并在 4 字节边界上对齐]

有人在这方面取得过成功吗?

小智 12

我有类似的问题。

观察 zipalign 日志 -在此输入图像描述

它不应该被压缩。如果是的话,那就是问题所在。您需要以某种方式使其不被压缩。它应该看起来像

resources.arsc (OK)
Run Code Online (Sandbox Code Playgroud)

尝试一下 -

unzip -q -o ur-apk.apk -d ur-unzipped-apk-folder
cd ./ur-unziped-apk-folder
zip -n "resources.arsc" -qr ../zipped.apk *
Run Code Online (Sandbox Code Playgroud)

根据官方文档,使用此 zipped.apk 进行对齐和签名。

注意 - 如果面向 Android 11(API 级别 30)或更高版本的应用包含压缩的 resources.arsc 文件或该文件未在 4 字节边界上对齐,则无法安装

https://developer.android.com/about/versions/11/behavior-changes-11#app-packaging https://developer.android.com/studio/build/building-cmdline#sign_cmdline

  • 根据您的评论,我编写了 [GitHub 上提供的一组脚本](https://github.com/mathiures/convert-apk/),用于将任何 `.apk` 转换为与 Android 11 及更高版本兼容的版本。它基本上只是解压缩“resources.arsc”并重新压缩其余部分。为了方便起见,还有另一个脚本来对齐和签署新的“.apk”。cmd.exe 的“.bat”版本和“.sh”版本适用于 Linux 或 Windows 上的 Git Bash。 (2认同)

KJ7*_*LNW 6

如果您进行 zipalign 然后使用旧版本进行签名,jarsigner那么它将在签名过程中取消对齐!

请务必使用较新的apksigner. 在我的系统上它位于~/Android/Sdk/build-tools/32.0.0/apksigner

这是我的 repack-n-sign 脚本。请注意,您可能需要更新 BUILD_TOOLS 路径并将其设置为正确的位置:

#!/bin/sh

BUILD_TOOLS=~/Android/Sdk/build-tools/32.0.0/

if [ -z "$1" ]; then
        echo "usage: $0 your-app.apk"
        exit 1
fi

DIR=`mktemp -d`
DN=`dirname "$1"`
BN=`basename "$1"`
OUT="$DN/repacked-$BN"
OUT_ALIGNED="$DN/aligned-$BN"
OUT_SIGNED="$DN/signed-$BN"

# Debug mode
set -x

# Repack without the META-INF in case it was already signed
# and flag resources.arsc as no-compress:
unzip -q "$1" -d "$DIR"
pushd .
cd $DIR

rm -rf "$DIR/META-INF"
zip -n "resources.arsc" -r ../repacked.$$.apk *

popd

mv "$DIR/../repacked.$$.apk" "$OUT"

# Align
rm -f "$OUT_ALIGNED"
"$BUILD_TOOLS"/zipalign -p -v 4 "$OUT" "$OUT_ALIGNED"

# Verify
"$BUILD_TOOLS"/zipalign -vc 4 "$OUT_ALIGNED"

# Sign
"$BUILD_TOOLS"/apksigner sign -verbose -ks ~/my-release-key.keystore --out "$OUT_SIGNED" "$OUT_ALIGNED"

# Cleanup
rm -rf "$DIR"

echo == Done: $OUT_ALIGNED
Run Code Online (Sandbox Code Playgroud)