记加密软件导致Android8.1编译失败的解决过程

最近拿到了MTK6739 Android8.1的源码,但是在编译过程中总是失败,而其7.1的编译就没问题。最开始以为是代码问题,于是在虚拟机上面进行编译,但是最终编译成功。通过一步一步的解决,最终编译成功,于是对整个过程进行记录。

第一个问题,如下图提示:

最后发现是因为加密了.a.tmp文件,然后联系管理员吧.a.tmp文件加入了忽略策略。

第二个问题,如下图:


最开始使用的 sunjdk8,编译的时候报这个错误,看样子是lambda表达式的原因。因为使用的是sunjdk8,所以考虑换成openjdk8,但是在通过
sudo add-apt-repository ppa:openjdk-r/ppa 安装openjdk的时候出现了无法下载,导致一直安装不上,然后去找了其他服务器复制了/usr/lib/jvm/java-8-openjdk-amd64文件夹到此服务器。最终没有报此错误。

第三个问题,如下图:

执行命令如下图:

注:以后每次修改了文件都是删除了 out/host/linux-x86/bin/dex2oatd、out/host/linux-x86/bin/dex2oat 文,然后进行重新编译,不然可能导致修改以后没有效果。

最开始以为out/target/product/**/symbols/system/framework/arm/boot.oat,不存在,但是在该目录下面找到了该文件,猜测不正确。

发现日志上面有dex2oat.cc:2232记录,但是不知道该文件位于何处,所以通过find . -name “dex2oat.cc” 命令进行查找。最终在 art\dex2oat 目录下载找到该文件,如下图。

找到对应内容,如下图:

修改文件,进行日志打印,如下图:

日志如下图:

通过搜索 Resource temporarily unavailable 关键词发现是linux的打开文件数量的限制,目前的限制如下图:

然后通过修改 /etc/security/limits.conf 文件修改到90000以后还是报此错误。所以说明没有找到问题所在。

此时通过只能通过Copy方法去找思路,如下图:

但是不知道文件位置,先通过 grep “unique_ptr” art/ -r,但是匹配文件过多,此方法不适合。于是切换关键词为:OpenFileForReading,找到了 art/runtime/os_linux.cc 、art/runtime/oat_file.cc 文件。

在os_linux.cc文件中找到了一个关键词 base/unix_file/fd_file.h ,并进行跟踪,如下图:

在该文件中找到了Copy方法,如下图:

加入日志,如下图:

结果如下图:

于是搜索sendfile方法的解释,文章链接 ,所以考虑是不是因为这个零拷贝技术导致绕过了加密软件。于是修改 dex2oat.cc 文件,换另外一种复制方式(来源于Android7.1代码),修改如下图:

删除 out/host/linux-x86/bin/dex2oatd、out/host/linux-x86/bin/dex2oat 文件,然后重新编译成功。

总结:此次发现问题到解决问题一共花费了一周的时间,其实这个时间是有点长的,主要是因为不太熟悉的原因吧。(我是做应用开发来的,对这方面感兴趣,然后公司又缺人,就顶上去了。)然后为了可以使用vnc安装了vnc4server,但是现在发现没法使用usb了,不知道是什么原因。以为安装gnome可以恢复正常,但是事实证明不行。本来是打算4月20日在家弄的,但是4月19日晚上在家远程电脑卸载gnome的时候使用了 sudo apt-get autoremove ,在没看清的情况下卸载了network-manager,然后电脑就失联了。于是4月20日下午去了公司加班到7点,但是功夫没有白费,刷机也是正常的。好了就这样吧。

You May Also Like

About the Author: ice.zhai

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注