"com.android.phone остановлен" после грязной прошивки CM13

После грязной прошивки моего OnePlus One (bacon) с CM12.1 на CM13 я постоянно получаю всплывающие окна с принудительным закрытием диалогов.

Unfortunately the process com.android.phone has stopped

Logcat заполнен трассировками стека следующим образом:

Shutting down VM
FATAL EXCEPTION: main
Process: com.android.phone, PID: 13148
java.lang.RuntimeException: Unable to get provider com.android.providers.telephony.TelephonyProvider: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
    at android.app.ActivityThread.installProvider(ActivityThread.java:5205)
    at android.app.ActivityThread.installContentProviders(ActivityThread.java:4797)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4737)
    at android.app.ActivityThread.-wrap1(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1424)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5466)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
    at android.database.CursorWindow.nativeGetString(Native Method)
    at android.database.CursorWindow.getString(CursorWindow.java:438)
    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
    at com.android.providers.telephony.TelephonyProvider$DatabaseHelper.getStringValueFromCursor(TelephonyProvider.java:993)
    at com.android.providers.telephony.TelephonyProvider$DatabaseHelper.copyPreservedApnsToNewTable(TelephonyProvider.java:905)
    at com.android.providers.telephony.TelephonyProvider$DatabaseHelper.onUpgrade(TelephonyProvider.java:641)
    at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:256)
    at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:187)
    at com.android.providers.telephony.TelephonyProvider.onCreate(TelephonyProvider.java:1457)
    at android.content.ContentProvider.attachInfo(ContentProvider.java:1748)
    at android.content.ContentProvider.attachInfo(ContentProvider.java:1723)
    at android.app.ActivityThread.installProvider(ActivityThread.java:5202)
    ... 10 more

Как только я каким-то образом избавился от постоянного всплывающего окна пользовательского интерфейса, кажется, что com.android.phoneон падает не менее 10 раз в секунду, переполняет logcat и делает практически невозможным использование телефона.

Есть ли надежда на исправление или только полный сброс?

