现象:
本地升级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,以此来规避此问题。
文章浏览阅读95次。Sublime Text3一、安装配置下载地址http://www.sublimetext.com/3安装Package Control方法一:[View] -> [Show Console] 填入以下,然后enter;安装后重启import urllib.request,os,hashlib; h = '2915d1851351e5ee549c20394736b442' + '8bc59f460fa1548d1514676163dafc88'; pf = 'Package Control_sublime 三引号注释
文章浏览阅读2k次。题目大意:给定一张无向图,每条边从两个方向走各有一个权值,求从点1往出走至少一步之后回到点1且不经过一条边多次的最短路 显然我们需要从点1出发走到某个和点1相邻的点上,然后沿最短路走到另一个和点1相邻的点上,然后回到点1 那么我们将与点1相邻的点都设为关键点,然后将点1从图中删除,题目转化成了给定图上的一些关键点求最近点对 枚举每个点显然会T 考虑每次将关键点划分为两个集合A,BA,B,然后_bzoj 2069
文章浏览阅读152次。11.2.2.4 简易客户连接如果使用便利函数create_connection()来连接服务器,那么TCP/IP客户可以省去几步。这个函数只有一个参数,这是一个包含服务器地址的二值元组,函数将由这个参数推导出用于连接的最佳地址。import socketimport sysdef get_constants(prefix): """Create a dictionary map..._tcp/ip客户和服务器
文章浏览阅读245次。升级原因MySQL默认的utf8只支持三字节字符,不支持Emoji表情符(四字节),如果有四字节的字符写入会报错。从MySQL 5.5开始,提供了utf8mb4,支持四字节的字符。许多使用iphone的用户来在填写昵称的时候会加入Emoji表情符,如果MySQL没有使用utf8mb4字符集,这样的昵称信息就无法写入。一、升级前。mysql> SHOW VARIABLES LIKE 'char..._mysql5.0 utf8mb4
文章浏览阅读376次。首先感谢千峰教育的学习视频GitLab的开发流程之企业级工程搭建-01创建依赖管理项目1.新建一个群组2.新建项目3.Git克隆4.Git的过滤文件.gitattributes# Windows-specific files that require CRLF:*.bat eol=crlf*.txt eol=crlf# Unix-specific files that req..._gitlab怎么建立依赖库
文章浏览阅读3.9k次。这几天在MySQL新建用户后。出现訪问拒绝的问题,错误码为ERROR 1045(28000)。在网上搜索了非常久。找到了非常多解决的方法,但非常遗憾的是这么多办法没有一个能解决该问题。尽管出现的错误码28000非常多人都遇到过。但原因也有所不同。有的是mysql.user表中没有信息。有的是root用户没有password(那就不用password登录),而使用mysql-5.6.19时,mysq..._mysql 28000
文章浏览阅读2.9k次。首先像下面这样读入数据\\spambase.data中包含实际数据,spambase.names中包含变量的信息> spambase <- read.csv("spambase.data",header=F)由于该数据文件中不包含变量信息,因此令header=F,使第1行不为变量名。像下面通过read.table()函数读入数据,并通过colnames()函数指定数据框spam...
文章浏览阅读2w次,点赞2次,收藏5次。常用有两种方法:1、在windows/linux下,首先把so动态库文件 编译出来(通过NDK),然后再 拷贝到android的工程里 libs/armeabi/下,如果libs/armeabi 不存在,那就自己创建,最后用eclipse编译本项目,这样将自动把so文件打包到apk里;eclipse在打包的时候会根据文件名的命名规则(lib****.so)去打包so文件,开头和结尾必须分别_apk打包so
文章浏览阅读1.2k次。以上操作完成后就能从远程访问本地服务器也可以从本地服务器访问远程。(远程访问本地前提防火墙做好映射。如果防火墙不开放映射的话可以下载TeamViewer 12软件进行操作,安装完成之后就可以开启远程访问其他电脑了,如果需要其他电脑来访问本地需要设置开启服务,让其他电脑能够通过身份验证访问本地。Windows Server2008跟win7、win10略有不同。Teamviewer安装完成后告诉对方ID及密码即可)_服务器远程服务怎么开启
文章浏览阅读1.5k次。该文章实现点击ListView列标题来进行排序首先对ListView的 ColumnClick 事件进行处理 private void ListView_ColumnClick(object sender, ColumnClickEventArgs e) { System.Windows.Forms.ListView lv = sender a..._c# listview 排序
文章浏览阅读58次。反转换图#box{width: 440px;height: 824px;margin: 200px auto;border: 2px solid black;perspective: 1000;position: relative;overflow: hidden;}img{display: block;position: absolute;backface-visibility: hidden;...
文章浏览阅读209次。diffbot api调用In the previous post on Analyzing SitePoint Authors’ Profiles with Diffbot we built a Custom API that automatically paginates an author’s list of work and extracts his name, bio and a lis..._diffbot api