How to solve QSEECOMD on AOSP

为Nexus 5编译自己修改后的 AOSP 已经很长一段时间了,但一直以来,都遇到其频繁打印一段日志,不仅严重干扰了视觉,还冲掉了原本有意义的日志信息。

06-07 10:37:25.144 6377 6377 D QSEECOMD: : qseecom listener services process entry PPID = 1
06-07 10:37:25.144 6377 6377 E QSEECOMD: : Listener: index = 0, hierarchy = 0
06-07 10:37:25.144 6377 6377 E QSEECOMD: : Init dlopen(librpmb.so, RLTD_NOW) is failed….
06-07 10:37:25.144 6377 6377 E QSEECOMD: : ERROR: RPMB_INIT failed, shall not start listener services

实在不愿再忍受,要么找出打日志的代码,加上注释,阻止输出,要么修复问题,从源头上一了百了。

这里我觉得选择彻底修复它,由于我对比过 Factory Image,刷机以后并未看到相同的日志,所以我决定对比 Factory Image,找出差异。根据日志显示librpmb.so失败,那么就从这里入手。

但是,搜索 out/target/product/hammerhead/,也并未找到同名文件,因此基本断定本地编译后的固件应该缺失了这个文件。于是,接着从官方固件里寻找这个文件,从官方网站下载 Factory Image。这里需要注意的是,我本地AOSP是基于6.0.1 mmb29q 这个Tag,因此下载的时候,也就需要找到对应的固件。

得到下载文件后,进行解压缩,然后注意到其中有一个image-hammerhead-mmb29q.zip,继续解压它。
tar zxvf hammerhead-mmb29q-factory-6356d31e.tgz
unzip image-hammerhead-mmb29q.zip

这里就可以看到system.img,这个文件就是打开问题的钥匙,在 Mac OS X 上打开它,并非难事,但是前提是你需要安装 ext4fuse 这个工具,不论是 Homebrew,还是 MacPorts 都可以,这里就不赘述了。

但是直接挂载 system.img 会失败,因为它并未是真正的img文件,这里需要借助simg2img工具
out/host/darwin-x86/bin/simg2img system.img system.img.0
ext4fuse system.img.0 system

完成上述操作后,即可从 system 目录下,查找 librpmb.so,可从 lib 目录下找到它。然后将其拷贝到 out/target/product/hammerhead/system/lib/ ,随后重新编译固件:
make snod

然而问题并没有解决,刷完机以后,看到如下日志信息频繁打印:

06-07 11:39:26.378 2226 2226 D QSEECOMD: : qseecom listener services process entry PPID = 1
06-07 11:39:26.378 2226 2226 E QSEECOMD: : Listener: index = 0, hierarchy = 0
06-07 11:39:26.379 2226 2226 D QSEECOMD: : Init dlopen(librpmb.so, RTLD_NOW) succeeds
06-07 11:39:26.379 2226 2226 D QSEECOMD: : Init::Init dlsym(g_FSHandle rpmb_init_service) succeeds
06-07 11:39:26.379 2226 2226 I rpmb : RPMB Mult = 16384, Rel_sec_cnt = 1
06-07 11:39:26.379 2226 2226 E DrmLibRpmb: rpmb_init succeeded! with ret = 0
06-07 11:39:26.379 2226 2226 D QSEECOMD: : Init rpmb_init_service ret = 0
06-07 11:39:26.379 2226 2226 D QSEECOMD: : RPMB system services: init (Listener ID = 8192)
06-07 11:39:26.379 2226 2226 E QSEECOMD: : Listener: index = 1, hierarchy = 0
06-07 11:39:26.379 2226 2226 E QSEECOMD: : Init dlopen(libssd.so, RLTD_NOW) is failed….
06-07 11:39:26.379 2226 2226 E QSEECOMD: : ERROR: SSD_INIT failed, shall not start listener services

不过,这没关系,看样子是 libssd.so 出了问题,按照之前的步骤重新查找,同样可在 lib 目录下找到它,然后拷贝,接着重新编译,刷机以后,日志输出正常,整个世界清静了。

我注意到从搜索引擎里可以看到,上述这个问题存在很久了,大概可以追溯到 Nexus 5 发布,但是官方一直未能解决为什么会缺失这两个动态库,所以我也只能从官方固件里把他们拷贝出来。

Leave a comment

Your comment