0

我有一个位于 /system/priv-app/MyTestApp 的应用程序。android 源代码环境为 Android P (API 28)。

起初,MyTestApp.apk 是使用 gradle 构建工具 3.6.1 构建的。然后我将它升级到 4.1.0 并构建一个新的 MyTestApp.apk 并在 rom 中预构建它。所以崩溃发生了。

E AndroidRuntime: java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/priv-app/MyTestApp/MyTestApp.apk!/lib/armeabi-v7a/libmytest.so" not found
E AndroidRuntime:       at java.lang.Runtime.loadLibrary0(Runtime.java:1016)
E AndroidRuntime:       at java.lang.System.loadLibrary(System.java:1669)

我拉取文件/system/priv-app/MyTestApp/MyTestApp.apk,解压文件,发现libmytest.so存在。它肯定是由 gradle 构建工具升级引起的。但我找不到原因。任何人都可以提供一些帮助吗?

4

4 回答 4

0

在查看源代码后,我发现在bionic/linker/linker.cpp

if (entry.method != kCompressStored || (entry.offset % PAGE_SIZE) != 0) {
  close(fd);
  return -1;
}

entry.offset % PAGE_SIZE != 0此条件失败。

所以我猜 AGP 4.1+ 的 zipalign 有问题。

仍在调查中。

于 2021-01-08T10:26:21.583 回答
0

只要未定义属性 DONT_UNCOMPRESS_PRIV_APPS_DEXS,Android 构建系统将为特权应用解压缩嵌入在 apk 中的 dex 文件。解压定义如下

# Uncompress dex files embedded in an apk.
#
define uncompress-dexs
$(hide) if (zipinfo $@ '*.dex' 2>/dev/null | grep -v ' stor ' >/dev/null) ; then \
  tmpdir=$@.tmpdir; \
  rm -rf $$tmpdir && mkdir $$tmpdir; \
  unzip -q $@ '*.dex' -d $$tmpdir && \
  zip -qd $@ '*.dex' && \
  ( cd $$tmpdir && find . -type f | sort | zip -qD -X -0 ../$(notdir $@) -@ ) && \
  rm -rf $$tmpdir; \
  fi
endef

使用 AGP 4.0 构建 apk 时,在 uncompress-dexs 后,可以通过 zipalign 工具验证成功。

zipalign -v -c -p 4 MyTestApp.apk

但是当使用 AGP 4.1+(也包括 7.0-alpha)构建时,它无法通过 zipalign 工具进行验证。

但是我还没有找到原因。只是猜测 AGP 4.1+ 中的 apk 存档有一些新变化。

于 2021-01-11T07:37:36.527 回答
0
android.useNewApkCreator=false

在 gradle.properties 中添加这一行可以解决这个问题。

但是从 AGP 3.6+ 开始,这个属性的默认值为 true。所以它不应该是 AGP 4.0 和 AGP 4.1 之间的区别。

我很混乱。可能还有一些其他条件才能生效。

于 2021-01-11T10:48:35.107 回答
0

参考最新代码,uncompress-dexs 方法如下

https://android.googlesource.com/platform/build/+/master/core/definitions.mk#2385

# Uncompress dex files embedded in an apk.
#
define uncompress-dexs
  if (zipinfo $@ '*.dex' 2>/dev/null | grep -v ' stor ' >/dev/null) ; then \
    $(ZIP2ZIP) -i $@ -o $@.tmp -0 "classes*.dex" && \
    mv -f $@.tmp $@ ; \
  fi
endef
于 2021-01-12T03:42:40.800 回答