现象:
本地升级update升级后,提示信息停止运行
堆栈:
04-14 06:42:17.747 2854 3279 E AndroidRuntime: FATAL EXCEPTION: TransactionService
04-14 06:42:17.747 2854 3279 E AndroidRuntime: Process: com.android.mms, PID: 2854
04-14 06:42:17.747 2854 3279 E AndroidRuntime: java.lang.IllegalArgumentException: Unknown URL content://mms/9223372036854775807/part
04-14 06:42:17.747 2854 3279 E AndroidRuntime: at android.content.ContentResolver.delete(ContentResolver.java:1326)
04-14 06:42:17.747 2854 3279 E AndroidRuntime: at com.google.android.mms.util.SqliteWrapper.delete(SqliteWrapper.java:102)
04-14 06:42:17.747 2854 3279 E AndroidRuntime: at com.google.android.mms.pdu.PduPersister.release(PduPersister.java:1652)
04-14 06:42:17.747 2854 3279 E AndroidRuntime: at com.google.android.mms.pdu.PduPersister.getPduPersister(PduPersister.java:301)
04-14 06:42:17.747 2854 3279 E AndroidRuntime: at com.android.mms.transaction.TransactionService.onNewIntent(TransactionService.java:288)
04-14 06:42:17.747 2854 3279 E AndroidRuntime: at com.android.mms.transaction.TransactionService$ServiceHandler.handleMessage(TransactionService.java:696)
04-14 06:42:17.747 2854 3279 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102)
04-14 06:42:17.747 2854 3279 E AndroidRuntime: at android.os.Looper.loop(Looper.java:148)
从堆栈上看是因为,系统没有加载或公布mms 数据库,为什么?
发生异常的 mms 与正常mms 的区别
异常进程:
04-14 06:41:40.832 1431 1476 I am_proc_start: [0,2854,10022,com.android.mms,added application,com.android.mms]
crash后启动的进程:
04-14 06:42:34.957 1431 2936 I am_proc_start: [0,3723,10022,com.android.mms,restart,com.android.mms]
mms因为在AndroidManifest.xml 添加了persistent 属性,所以在系统启动ActivityManagerService 的systemReady() 方法结尾时去启动apk进程。
android:persistent=”true”
梳理了一下他的代码没有问题。
mms 数据库是谁,是不是他的进程发生了问题?
mms: 4b8e997/com.android.providers.telephony/.MmsProvider
* ContentProviderRecord{4b8e997 u0 com.android.providers.telephony/.MmsProvider}
package=com.android.providers.telephony process=com.android.phone
由此可以看到mms 数据库依据的是com.android.phone
查看com.android.phone当时进程堆栈:
----- pid 2996 at 2017-04-14 06:42:24 -----
Cmd line: com.android.phone
"main" prio=5 tid=1 Native
| group="main" sCount=1 dsCount=0 obj=0x754ecf70 self=0x7f8a246a00
| sysTid=2996 nice=0 cgrp=default sched=0/0 handle=0x7f8ee03fe8
| state=S schedstat=( 1540944525 3943247345 3555 ) utm=129 stm=25 core=1 HZ=100
| stack=0x7fd36e6000-0x7fd36e8000 stackSize=8MB
| held mutexes=
kernel: (couldn't read /proc/self/task/2996/stack)
native: #00 pc 00000000000683d0 /system/lib64/libc.so (__ioctl+4)
native: #01 pc 00000000000723f8 /system/lib64/libc.so (ioctl+100)
native: #02 pc 000000000002d584 /system/lib64/libbinder.so (_ZN7android14IPCThreadState14talkWithDriverEb+164)
native: #03 pc 000000000002e050 /system/lib64/libbinder.so (_ZN7android14IPCThreadState15waitForResponseEPNS_6ParcelEPi+104)
native: #04 pc 000000000002e2c4 /system/lib64/libbinder.so (_ZN7android14IPCThreadState8transactEijRKNS_6ParcelEPS1_j+176)
native: #05 pc 0000000000025654 /system/lib64/libbinder.so (_ZN7android8BpBinder8transactEjRKNS_6ParcelEPS1_j+64)
native: #06 pc 00000000000e0988 /system/lib64/libandroid_runtime.so (???)
native: #07 pc 00000000013ad934 /system/framework/arm64/boot.oat (Java_android_os_BinderProxy_transactNative__ILandroid_os_Parcel_2Landroid_os_Parcel_2I+200)
at android.os.BinderProxy.transactNative(Native method)
at android.os.BinderProxy.transact(Binder.java:503)
at android.content.ContentProviderProxy.call(ContentProviderNative.java:644)
at android.provider.Settings$NameValueCache.getStringForUser(Settings.java:1415)
at android.provider.Settings$Global.getStringForUser(Settings.java:8267)
at android.provider.Settings$Global.getString(Settings.java:8256)
at android.provider.Settings$Global.getInt(Settings.java:8323)
at com.android.internal.telephony.cdma.CdmaSubscriptionSourceManager.getDefault(CdmaSubscriptionSourceManager.java:167)
at com.android.internal.telephony.PhoneFactory.makeDefaultPhone(PhoneFactory.java:130)
- locked <0x0f659217> (a java.lang.Object)
at com.android.internal.telephony.PhoneFactory.makeDefaultPhones(PhoneFactory.java:88)
at com.android.internal.telephony.TelephonyPluginBase.makeDefaultPhones(TelephonyPluginBase.java:46)
at com.qti.internal.telephony.QtiTelephonyPlugin.makeDefaultPhones(QtiTelephonyPlugin.java:44)
at com.android.internal.telephony.TelephonyPluginDelegate.makeDefaultPhones(TelephonyPluginDelegate.java:105)
at com.android.phone.PhoneGlobals.onCreate(PhoneGlobals.java:363)
at com.android.phone.PhoneApp.onCreate(PhoneApp.java:43)
at android.app.Instrumentation.0
(Instrumentation.java:1014)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4885)
系统启动进程加载数据库的流程为:
系统正常启动流程发布provider 的流程为:
ActivityThread.main
ActivityThread.attach
ActivityManagerService.attachApplication
ActivityManagerService.attachApplicationLocked
ActivityManagerService.generateApplicationProvidersLocked //将已经加载的 ContentProviderRecord,与当前的 ProcessRecord关联起来。
ActivityThread.bindApplication
ActivityThread.handleBindApplication
ActivityThread.installContentProviders
ActivityManagerNative.getDefault().publishContentProviders
apk.Application.onCreate
ActivityManager: getContentProviderImpl: from caller=null (pid=1075, userId=0) to get content provider com.android.contacts cpr=null
phone 进程启动时间为:
04-14 06:41:41.107 1431 1476 I am_proc_start: [0,2996,1001,com.android.phone,added application,com.android.phone]
异常发生的时间为:
04-14 06:42:17.747 2854 3279 E AndroidRuntime: Process: com.android.mms, PID: 2854
而phone 进程在 06:42:24 的时候,还在走PhoneApp.onCreate 方法
—– pid 2996 at 2017-04-14 06:42:24 —–
系统进行数据库操作,会首先,通过mProviderMap 获取指定的provider,如果没有获取到,那么通过pms获取要加载Providerinfo, 之后会加载对应的apk,
cpi = AppGlobals.getPackageManager(). resolveContentProvider(name, STOCK_PM_FLAGS | PackageManager.GET_URI_PERMISSION_PATTERNS, userId);
而本进程会wait,
等到对应的apk,加载完provider,调用publishContentProviders,去 notifyAll 等待的进程。
所以发生问题,只有
1、mProviderMap 没有对应的 provider
2、pms 中没有获取对应apk信息,需要加载的providerInfo。
由此发生的问题,并且会打印出对应的log:
ActivityManager: getContentProviderImpl: can’t get cpi from packagemanager
那为啥从pms 中获取不到呢?
pms 是比ams 先执行的systemReady啊
缺少当时的log啊,
规避修改,
将sms 改为非常驻进程,确保 sms 使用phone 数据库时,数据库可以准备ok,以此来规避此问题。
描述 以邻接表作为存储结构实现,求解从给定源点到给定结束点的最短路径。 输入从1开始表示第一个节点。第一行输入:顶点数n(2第二行输入有向边:起始点s1,结束点 s2,边权值 w第三行输入:源点start,终点end 输出若存在路径,输出路径长度;若不存在,输出-1。 输入样例6 81 6 1001 5 301 3
某银行计划开发一个自动存提款机模拟系统(ATM System)。系统通过读卡器(CardReader)读取ATM卡;系统与客户(Customer)的交互由客户控制台(Customer-Console)实现;银行操作员(Operator)可控制系统的启动(System Startup)和停止(System Shutdown);系统通过网络和银行系统(Bank)实现通信。当读卡器判断用户已将ATM卡插入后,创建会话(Session)。会话开始后,读卡器进行读卡,并要求客户输入个人验证码(PIN)。系统将卡号和
1 GPIO简介GPIO,即通用I/O(输入/输出)端口,是STM32可控制的引脚。STM32芯片的GPIO引脚与外部设备连接起来,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。STM32F407有7组IO。分别为GPIOA~GPIOG,每组IO有16个IO口,共有112个IO口 通常称为PAx、PBx、PCx、PDx、PEx、PFx、PGx,其中x为0-15。 并且F4...
iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式 说明: 1)该文简短介绍在iOS开发中遍历字典、数组和集合的几种常见方式。 2)该文对应的代码可以在下面的地址获得:https://github.com/HanGangAndHanMeimei/Code一、使用for循环 要遍历字典、数组或者是集合,for循环是最简单也用的比较多的方法,示例如下: ...
[[email protected] tools]# wget http://pexpect.sourceforge.net/pexpect-2.3.tar.gz--2014-02-28 11:14:25-- http://pexpect.sourceforge.net/pexpect-2.3.tar.gzResolving pexpect.sourceforge.net... 216.34.181.
Android 控件之DatePicker、TimePicker探究Android之完美退出方法(2.1-2.2-2.3SDK版本测试通过)中断Android线程求一些图片素材,按键什么的小型素材?谁有分享下哈哈Android开发者必须深入学习的10个应用开源项目Android_1.0应用框架原理与程式设计.pdf很经典的教材Android 用APN来获取手机号【转自 si
Frp内网穿透 1. 介绍2. 安卓Frp配置2.1 设置为开发者模式2.2 安装termux软件2.3 安装运行openssh2.4 使用FileZilla传输frp_0.38.0_linux_arm64到安卓2.5 安卓运行Frp客户端2.6 其他1. 介绍安卓系统的内核为Linux,所以安卓也可以使用frp的linux_arm64压缩包搭建内网穿透。2. 安卓Frp配置2.1 设置为开发者模式自行百度。2.2 安装termux软件termux下载链接2.3 安装运行openssh打
apply函数是pandas中极其好用的一个函数,它可以对dataframe在行或列方向上进行批量化处理,从而大大简化数据处理的过程。apply函数的基本形式:DataFrame.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds)我们最常用前两个参数,分别是运算函数和运算的轴。在运算函数并不复杂的情况下,第一个参数通常使用lambda函数。当函数复杂时可以另外写一个函数来调用。下面通过一个实例来说
题目: * 中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”? 输入格式: 输入在一行中给出1个不超过1000的正整数N。 输出格式: 在一行中输出此人在第N天中是“Fishing”(即“打鱼”)还是“Drying”(即“晒网”),并且输出“in day N”。 输入样例1: 103 输
在Unity中利用代码动态更改场景中的天空盒(亲测有效)首先要在场景中新建一个材质球,并把材质球的类型改成为Skybox/6 Sided,然后把天空盒的六个面分别选择一张UI图片!然后在场景中新建一个名称为Test的C#的脚本,并把下列这些代码复制到脚本中中!using System.Collections;using System.Collections.Generic;using ...
关注公众微信号JNBSNET,回复关键字,获取资料.回复 EKB 获取Sim_EKB_Install_2020_04回复关键字获取资料<例:回复V16,或者回复1,都可以>1. V16 : TIAV16+EKB_Install_2019_122. V15.1 : TIAV15.1+EKB_Install_20183. V90 :常见问题,手册,伺服软件V-ASSISTANT4. V20 :视频链接及手册5. PROFINET :PROFIN...
前言最近学Computer Graphics的时候,第一次大作业是写一个太阳系。由于老师要求松,自己又一直拖着没交,最后干脆直接总写了一个带纹理、光照的太阳系。交上去之后发现有点问题:题目要求月亮和地球绕着不同的方向旋转,这里没想到直接把它们平面化了。。。不过这也好,直接放上来间接防抄袭了。。。所以现在把代码发布如下,希望能对各位同袍有一些帮助。注意复制代码后不能直接运行,需要glut库。可自行前往官网下载配置即可。运行环境 Visual Studio 2017,语言C++。MySolar#inc