Наверное, я не одинок в своем нежелании ждать OTA обновления телефона. Интересно же посмотреть, что нового в версии Android 4.4. Ниже я постараюсь описать максимально подробно процесс обновления прошивки в Linux системах. Надеюсь, это может быть кому-то полезно, так как большинство инструкций почти исключительно для Windows. Также постараюсь описать неочевидные грабли для некоторых ревизий Nexus 4.
![image](https://habrastorage.org/r/w780q1/getpro/habr/post_images/784/a5d/08f/784a5d08f16a4f1536734b73b3f69e27.jpg)
Почитав мануалы, вытащил образ Kitkat для Nexus 4 и Android SDK со всеми инструментами. Однако, к моему удивлению, проблема возникла там, где я ее никак не ожидал — не определялись драйвера для Windows 7 x64. Вначале попробовал установить пакет драйверов из Android SDK (достаточно отметить Google USB Driver Package для установки). Не распознается. Затем попробовал вытащить только пакет драйверов отсюда developer.android.com/sdk/win-usb.html. Результат тот же самый. Для очистки совести установил Universal Naked Driver 0.72 отсюда 4pda.ru/forum/dl/post/3529212/Universal_Naked_Driver_0.72.zip. В 32-битной системе результат аналогичный.
Телефон приобретался непосредственно в период аттракциона невиданной щедрости на Google Play через форвардера. Было куплено 2 телефона 8 Gb версия для меня (ну нет у меня потребности хранить большие объемы мультимедиа) и 16 Gb версия для брата. Я был крайне удивлен, когда его телефон сразу же определился в системе. Сразу возникла мысль о идентификаторе устройства.
Каждое устройство USB имеет свой уникальный Vendor ID. Эти идентификационные номера выдаются некоммерческой организацией USB Implementers Forum (USB-IF). Внутри Vendor ID устройства подразделяются по Product ID. Так, как производителем Nexus'ов является Google, то все его устройства имеют VID 18d1. С PID оказалось несколько сложнее. Если заглянуть внутрь android_winusb.inf, на который ориентируется операционная система мы можем увидеть список устройств, для которых предназначен данный драйвер.
Nexus 4 не упоминается, но 16 Gb версия совпадает по идентификационным номерам с Google Nexus (generic). Однако, с моим телефоном все оказалось не так. VID был d001, что не давало системе увидеть драйвер для него.
После этого последовало несколько нелогичное решение попробовать обновить прошивку в Linux окружении, так как ядро уже включает в себя необходимые драйверы для телефона. Развернул Kubuntu 13.10, чтобы получить ядро посвежее. Далее все по инструкции ниже:
1) На телефоне в разделе «Для разработчиков» разрешаем отладку по USB.
2) Определяем PID:VID устройства
Нас интересует именно этот фрагмент — 18d1:d001 Google Inc.
2) Linux не даст нам просто так доступ к нашему устройству. Для начала необходимо создать правила для udev (подробнее о системе ru.wikipedia.org/wiki/Udev).
Создаем файл с правилами для нашего Nexus:
Вносим туда следующие строки:
#Nexus 4
3) Изменяем атрибуты:
4) Перезапускаем udev:
5) Создаем группу androiddev и добавляем текущего пользователя:
Это необходимо для полноценного доступа на запись и исполнение к нашему устройству.
6) Добавляем необходимые для работы инструменты (вам не нужен полноценный SDK, если вы не планируете разработку на телефоне)
7) Для нормальной работы, начиная, кажется с версии 4.2, необходимо на самом телефоне подтвердить, что данный ПК является доверенным для отладки. При начале работы с adb не забудьте положительно ответить на этот вопрос на телефоне. Проверяем видимость устройства:
Все прошло успешно. В противном случае (старая версия adb, недоверенный ПК и т. п.) будет что-то вроде:
8) Перезагружаем телефон в режим fastboot. На Nexus 4 это достигается нажатием одновременно увеличения и уменьшения звука вместе с power. Также можно отправить из консоли adb restart fastboot. Проверяем список подключенных устройств с помощью lsusb и обнаруживаем, что product id изменился! Значит, опять нужно править /etc/udev/rules.d/51-android.rules. В моем случае это был 4ee0.
Перезагружаем udev.
9) В режиме fastboot adb не работает, поэтому проверяем список подключенных устройств следующим образом:
Если вместо вашего устройства висит Waiting for devices, значит, нужно правильно подобрать Vendor ID/Product ID в udev конфиге.
10) Качаем тот самый свежий образ с developers.google.com/android/nexus/images
Распаковываем. В моем случае должны быть следующие файлы:
11) Далее у нас два пути. Первый — разблокировка загрузчика с вайпом системы и полная прошивка. Второй — апдейт имеющейся системы.
1) Телефон в режиме fastboot.
2) Проверили, что телефон виден fastboot devices
3) Разблокируем загрузчик:
Соглашаемся на телефоне с вайпом данных
4) Полная прошивка. Проще всего запустить готовый скрипт flash-all.sh
5) Если все прошло хорошо — телефон в итоге включается девственно чистым с новой версией.
1) Переходим в режим bootloader из fastboot. Для этого выбираем соответсвующий пункт качельками громкости и включаем его кнопкой power.
2) В результате любуемся картинкой прибитого андроида с открытым животом и… Все. В моем варианте дальше не получилось. По идее на этом этапе необходимо нажать одновременно громкость вверх и power, чтобы открылось меню, где выбирается «Apply update from ADB». У меня телефон просто включался. Но, допустим вам это удалось.
3) На компьютере в окне командной строки ввести следующую команду:
где xxxxxxxx.zip – это имя zip файла c прошивкой. После этого пройдет штатное обновление.
Успешно перешел на ART с Dalvik. Вроде все стало гораздо быстрее открываться, но точных измерений не проводил. Сенсор стал приятнее и точнее. В целом явных изменений на поверхности не видно. ART надо тестировать, но пока ничего не падает. Перекомпиляция заняла около 20 минут на 120+ приложений.
PS. Помните, что любые неосторожные действия могут привести к «brick»-состоянию. Автор не несет ответственности за неправильные действия пользователей. Пожалуйста, всегда читайте инструкции на профильных ресурсах.
![image](https://habrastorage.org/getpro/habr/post_images/784/a5d/08f/784a5d08f16a4f1536734b73b3f69e27.jpg)
Наступаем на грабли в Windows 7 x64/x86
Почитав мануалы, вытащил образ Kitkat для Nexus 4 и Android SDK со всеми инструментами. Однако, к моему удивлению, проблема возникла там, где я ее никак не ожидал — не определялись драйвера для Windows 7 x64. Вначале попробовал установить пакет драйверов из Android SDK (достаточно отметить Google USB Driver Package для установки). Не распознается. Затем попробовал вытащить только пакет драйверов отсюда developer.android.com/sdk/win-usb.html. Результат тот же самый. Для очистки совести установил Universal Naked Driver 0.72 отсюда 4pda.ru/forum/dl/post/3529212/Universal_Naked_Driver_0.72.zip. В 32-битной системе результат аналогичный.
Телефон приобретался непосредственно в период аттракциона невиданной щедрости на Google Play через форвардера. Было куплено 2 телефона 8 Gb версия для меня (ну нет у меня потребности хранить большие объемы мультимедиа) и 16 Gb версия для брата. Я был крайне удивлен, когда его телефон сразу же определился в системе. Сразу возникла мысль о идентификаторе устройства.
Пара слов о USB-идентификаторах
Каждое устройство USB имеет свой уникальный Vendor ID. Эти идентификационные номера выдаются некоммерческой организацией USB Implementers Forum (USB-IF). Внутри Vendor ID устройства подразделяются по Product ID. Так, как производителем Nexus'ов является Google, то все его устройства имеют VID 18d1. С PID оказалось несколько сложнее. Если заглянуть внутрь android_winusb.inf, на который ориентируется операционная система мы можем увидеть список устройств, для которых предназначен данный драйвер.
;Google Nexus One
%SingleAdbInterface% = USB_Install, USB\VID_18D1&PID_0D02
%CompositeAdbInterface% = USB_Install, USB\VID_18D1&PID_0D02&MI_01
%SingleAdbInterface% = USB_Install, USB\VID_18D1&PID_4E11
%CompositeAdbInterface% = USB_Install, USB\VID_18D1&PID_4E12&MI_01
;Google Nexus S
%SingleAdbInterface% = USB_Install, USB\VID_18D1&PID_4E21
%CompositeAdbInterface% = USB_Install, USB\VID_18D1&PID_4E22&MI_01
%SingleAdbInterface% = USB_Install, USB\VID_18D1&PID_4E23
%CompositeAdbInterface% = USB_Install, USB\VID_18D1&PID_4E24&MI_01
;Google Nexus 7
%SingleBootLoaderInterface% = USB_Install, USB\VID_18D1&PID_4E40
%CompositeAdbInterface% = USB_Install, USB\VID_18D1&PID_4E42&MI_01
%CompositeAdbInterface% = USB_Install, USB\VID_18D1&PID_4E44&MI_01
;Google Nexus Q
%SingleBootLoaderInterface% = USB_Install, USB\VID_18D1&PID_2C10
%SingleAdbInterface% = USB_Install, USB\VID_18D1&PID_2C11
;Google Nexus (generic)
%SingleBootLoaderInterface% = USB_Install, USB\VID_18D1&PID_4EE0
%CompositeAdbInterface% = USB_Install, USB\VID_18D1&PID_4EE2&MI_01
%CompositeAdbInterface% = USB_Install, USB\VID_18D1&PID_4EE4&MI_02
%CompositeAdbInterface% = USB_Install, USB\VID_18D1&PID_4EE6&MI_01
Nexus 4 не упоминается, но 16 Gb версия совпадает по идентификационным номерам с Google Nexus (generic). Однако, с моим телефоном все оказалось не так. VID был d001, что не давало системе увидеть драйвер для него.
Ищем новые грабли в Linux
После этого последовало несколько нелогичное решение попробовать обновить прошивку в Linux окружении, так как ядро уже включает в себя необходимые драйверы для телефона. Развернул Kubuntu 13.10, чтобы получить ядро посвежее. Далее все по инструкции ниже:
1) На телефоне в разделе «Для разработчиков» разрешаем отладку по USB.
2) Определяем PID:VID устройства
meklon@meklon-kubuntu:~$ lsusb
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 002: ID 18d1:d001 Google Inc.
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 003: ID 09da:9033 A4 Tech Co., Ltd X-718BK Optical Mouse
Bus 004 Device 005: ID 046d:c225 Logitech, Inc. G11/G15 Keyboard / G keys
Bus 004 Device 004: ID 046d:c221 Logitech, Inc. G11/G15 Keyboard / Keyboard
Bus 004 Device 002: ID 046d:c223 Logitech, Inc. G11/G15 Keyboard / USB Hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Нас интересует именно этот фрагмент — 18d1:d001 Google Inc.
2) Linux не даст нам просто так доступ к нашему устройству. Для начала необходимо создать правила для udev (подробнее о системе ru.wikipedia.org/wiki/Udev).
Создаем файл с правилами для нашего Nexus:
sudo nano /etc/udev/rules.d/51-android.rules
Вносим туда следующие строки:
#Nexus 4
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="d001", MODE="0660", GROUP="androiddev", SYMLINK+="android%n"
3) Изменяем атрибуты:
chmod a+r /etc/udev/rules.d/51-android.rules
4) Перезапускаем udev:
sudo service udev restart
5) Создаем группу androiddev и добавляем текущего пользователя:
sudo groupadd androiddev && sudo useradd -G androiddev username
Это необходимо для полноценного доступа на запись и исполнение к нашему устройству.
6) Добавляем необходимые для работы инструменты (вам не нужен полноценный SDK, если вы не планируете разработку на телефоне)
sudo add-apt-repository ppa:nilarimogard/webupd8
sudo apt-get update
sudo apt-get install android-tools-adb android-tools-fastboot
7) Для нормальной работы, начиная, кажется с версии 4.2, необходимо на самом телефоне подтвердить, что данный ПК является доверенным для отладки. При начале работы с adb не забудьте положительно ответить на этот вопрос на телефоне. Проверяем видимость устройства:
# adb devices
List of devices attached
xxxxxxxxxxxxxxx device
Все прошло успешно. В противном случае (старая версия adb, недоверенный ПК и т. п.) будет что-то вроде:
# adb devices
List of devices attached
xxxxxxxxxxxxxxx offline
8) Перезагружаем телефон в режим fastboot. На Nexus 4 это достигается нажатием одновременно увеличения и уменьшения звука вместе с power. Также можно отправить из консоли adb restart fastboot. Проверяем список подключенных устройств с помощью lsusb и обнаруживаем, что product id изменился! Значит, опять нужно править /etc/udev/rules.d/51-android.rules. В моем случае это был 4ee0.
#Nexus 4
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="d001", MODE="0660", GROUP="androiddev", SYMLINK+="android%n"
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee0", MODE="0660", GROUP="androiddev", SYMLINK+="android%n"
Перезагружаем udev.
9) В режиме fastboot adb не работает, поэтому проверяем список подключенных устройств следующим образом:
fastboot devices
Если вместо вашего устройства висит Waiting for devices, значит, нужно правильно подобрать Vendor ID/Product ID в udev конфиге.
10) Качаем тот самый свежий образ с developers.google.com/android/nexus/images
Распаковываем. В моем случае должны быть следующие файлы:
bootloader-mako-makoz20i.img
radio-mako-m9615a-cefwmazm-2.0.1700.84.img
image-occam-krt16o.zip
flash-all.sh
11) Далее у нас два пути. Первый — разблокировка загрузчика с вайпом системы и полная прошивка. Второй — апдейт имеющейся системы.
Первый вариант:
1) Телефон в режиме fastboot.
2) Проверили, что телефон виден fastboot devices
3) Разблокируем загрузчик:
fastboot oem unlock
Соглашаемся на телефоне с вайпом данных
4) Полная прошивка. Проще всего запустить готовый скрипт flash-all.sh
sudo sh flash-all.sh
5) Если все прошло хорошо — телефон в итоге включается девственно чистым с новой версией.
Второй вариант:
1) Переходим в режим bootloader из fastboot. Для этого выбираем соответсвующий пункт качельками громкости и включаем его кнопкой power.
2) В результате любуемся картинкой прибитого андроида с открытым животом и… Все. В моем варианте дальше не получилось. По идее на этом этапе необходимо нажать одновременно громкость вверх и power, чтобы открылось меню, где выбирается «Apply update from ADB». У меня телефон просто включался. Но, допустим вам это удалось.
3) На компьютере в окне командной строки ввести следующую команду:
adb sideload xxxxxxxx.zip
где xxxxxxxx.zip – это имя zip файла c прошивкой. После этого пройдет штатное обновление.
Эпилог
Успешно перешел на ART с Dalvik. Вроде все стало гораздо быстрее открываться, но точных измерений не проводил. Сенсор стал приятнее и точнее. В целом явных изменений на поверхности не видно. ART надо тестировать, но пока ничего не падает. Перекомпиляция заняла около 20 минут на 120+ приложений.
PS. Помните, что любые неосторожные действия могут привести к «brick»-состоянию. Автор не несет ответственности за неправильные действия пользователей. Пожалуйста, всегда читайте инструкции на профильных ресурсах.