将gradle构建工具从3.6.1升级到4.1.0时,特权应用程序的dlopen失败



我有一个应用程序,位于/system/priv app/MyTestApp中。安卓的源代码环境是安卓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构建工具升级引起的。但我找不到原因。有人能帮忙吗?

查看源代码后,我发现在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有问题。

仍在调查中。

只要属性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

当apk使用AGP 4.0构建时,在解压缩dexs后,可以通过ziplign工具验证它的成功。

zipalign -v -c -p 4 MyTestApp.apk

但当使用AGP 4.1+(也包括7.0阿尔法(构建时,它无法通过ziplign工具进行验证。

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

android.useNewApkCreator=false

在grade.properties中添加此行可以解决此问题。

但由于AGP 3.6+,此属性的默认值为true。因此,AGP 4.0和AGP 4.1之间不应存在差异。

我很困惑。也许还有其他一些条件可以发挥作用。

参考最新代码,解压缩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

最新更新