什么时候开始签过名的 apk 无法直接解压了?

2018-01-11 19:21:50 +08:00
 Totato5749
如题,刚才试了下自己打包的 apk,发现解压会报错。buildtoolsversion 26.0.2 和 27.0.3 都是,但是打包的是没签名的 apk 还是可以直接解压看到资源的

可是我记得以前就算别人签过名的 apk 一样可以随意解压看资源的啊? 这改变啥时候开始的?
10505 次点击
所在节点    Android
6 条回复
Totato5749
2018-01-11 19:49:08 +08:00
emmm。。。找到原因了。。

Conclusion: 因为 APK 使用了 Signature Scheme V2 签名的缘故。

另外,也不是说使用了 v2 签名的 apk 真的无法解压了,在 macOS 上使用自带 ZIP 工具解压直接报错。但是用第三方压缩工具还是能打开的,只是提示有错误,需要手动选择忽略错误并继续。也能看到图片素材长啥样。这里我用了 BetterZIP 得出的结论。Windows 上我猜第三方的比如 WinRAR 应该也能打开。

此外,V1 签名( Jar Signature )和未签名应用本身就是 zip 包,可以直接解压。
Totato5749
2018-01-11 19:50:14 +08:00
背景:Android 7.0 引入一项新的应用签名方案 APK Signature Scheme v2,它能提供更快的应用安装时间和更多针对未授权 APK 文件更改的保护。在默认情况下,Android Studio 2.2 和 Android Plugin for Gradle 2.2 会使用 APK Signature Scheme v2 和传统签名方案来签署您的应用。

ref: https://developer.android.com/about/versions/nougat/android-7.0.html#apk_signature_v2
Totato5749
2018-01-11 19:57:54 +08:00
从 Android Studio 2.2 和 Android Plugin for Gradle 2.2 开始默认就使用 V2 签名了。但是也可以在 gradle 中自定义是否使用 v2 签名。

可以在 app 级别的 build.gradle 中添加来自定义是否使用 v1 及 v2 签名
```
signingConfigs {
debug {
v1SigningEnabled true
v2SigningEnabled true
}
release {
v1SigningEnabled true
v2SigningEnabled true
}
}
```

因为每个签名有两种选择,也就是一共会产生四种结果:
v1 false & v2 false: 打包出来的 apk 就是未签名的应用,无法直接安装。
v1 true & v2 false: apk 仅使用 v1 签名,兼容全部版本平台。
v1 false & v2 true: apk 仅使用 v2 签名,应用仅可在 Android 版本大于等于 7.0 以上安装,在 7.0 以下无法安装。
v1 true & v2 true: apk 同时使用 v1 v2 签名,兼容全部版本平台。(推荐)
zhouquanbest
2018-01-12 08:03:08 +08:00
v2 改名为 zip 依旧随便解压 没有本质区别
Totato5749
2018-01-12 08:57:15 +08:00
@zhouquanbest 会报错
Vvfan
2018-01-12 10:54:43 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/422138

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX