среда, 16 октября 2013 г.

Смена серийного номера Android-устройства

Многие китайские производители Android-девайсов не заморачиваются на присваивание своим поделкам уникальных серийных номеров. По крайней мере в софте. И можно столкнутся с проблемой когда одновременно подключено более 1 устройства с одинаковым серийником. В таком случае adb будет ругаться и чтобы залить и отлаживать своё приложение нужно отключать одно из устройств:
[2013-10-16 00:03:10 - MyAwesomeApp] Failed to install MyAwesomeApp.apk on device '0123456789ABCDEF': adb rejected install command with: more than one device
[2013-10-16 00:03:10 - MyAwesomeApp] com.android.ddmlib.AdbCommandRejectedException: more than one device
[2013-10-16 00:03:10 - MyAwesomeApp] Launch canceled!
Это никуда не годится. Имея root-привелегии можно решить эту проблему.
Серийник '0123456789ABCDEF' захардкоден в исходниках ядра drivers/usb/gadget/android.c:

static struct usb_string strings_dev[] = {
/* These dummy values should be overridden by platform data */
[STRING_MANUFACTURER_IDX].s = "Android",
[STRING_PRODUCT_IDX].s = "Android",
[STRING_SERIAL_IDX].s = "0123456789ABCDEF",
{ } /* end of list */
};
Но к счастью adb берёт его из sysfs, а именно из /sys/class/android_usb/android0/iSerial так что можно обойтись без пересборки ядра.

Всё что нужно - это записывать туда новый серийник при загрузке ОС. Простой способ сделать это с помощью программы Script Manager. Для начала создадим скрипт на ФС, позволяющей сделать его исполняемым. Например /system/changecerial.sh (понадобятся права root и /system перемонтировать на чтение/запись, например, с помощью ES File Explorer):

#!/system/bin/sh
su && echo "DEAD000000000000" > /sys/class/android_usb/android0/iSerial

su вобщем не обязательно т.к. при использвании Script Manager можно указать чтобы этот скрипт вызывался с правами root, но пусть будет и тут. Не забываем сделать его исполняемым. Теперь в программе Script Manager находим этот файл, кликаем на него, отмечаем "Is executable", "Su" и "Boot", затем Save и Run. Скрипт выполнится в терминале. Если никаких ошибок не вывалилось, то теперь у устройства новый серийник и он будет задаваться при каждой последующей загрузке.

9 комментариев:

  1. Привет. Изменить серийник в файле получилось.Но в настройках планшета остался прежний ?

    ОтветитьУдалить
    Ответы
    1. Хм.. я правда не смотрел что там в настройках т.к. цель была научить adb их различать по серийнику. Гляну вечерком на том девайсе где с этим игрался

      Удалить
  2. Здаров а ты не мог бы поподробнее расписать? какие программы нужны? что такое ФС?

    ОтветитьУдалить
    Ответы
    1. и можно ли сменить его на телефоне HTC?

      Удалить
    2. Нужен root доступ. На любом девайсе должно работать, но не могу гарантировать что во всех версиях андроида. Script Manager программы достаточно чтобы скрипт в автозапуск поставить

      Удалить
  3. Отпишись в вк https://vk.com/id168785013

    ОтветитьУдалить
  4. Здравствуйте Смените мой серийный номер G6 Plus

    ОтветитьУдалить
  5. Суть такая - есть бинарный файл (в данном случае прошивка ноутбука), с которым нужно произвести несколько действий:
    - по определенным смещениям править информацию (текстовые ресурсы);
    - Пересчитать контрольную сумму (crc32c) определенного блока этого бинарного файла (в котором мы производили правку) и записать эту новую контрольную сумму по строго определенному адресу.
    помогите пожалуйса

    ОтветитьУдалить