Удалите данные для com.android.providers.telephony(приложение обозначается как «Телефон/хранилище телефонии/провайдеры»). Пока вы это делаете, сделайте это и для приложения «Телефон» ( com.android.phone), перезапустите и сообщите нам результаты. Похоже, что база данных com.android.providers.telephonyне может быть прочитана. Возможно, вы не сможете очистить данные для этих приложений. В этом случае удалите их каталоги /data/data с лица земли.
Очистка кеша (из рекавери) может помочь
Я попытался удалить эти папки с помощью Total Commander в режиме root. Удалось удалить, но не помогло. Я тоже сделал перезагрузку :( Никому не могу позвонить...

Ответы (5)

Это произошло из-за изменения кода.

Как сказал Firelord, очистите данные для приложений. Это можно сделать следующим образом ( это также удалит вашу базу данных SMS / MMS, поэтому обязательно сделайте резервную копию заранее ):

adb shell
rm -fr /data/data/com.android.providers.telephony/
rm -fr /data/data/com.android.phone/
exit

Флаг -f предназначен для принудительного выполнения, а флаг -r означает рекурсивность.

Это сработало! Спасибо. Я также заметил эту строку в своем логарифме: TelephonyProvider: dbh.onUpgrade:+ db=SQLiteDatabase: /data/user/0/com.android.providers.telephony/databases/telephony.db oldV=1114120 newV=1376264после удаления каталога данных и перезагрузки диалоги принудительного закрытия прекратились. Что было в базе? Я заметил, что все мои текстовые сообщения исчезли. Что-нибудь еще?
Читатели: не забудьте перезагрузить устройство после удаления этих каталогов.
Интересно, что нельзя было удалить данные из меню приложений. Мне нужно было перезагрузиться в TWRP и удалить там папку (достаточно было первой)
Этот метод не работает для Cyanogenmod 14/Android 7.
@Adem Ноя, что за логарифм?
Я очистил cm14 и переустановил cm13, потому что cm14 был слишком незаконченным для меня. У меня на см13 все работает нормально.
Базы данных @Adem могли быть перемещены android.stackexchange.com/a/155895/136434

У меня была такая же проблема при обновлении до CM13 с CM12.1. Вы можете решить эту проблему, не удаляя файлы базы данных и, следовательно, не теряя данные, как это предлагается в других ответах.

Виновником кажется сломанная база данных по коду обновления в TelephonyProvider CM. Столбец ppp_numberтаблицы перевозчиков не существует, но код обновления предполагает, что он уже существует.

Я решил эту проблему, скопировав файл telephony.db на свой локальный компьютер с Linux и изменив версию базы данных на версию, 16 << 16 | 6 = 1048582чтобы заставить код обновления добавить недостающие столбцы. Операторы ALTER TABLEв связанном коде защищены блоками try-catch, поэтому не имеет значения, существуют ли уже некоторые из столбцов. Загрузите телефон в рекавери (например, TWRP), чтобы иметь привилегии adb root и избежать блокировок со средой выполнения Android, которая постоянно пытается запустить провайдера телефонии.

% adb pull /data/user/0/com.android.providers.telephony/databases/telephony.db
% adb pull /data/user/0/com.android.providers.telephony/databases/telephony.db-journal

Создание резервных копий

% cp telephony.db telephony.db.bak
% cp telephony.db-journal telephony.db-journal.bak

Затем откройте базу данных с помощью sqlite и установите версию

% sqlite3 telephony.db
sqlite> PRAGMA user_version = 1048582;
sqlite> .quit

Загрузите измененную базу данных обратно на устройство и исправьте разрешения

% adb push telephony.db /data/user/0/com.android.providers.telephony/databases
% adb shell
~ # cd /data/user/0/com.android.providers.telephony/databases
/data/data/com.android.providers.telephony/databases # rm telephony.db-journal
/data/data/com.android.providers.telephony/databases # chown radio:radio telephony.db
/data/data/com.android.providers.telephony/databases # chmod 660 telephony.db

Вы также можете попробовать это на сломанной системе, чего я бы не рекомендовал. Вам, вероятно, придется стать пользователем root adb root, чтобы копировать и изменять файлы с расширением adb.

Отличное внимание к деталям! Объяснение очень ценится. Как и @gedenkt, я следовал этим инструкциям, но у меня они тоже не сработали. :-/ Однако простое удаление этих двух *.db*файлов решило проблему.
Вы можете использовать команду «vacuum», чтобы объединить журнал с БД.$ sqlite3 telephony.db VACUUM

Я попробовал решение Себастьяна, но ошибка осталась. Принятый ответ приводит к потере всех ваших SMS, поэтому для меня это не вариант. Однако после загрузки в режим восстановления и удаления файлов

/data/data/com.android.providers.telephony/databases/telephony.db
/data/data/com.android.providers.telephony/databases/telephony.db-journal

телефон снова работал отлично. Похоже, что файлы содержат только автоматически сгенерированные данные, поэтому их можно безопасно удалить.

Как я могу удалить определенные файлы в режиме восстановления?
@Hinrich Если вы используете полнофункциональное восстановление, такое как TWRP, вы можете использовать встроенный файловый менеджер.
Немного подробнее о TWRP. В моем случае я использую Safestrap 3.75 (TWRP v2.7.1.0), и мне пришлось использовать кнопку «Монтировать», затем проверить «Данные», затем вернуться, затем использовать кнопку «Дополнительно», чтобы использовать Кнопка «Диспетчер файлов» (затем перейдите, начиная с папки «данные»).

Если вы не можете войти в оболочку adb или удалить каталог со своего телефона, потому что он непригоден для использования, вы также можете удалить каталог из восстановления TWRP.

Пожалуйста, добавьте необходимые указания для этого в свой ответ. Что делать, если в OP нет TWRP?

Была такая же поблема после обновления с СМ12 на СМ13. Вот как я смог это исправить:

Я удалил эти два каталога

/data/user/0/com.android.providers.telephony
/data/data/com.android.phone/

полностью с моего телефона (Nexus 5). Раньше ES Explorerя так делал, мне нужно было включить Root Modeи Show Hidden Filesиметь возможность удалять файлы в этом каталоге.

Журнал вызовов и SMS все еще там, не вижу никаких недостатков, связанных с удалением этих каталогов. Кажется, все снова работает гладко.