СоХабр закрыт.

С 13.05.2019 изменения постов больше не отслеживаются, и новые посты не сохраняются.

| сохранено

H CyanogenMod 12: Ошибка при переключении способов ввода в черновиках Recovery Mode

Добрый день.

Несколько месяцев назад команда cyanogenmod стала понемногу выкладывать билды 12 версии своего одноименного детища, основанного на коде Android 5 Lollipop. В начале года, наконец-то, дошла очередь и до Nexus 4. Не откладывая в долгий ящик я прошил одним из первых ночников. Конечно все еще сыровато, то и дело там и сям наблюдаются непереведенные строки, далеко не все цианогеновские фишки присутствуют, но мы то упоротые фанаты цианогена знаем, что все это мелочи и с каждым новым билдом ситуация будет все улучшаться.

В принципе, текущий ночник, а на момент написания статьи это билд от 18-го числа, вполне юзабелен. Все заявленные функции Nexus 4 работают штатно, стохастических ребутов и бутлупов не наблюдается. Но… «не было печали — купила баба поросят»


Елозим пальцем...


Как всем известно, Android5 имеет замечательный плоский дизайн, именуемый корпорацией добра Material Design и многим, как и мне он чертовски нравится и возникает непреодолимое желание чтобы все сторонние приложения выглядели так же. К сожалению не все разработчики поспевают за прогрессом, исключением не явилась и клавиатура Swype, которую я использую уже несколько лет, начиная с самых первых бетаверсий.
Если кто-то не в курсе, поясню: команда Swype Inc. несколько лет назад предложила революционный способ ввода текста для мобильных устройств, который позволяет набирать слова практически не отрывая палец от экрана и выпустила одноименное приложение Swype, реализующее этот метод.

Позже появилось еще несколько реализаций: Slide IT, SwiftKey, а в Android 4.2 и штатная клавиатура получила искомый функционал. Но все это, на мой взгляд, было не то, хоть и некоторые из подражателей снискали себя немалую армию фанатов.

А не сменить ли мне клавиатуру...


Некоторое время назад мне на глаза попался обзор клавиатуры из пятого андроида, и отзывы оказались на удивление положительными, а принимая во внимание, что она оформлена в духе Material Design, и что Swype пока не озаботился новой темой (да и тяжелый он, откровенно говоря), было принято решение перейти на клавиатуру Google и потестить-посмотреть.

Итак, на телефоне был установлен билд от 15-го января (cm-12-20150115-NIGHTLY-mako.zip), я отключаю Swype и включаю клавиатуру AOSP. В настройках включен «Непрерывный ввод». Пробуем… и облом :( Непрерывный ввод не работает. Ну что ж, видимо сырость прошивки всему виной (а если бы сразу загуглил, то и статьи, наверняка, не было бы :) ) Я не стал отчаиваться и установил из маркета клавиатуру Google как отдельное приложение. И возрадовался. Она действительно оказалась неплоха. Огорчал только тот факт, что установлены, по сути, две одинаковых клавиатуры, они жрут место и вообще… Не ТРУЪ короче, но делать нечего, ждем свежий билд CM12. Да, нужно сказать, что все остальные способы ввода, кроме голосового я отключил, чтобы не маячили.

О! а вот и билд! cm-12-20150118-NIGHTLY-mako.zip. Установил конечно, порадовался появившейся возможности кастомизации плиток в панели уведомлений, но при попытке включить клавиатуру AOSP получил странную ошибку:



«Это точно какой-то конфликт» — подумал Штирлиц, и удалил клавиатуру Google, установленную из маркета. Оглядываясь сейчас назад я не могу сказать точно, что мной двигало, возможно, всему виной поздний вечер, и уже плохо соображающая голова. Не знаю. Но факт есть факт: Я остался с одним голосовым вводом facepalm

Я снова и снова пытался вызвать диалог смена раскладки, но безжалостный CM покрывал меня матюками на Java:
Ознакомиться с матюками
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.settings/com.android.settings.Settings$InputMethodAndLanguageSettingsActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.preference.PreferenceCategory.removePreference(android.preference.Preference)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2318)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
at android.app.ActivityThread.access$800(ActivityThread.java:147)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1281)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5255)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.preference.PreferenceCategory.removePreference(android.preference.Preference)' on a null object reference
at com.android.settings.inputmethod.InputMethodAndLanguageSettings.onCreate(InputMethodAndLanguageSettings.java:179)
at android.app.Fragment.performCreate(Fragment.java:2031)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:863)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
at android.app.BackStackRecord.run(BackStackRecord.java:833)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452)
at android.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:483)
at com.android.settings.SettingsActivity.switchToFragment(SettingsActivity.java:956)
at com.android.settings.SettingsActivity.onCreate(SettingsActivity.java:582)
at android.app.Activity.performCreate(Activity.java:5933)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2264)
... 10 more



