Хотите увидеть нечто любопытное? Вот, как устранили проблему «антеннагейта» на iPhone в 2010 году. 20 байт.

Контекст: в 2010 году, когда выпустили iPhone 4, пользователи заметили, что если взять телефон определённым образом, то количество полосок сигнала сети падает с 5 до примерно 2. Спустя насколько недель компания опубликовала письмо, в котором свалила вину за это на неправильную формулу: https://www.apple.com/newsroom/2010/07/02Letter-from-Apple-Regarding-iPhone-4/

Проведя расследование, мы неожиданно обнаружили, что формула, по которой вычисляется количество полосок силы сигнала, совершенно неправильная. Во многих случаях наша формула ошибочно отображала на две полоски больше, чем на самом деле требовалось. Например, иногда телефон отображал четыре полоски, хотя на самом деле он должен был показывать всего две. Если пользователи наблюдали исчезновение нескольких полосок, когда брали iPhone определённым образом, то это, скорее всего, происходило в местах с очень слабым сигналом, но они не знали этого, потому что телефон ошибочно отображал четыре или пять полосок. Такое резкое снижение количества полосок вызвано тем, что эта индикация изначально была неправильной.

Над этим письмом много смеялись (https://daringfireball.net/2010/07/translation_iphone_4), но никто не изучал различия в формуле между 4.0 и патчем в 4.0.1. В то время я был глупым восьмилетним ребёнком, но теперь уже я глупый взрослый, владеющий дизассемблером.

Я скачал обе прошивки и приступил к расследованию. Во фреймворке CoreTelephony я обнаружил многообещающий двоичный файл: CommCenter. После изучения строк в нём я убедился, что именно там находилась формула расчёта количества полосок.

Расчёт крайне прост. При преобразовании силы сигнала в полоски CommCenter загружает из памяти все пороговые значения и сравнивает их, пока не найдёт подходящий диапазон. То есть проблема не в коде...

...а здесь. Это таблица поиска. При преобразовании байтов в децибел-милливатты (дБм) мы получаем -115, -111, -107, -103 и -99 (чем ближе к нулю, тем лучше сигнал). Например, для отображения трёх полосок значение должно быть -107 или больше.

Если составить из этих значений график, то можно увидеть, что проблема в том, что значения слишком оптимистичны. Чаще всего индикатор показывает четыре-пять полосок. Но если взять телефон, то из-за столь резкого наклона кривой происходит катастрофическое снижение количества полосок с пяти до двух.

В 4.0.1 компания изменила эти значения, сделав их гораздо более плавными.

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

Вот и всё. 20 байт.

А, и ещё в 4.0.1 они изменили высоту полосок низкого сигнала, сделав их выше. Забавно.