我有一个应用程序,位于/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