这个问题是刷完机正常开机后,发现手机无状态栏,下拉通知栏,按音量键也无法出现VolumeDialog,开始看到这个现象感觉是systemUI未编译到版本中去?或者是在systemserver中systemUI的服务为启动?因发现问题的版本是userdebug版本,未抓到第一次开机log,问题也没法定位。

分析该问题的时候,首先我们是从提交记录开始排查,因9月8号出的版本是没问题的,9月9号编译的版本就有问题,9.8日到9.9的提交记录不足10条,frameworks/base下的提交只有两条是我修改VolumeDialog中调节音量滑动条显示问题。为了快速定位问题,我们一边回退修改编译版本复现,查看是哪条提交记录引起的问题,一边抓log分析。Userdebug版本第一次开机后进设置手动打开adb,再次开机就可以抓到android log了。开始怀疑是这里造成systemUI报错,但是很快就排除了这种情况,因为如果这里报错的话,log中肯定能直接打印出来错误信息,但是这里修改添加的log一句都没有打印出来,而且从该问题的现象看,不像是systemUI报错,倒更像是systemUI没有这个应用。接着,adb shell进入system/priv-app,惊奇的发现,systemUI.apk赫然存在于我们系统中,那么此时就能排除systemUI未编译到我们的版本中这种情况。那么只剩下一种情况,就是systemUI存在于系统中,但是并没有启动。为了证实这个猜测,我们去Log里面查看,发现有如下Log:

01-01 08:15:40.318   960   960 I PackageManager: /system/priv-app/SystemUI changed; collecting certs

01-01 08:15:40.540   960   960 W PackageManager: Failed to parse /system/priv-app/SystemUI: Signature mismatch for shared user : SharedUserSetting{a250832 android.uid.systemui/10009}

01-01 08:15:40.540   960   960 W PackageManager: Failed to parse /system/priv-app/SystemUI: Signature mismatch for shared user : SharedUserSetting{a250832 android.uid.systemui/10009}

01-01 08:15:40.540   960   960 D PackageManager: scan package: /system/priv-app/SystemUI , end at: 15322ms. elapsed time = 241ms.

01-01 08:15:43.864   960   960 E BluetoothManagerService: Unable to resolve SystemUI's UID.

01-01 08:15:43.864   960   960 E BluetoothManagerService: android.content.pm.PackageManager$NameNotFoundException: com.android.systemui

其中有关键两句:

01-01 08:15:40.540   960   960 W PackageManager: Failed to parse /system/priv-app/SystemUI: Signature mismatch for shared user : SharedUserSetting{a250832 android.uid.systemui/10009}

01-01 08:15:40.540   960   960 D PackageManager: scan package: /system/priv-app/SystemUI , end at: 15322ms. elapsed time = 241ms.

packageManager在扫描解析systemUI应用报错,所以并没有将systemUI真正添加到系统中(并没有将systemUI中对应的四大组件等信息解析到对应的数据结构中),因此在后面的log中也可以看到凡是要打开systemUI中相关类的地方,都会报NameNotFoundException异常。而此时,通过回退修改记录已经确认到是哪条提交记录引入了该问题。即SPM修改了内置的第三方应用的签名,有将四个应用的签名从系统签名修改成不签名,即使用的是应用本身的签名引入了该问题。再看看报错原因:Failed to parse /system/priv-app/SystemUI: Signature mismatch for shared user : SharedUserSetting{a250832 android.uid.systemui/10009}

提示的是systemUI的签名和共享进程android.uid.systemui不匹配,而SystemUI使用的是android.uid.systemui进程,签名用的是系统签名。那么问题来了,为什么修改第三方应用的签名(从系统签名修改成无签名,第三方自己的签名),会导致SystemUI的签名和进程名不匹配了?

原因只有一个,肯定是内置的第三方应用中(该提交记录中的四个应用中)至少有一个于SystemUI共享进程(可能通过指定process属性或者sharedUserId的方式让该应用和systemUI跑在了同一个进程中),但是签名不是使用的系统签名。为了证实自己的猜测,我们将第三方apk反编译,查看AndroidManifest.xml文件。在FloatButton.apk反编译的AndroidManifest.xml中果然有android:shareUserId=”android.uid.systemui”.因此FloatButton.apk必须要使用系统签名。至此,该问题的解决方法已经明了,只需要将FloatButton.apk的签名修改成系统签名即可。到这里,其实还有个疑问,那FloatButton.apk的签名和SystemUI的签名不同,为什么会导致SystemUI扫描时报异常而不是FloatButton.apk扫描报异常?其实很简单,原因是packageManagerService先扫描解析了FloatButton.apk,认为android.uid.systemui进程对应的签名是FloatButton.apk自己的签名,然后再扫描SystemUI.apk时,发现SystemUI的签名和android.uid.systemui不对应,所以就为将SystemUI扫描到系统中来。从log中可证实这一点:FloatButton.apk的扫描是在

01-01 08:15:39.457   960   960 D PackageManager: scan package: /system/priv-app/FloatButton , end at: 14239ms. elapsed time = 20ms

而SystemUI.apk的扫描是在:

01-01 08:15:40.540   960   960 D PackageManager: scan package: /system/priv-app/SystemUI , end at: 15322ms. elapsed time = 241ms.

同时从刷完机后,也可以看大,systemUI不能运行,但是FloatButton.apk中,除了需要调用到SystemUI中的一些功能无法正常运行以外,其他功能都可以正常运行。这一点也可以证实我们的猜测。

问题反思:

修改问题后,去packageManagerService.java的scanPackageDirtyLI()中看到有如下代码:

// However...  if this package is part of a shared user, but it