И тебя вылечим, и меня вылечим


Гугление показало, что от этого недуга пострадал не только я. Еще пара человек так же не смогли сменить способ ввода штатными средствами, причем и на Nexus 5 тоже. Значит дело все таки в новом билде CM, поломали таки цианогеновцы что-то в коде. Пофиксят конечно, но до этого момента еще дожить надо, как-то еще вконтактик и воцапчик писать все это время нужно. Значит будем чинить.

Починение, кстати, не сложное, если знать куда бить. А бить вот куда:

  • Включаем в опциях разработчика root доступ для ADB, если не был включен
  • Разрешаем там же отладку
  • Подключаем телефон к компьютеру по USB или юзаем WiFi ADB — это уж кому как удобнее.
  • Соединяемся ADB шеллом с телефоном и получаем привилегированный доступ
    C:\ADB> adb shell 
    $ su
  • Выполняем одну хитрую команду
    # ime set com.google.android.inputmethod.latin/com.android.inputmethod.latin.LatinIME
  • PROFIT!


Таким образом, кстати, можно включить любую другую, только предварительно нужно просмотреть список возможных способов ввода:
# ime list -a


Дык а с непрерывным вводом-то что?


Уффф… Возможность вводить текст восстановлена, но проблема свайпа в родной клавиатуре так и не решена. И гугление таки дало решение:
Если непрерывный ввод не работает, то нужно любым файловым менеджером с root-доступом зайти в /system/lib/ и переименовать там библиотеку libjni_latinime.so на libjni_latinimegoogle.so и перезагрузить телефон.

… И морды эти еще противные


Ну и раз пошла такая пьянка, решил до кучи еще «разобраться» со смайлами, ибо штатные кроме рвотного рефлекса ничего не выражают:

Мрак, адъ и Израиль.

Здесь в общем-то все просто, нужно установить Emoji Switcher и изменить иконки смайлов на набор IOS. Теперь смайлы выглядят так:


За сим все, надеюсь кому-то был полезен.
ТЫДЫЩ!!!
image

PS: Только что установил билд от 19-го числа. Проблема с выбором способа ввода до сих пор не решена.

комментарии (15)

–4
+1 –5
sp1983 ,  
> Android5 имеет замечательный плоский дизайн, именуемый корпорацией добра Material Design и многим, как и мне он чертовски нравится и возникает непреодолимое желание чтобы все сторонние приложения выглядели так же

А для кого-то Material Design стал поводом перейти с Android на другие платформы (например для меня).
0
Suvitruf ,  
Только из-за дизайна?
+1
+2 –1
sp1983 ,  
Из-за того, что следуя этому дизайну они стали гробить функциональность приолжений, которые до этого работали как часы. В частности жизненно-важный для меня календарь теперь невыносимо ущербен в андроиде.
0
+1 –1
zorgzerg ,  
Ну здесь чистая вкусовщина, на вкус и цвет, как говориться
0
sp1983 ,  
Я и не пытался убеждать кого-то в обратном. Каждому — свое.
+1
sp1983 ,  
ЗЫ — минусовать карму за подобный комментарий? На хабре точно полно социопатов-неадекватов.
0
Evengard ,  
Странно, такой же ночник кайногена, 20150119, только для htc one m7, клавиатуры переключаются без проблем… |мне правда MessageEase больше нравится.

У меня другая беда. При включении фонарика телефон самопроизвольно перезагружается. Поймать причину не могу, ни в last_kmsg, ни в логкате внешне ничего криминального…
0
zorgzerg ,  
Ну видимо беда коснулась только 4 и 5 нексусов. По крайней мере я по другим моделям жалоб не обнаружил
+2
sergeyotro ,  
Вас не смущает, что это ночные билды? Или по каждому багу надо статьи на гиктаймс писать?
0
zorgzerg ,  
Да разве ж я по каждому пишу? А конкретно по этому нашел жалобы от нескольких людей, потому и решил поделиться найденым решением. Как думаете, минусы связаны именно с этим? А то может пора в черновики спрятаться? :)
+3
tyderh ,  
Четыре строчки информации раздуты до 9669 слов. У вас талант.
0
faiwer ,  
А не подскажите, как произносится «CyanogenMod»? Столкнулся с тем, что когда меня спрашивают почему у меня такой странный Samsung, я не знаю как произнести название прошивки :)
0
Evengard ,  
Я его Кайногеном зову, а как правильно даже и не знаю…
+1
zorgzerg ,  
Сайаноджен, если не ошибаюсь :) но я зову цианоген
0
mlurker ,  
Для nexus 4 из всех кастомных прошивок, основанных на lollipop, мне больше всего понравилась эта — nxrom.us/n4.html