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

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

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

Расчёт крайне прост. При преобразовании силы сигнала в полоски CommCenter загружает из памяти все пороговые значения и сравнивает их, пока не найдёт подходящий диапазон. То есть проблема не в коде...
![; Table lookup loop loc_3434e: 0003434e ldr.w r3, [r2, r4, lsl #2] ; Load threshold[bar_count] 00034352 cmp r5, r3 ; Compare RSSI to threshold 00034354 ble loc_3435c ; If RSSI <= threshold, stop 00034356 adds r4, #0x1 ; bar_count++ 00034358 cmp r4, #0x5 ; Check if reached 5 bars 0003435a bne loc_3434e ; Loop](https://habrastorage.org/r/w1560/getpro/habr/upload_files/f95/2c1/619/f952c161921e176416c765cb1dbb8c8f.png)
...а здесь. Это таблица поиска. При преобразовании байтов в децибел-милливатты (дБм) мы получаем -115, -111, -107, -103 и -99 (чем ближе к нулю, тем лучше сигнал). Например, для отображения трёх полосок значение должно быть -107 или больше.


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

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


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

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