// doesn't match the signature of the shared user, let's fail.

// What this means is that you can't change the signatures

// associated with an overall shared user, which doesn't seem all

// that unreasonable.

if (pkgSetting.sharedUser != null) {

if(compareSignatures(pkgSetting.sharedUser.signatures.mSignatures,

pkg.mSignatures) != PackageManager.SIGNATURE_MATCH) {

throw new PackageManagerException(

INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES,

"Signature mismatch for shared user : "

+ pkgSetting.sharedUser);

}

}

即当一个应用如果想通过sharedUserId的方式与另一个应用运行于同一个进程当中,这两个应用的签名必须保持一致。那么在第三方应用内置时,若第三方没有告诉我们该应用需要什么签名时,可反编译看一下该应用是否有通过sharedUserId与其他应用运行于同一进程,以防止类似问题。

以上纯属个人总结,可能有不对的地方,欢迎大家指正,共同分享~~ --------------------- 作者:天木楠 来源:CSDN 原文:https://blog.csdn.net/niexu19900104/article/details/52513832 版权声明:本文为博主原创文章,转载请附上博文链接!

第三方apk内置因签名导致SystemUI未启动启动问题案例分析的更多相关文章

  1. adb将Apk内置到系统中(system/priv-app)

    https://blog.csdn.net/starhosea/article/details/78697007 so文件的处理是目前遇到过的问题.文章中解释了. 正文: 有时候我们在Android ...

  2. Android:源码环境下移植第三方的apk内置到ROM(System Image)中

    1. 首先在vendor目录下新建一个the3rdapk的目录,将需要内置的apk丢进去,目录名自己随意定. 2. 在 build/target/product/common.mk最后面,在$(cal ...

  3. PHP内置Web Server探究(一)启动Cli_Server

    自PHP5.4之后 PHP内置了一个Web 服务器(cli_server),类似于Python的内置server一样,方便我们开发阶段的调试 主要使用场景: 1,没有搭建nginx或apache等第三 ...

  4. 第七节:Asp.Net Core内置日志和整合NLog(未完)

    一. Asp.Net Core内置日志 1. 默认支持三种输出方式:控制台.调试(底部输出窗口).EventSource,当然也可以在Program类中通过logging.ClearProviders ...

  5. vscode style内置auto会导致eslint格式化 对不齐报错

    "files.associations": { "*.vue": "vue", // "*.js": "jav ...

  6. crontab在一秒内刷新多次导致部分脚本不生效的问题分析

    版权声明:本文由康中良原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/182 来源:腾云阁 https://www.qclo ...

  7. mtk预装apk 方案公司内置预装apk

    mtk预装apk 方案公司内置预装apk 韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha == MTK 预知第三方的APK 流程_yua ...

  8. Android开发中内置apk程序

    首先申明,这里的方法介绍是针对我司自己项目中的具体开发板而做的. Mg701内置APK有三种方式 一.         这种方法必须要自己编写Android.mk文件(关于Android.mk可以参考 ...

  9. SpringBoot内置生命周期事件详解 SpringBoot源码(十)

    SpringBoot中文注释项目Github地址: https://github.com/yuanmabiji/spring-boot-2.1.0.RELEASE 本篇接 SpringBoot事件监听 ...

随机推荐

  1. 第四篇:断路器(Hystrix)

    一.断路器简介. 在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用.为了保证 ...

  2. 【原创】InputStream has already been read - do not use InputStreamResource if a stream needs to be read multiple times

    一.背景 基于SpringBoot 构建了一个http文件下载服务,检查tomcat access 发现偶尔出现500 状态码的请求,检查抛出的异常堆栈 2019-03-20 10:03:14,273 ...

  3. requestAnimFrame 动画的使用方法

    //requestAnimFrame 封装,可以兼容所有浏览器 window.requestAnimFrame = (function(){ return window.requestAnimatio ...

  4. Java开发技术大揭底——让你认知自己技术上的缺陷,成为架构师

    一.分布式架构体系 分布式怎么来的.传统的电信.银行业,当业务量大了之后,普通服务器CPU/IO/网络到了100%,请求太慢怎么办?最直接的做法,升级硬件,反正也不缺钱,IBM小型机,大型机,采购了堆 ...

  5. [P4318] 完全平方数

    想不出什么办法能直接算的(别跟我提分块打表),不如二分答案吧:设\(f(x)=\sum_{i=1}^n [i不是"完全平方数"]\), 显然f(x)与x正相关.再结合筛法.容斥,不 ...

  6. Web渗透:PHP字符编码绕过漏洞总结

    其实这东西国内少数黑客早已知道,只不过没有共享公布而已.有些人是不愿共享,宁愿烂在地里,另外的一些则是用来牟利. 该漏洞最早2006年被国外用来讨论数据库字符集设为GBK时,0xbf27本身不是一个有 ...

  7. 122. 买卖股票的最佳时机 II-leetcode

    题目: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必 ...

  8. rhel 配置centos源

    1.删除自带的yum包,清除/etc/yum.repos.d下面的文件 rpm -qa|grep yum|xargs rpm -e --nodeps(不检查依赖,直接删除rpm包) 2.安装cento ...

  9. RabbitMQ在分布式系统中的应用

    怎么保证可靠性的? RabbitMQ提供了几种特性,牺牲了一点性能代价,提供了可靠性的保证. 持久化当RabbitMQ退出时,默认会将消息和队列都清除,所以需要在第一次声明队列和发送消息时指定其持久化 ...

  10. Apache Kafka: 优化部署的10个最佳实践

    原文作者:Ben Bromhead      译者:江玮 原文地址:https://www.infoq.com/articles/apache-kafka-best-practices-to-opti ...