<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Snow Volf</title><generator>teletype.in</generator><description><![CDATA[Snow Volf]]></description><image><url>https://teletype.in/files/4c/4c8cc799-3a2d-4bfc-9272-55b90fc0f54c.png</url><title>Snow Volf</title><link>https://teletype.in/@svolf</link></image><link>https://teletype.in/@svolf?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=svolf</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/svolf?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/svolf?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Tue, 22 Sep 2026 11:09:47 GMT</pubDate><lastBuildDate>Tue, 22 Sep 2026 11:09:47 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@svolf/HJ7g2rAkU</guid><link>https://teletype.in/@svolf/HJ7g2rAkU?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=svolf</link><comments>https://teletype.in/@svolf/HJ7g2rAkU?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=svolf#comments</comments><dc:creator>svolf</dc:creator><title>OkHttp</title><pubDate>Sat, 04 Jan 2020 17:31:22 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/2e/22/2e22d9f6-3ddf-4195-9940-bb32b2a5fdad.png"></media:content><description><![CDATA[<img src="https://teletype.in/files/6e/cd/6ecd0f65-5f24-45ce-aeca-a2415b54f002.png"></img>OkHttp - библиотека для работы с сетью. Согласно статье на хабре:]]></description><content:encoded><![CDATA[
  <p>OkHttp - библиотека для работы с сетью. Согласно <a href="https://habr.com/ru/post/281965/" target="_blank">статье на хабре</a>:</p>
  <blockquote>OkHttp была создана для прямой работы с верхним уровнем сокетов Java, при этом не используя какие-либо дополнительные зависимости. Она поставляется в виде JAR-файла, так что разработчики могут использовать ее на любых устройствах с JVM (куда мы включаем, конечно, и Android).</blockquote>
  <p>Сегодня я не буду рассказывать плюсы и минусы данной библиотеки, приводить ее аналоги и т.д. Нне ради этого я пишу этот пост.</p>
  <p>Ты обратил внимание на метод <code>closeCodeExceptionMessage(int code)</code> класса <code>okhttp3.internal.ws.WebSocketProtocol.</code> И действительно, если просто глянуть на этот метод, кажется будто он выполняет какую-то &quot;магию&quot;, но на самом деле это просто возвращение строки.</p>
  <p>Взглянем на декомпилированный метод:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/6e/cd/6ecd0f65-5f24-45ce-aeca-a2415b54f002.png" width="655" />
  </figure>
  <ul>
    <li>Поясню, что тут происходит:</li>
    <li>На вход подается переменная i</li>
    <li>Если i не находится в диапазоне от 1000 до 5000, метод возвращает сообщение: <code>&quot;Code must be in range [1000,5000): &quot;</code></li>
    <li>Иначе проверяется  ((i меньше 1004 или  i больше 1006) и (i меньше 1012 или i больше 2999)). Если оба этих условия выполняются, то возвращается null</li>
    <ul></ul>
  </ul>
  <p>Иначе возвращается сообщение о том, что код занят и уже используется</p>
  <pre>sb.append(&quot;Code &quot;);
sb.append(i);
sb.append(&quot; is reserved and may not be used.&quot;);</pre>
  <p></p>
  <p>К счастью, исходники у этой библиотеки открыты. Идем на GitHub и смотрим, <s>а был ли мальчик</s> вносились ли какие-нибудь изменения в код со стороны разработчика приложения</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/97/85/97857546-c4e3-41d4-8439-2e722319da50.png" width="859" />
  </figure>
  <p>Как видим, код практически не отличается. Да и то, отличия кода из приложения лишь в проделанных оптимизациях со стороны компилятора. Технически же они вообще не отличаются.</p>
  <p></p>
  <p>Посмотрим где этот код используется. К счастью, таких мест всего несколько:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/2e/22/2e22d9f6-3ddf-4195-9940-bb32b2a5fdad.png" width="800" />
  </figure>
  <p>Ну и пару примеров использования</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/18/09/18096301-808b-4b86-8c05-e36472534f04.png" width="587" />
  </figure>
  <figure class="m_original">
    <img src="https://teletype.in/files/35/f9/35f9b921-2fe0-42fd-8ed2-90268cd454ba.png" width="855" />
  </figure>
  <p>Увы. Но данный отрезок кода лишь оповещает разработчика об ошибке, которую он может допустить при разработке, но никак иначе.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@svolf/B1BPBrqar</guid><link>https://teletype.in/@svolf/B1BPBrqar?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=svolf</link><comments>https://teletype.in/@svolf/B1BPBrqar?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=svolf#comments</comments><dc:creator>svolf</dc:creator><title>Еще немного о сниффере</title><pubDate>Sun, 08 Dec 2019 09:41:48 GMT</pubDate><description><![CDATA[<img src="https://teletype.in/files/8d/8d283d35-70b0-43e8-a1a1-0354b2f48ac6.png"></img>В последней сборке я улучшил логгирование ответов. Добавив временной промежуток между ответами в миллисекундах. Так уж вышло, что высчитывать время в секундах в мире программ нельзя, т.к. очень высока доля округления. 2200 и 2400 это все тот же промежуток в 3 секунды, но вот в настолько чувствительных областях как работа с сетью, не стоит пренебрегать даже долей секунды]]></description><content:encoded><![CDATA[
  <p>В последней сборке я улучшил логгирование ответов. Добавив временной промежуток между ответами в миллисекундах. Так уж вышло, что высчитывать время в секундах в мире программ нельзя, т.к. очень высока доля округления. 2200 и 2400 это все тот же промежуток в 3 секунды, но вот в настолько чувствительных областях как работа с сетью, не стоит пренебрегать даже долей секунды</p>
  <p>Для начала взглянем на временные промежутки в миллисекундах.</p>
  <pre>=== 02.12.2019, 21:44:17 (1829 ms) [Response] ===</pre>
  <pre>=== 02.12.2019, 21:44:19 (1846 ms) [Response] ===</pre>
  <pre>=== 02.12.2019, 21:44:21 (2141 ms) [Response] ===</pre>
  <pre>=== 02.12.2019, 21:44:23 (1844 ms) [Response] ===</pre>
  <pre>=== 02.12.2019, 21:44:25 (2372 ms) [Response] ===</pre>
  <pre>=== 02.12.2019, 21:44:27 (1729 ms) [Response] ===</pre>
  <pre>=== 02.12.2019, 21:44:29 (2496 ms) [Response] ===</pre>
  <p>Сравним их с предыдущими</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/8d/8d283d35-70b0-43e8-a1a1-0354b2f48ac6.png" width="968" />
  </figure>
  <p>Как видим, промежутки в 2-3 секунды являются отличающимися на самом деле. В среднем промежуток между ответами от 1,7 до 2,5 секунды.</p>
  <p>Содержимое самих ответов одинаковое. (см предыдущую статью)</p>
  <h2>Объект заказа</h2>
  <p>Помимо сниффинга списка заказов, следует уделить внимание данным, которые передаются при принятии заказа (на экране на месте/в пути)</p>
  <pre>{
  &quot;user_id&quot;: id заказа,
  &quot;point&quot;: &quot;0&quot;,
  &quot;timestamp&quot;: 1575315692,
  &quot;order_data&quot;: {
    &quot;FPDATE&quot;: null,
    &quot;FOTID&quot;: 66770656,
    &quot;FDIAL_T&quot;: 1575323459,
    &quot;FLIGHT&quot;: &quot;000&quot;,
    &quot;FDIAL_S&quot;: &quot;2000000010&quot;,
    &quot;FTEL&quot;: &quot;номер телефона клиента&quot;,
    &quot;FA&quot;: null,
    &quot;FSTATUS&quot;: 21,
    &quot;FDIAL_O&quot;: &quot;ORDER_DRI&quot;,
    &quot;FAD_ROUTE&quot;: [
      &quot;место заказа&quot;
    ],
    &quot;FCOST&quot;: цена заказа,
    &quot;FAD_STR&quot;: &quot;адрес заказа&quot;,
    &quot;FCLI&quot;: null,
    &quot;FAD_PO&quot;: null,
    &quot;FAD_H&quot;: null,
    &quot;FDIS&quot;: &quot;i&quot;,
    &quot;FDRI_TAXI&quot;: &quot;служба такси&quot;,
    &quot;FDRI_ID&quot;: позывной водителя,
    &quot;FCOST_DATA&quot;: {
      &quot;distance&quot;: &quot;4161(0) + 0(0)&quot;,
      &quot;cost_s&quot;: &quot;сумма заказа грн.&quot;,
      &quot;Coord&quot;: [
        [
          широта,
          долгота
        ],
        [
          широта (точно),
          долгота (точно)
        ]
      ],
      &quot;area&quot;: &quot;район заказа&quot;
    },
    &quot;FOT&quot;: &quot;служба такси&quot;,
    &quot;FOPR&quot;: &quot;ID&quot;,
    &quot;FID&quot;: еще какой-то ID,
    &quot;FDATE&quot;: время принятия заказа,
    &quot;FOTW&quot;: 1,
    &quot;F0&quot;: еще какя-то дата,
    &quot;UHASH&quot;: &quot;53&quot;,
    &quot;FAD_NOTE&quot;: null,
    &quot;FLOCK&quot;: null,
    &quot;FDRI&quot;: &quot;???&quot;
  },
  &quot;session&quot;: &quot;ID сессии&quot;,
  &quot;order&quot;: номер заказа
}
</pre>
  <p>Из этого можно выбрать данные для навигации c исп FakeGPS. Осталось только придумать, как это реализовать...</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@svolf/rkYYGfShH</guid><link>https://teletype.in/@svolf/rkYYGfShH?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=svolf</link><comments>https://teletype.in/@svolf/rkYYGfShH?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=svolf#comments</comments><dc:creator>svolf</dc:creator><title>JSON DATA (RESPONSE)</title><pubDate>Fri, 22 Nov 2019 07:47:13 GMT</pubDate><description><![CDATA[Изучив ответы приложения, я могу сделать некоторые выводы. Сегодня будет без скринов и подробных объяснений, т.к. блог открыт для всех, и я не хочу спалить твои личные данные.]]></description><content:encoded><![CDATA[
  <p>Изучив ответы приложения, я могу сделать некоторые выводы. Сегодня будет без скринов и подробных объяснений, т.к. блог открыт для всех, и я не хочу спалить твои личные данные.</p>
  <h2>Временные промежутки</h2>
  <p>Если смотреть тупо на даты ответов, то можно определить, что они идут с некоторой закономерностью</p>
  <pre>========= 13.11.2019, 22:28:18 =========</pre>
  <pre>========= 13.11.2019, 22:28:19 =========</pre>
  <pre>========= 13.11.2019, 22:28:22 =========</pre>
  <pre>========= 13.11.2019, 22:28:25 =========</pre>
  <p>Из этих 4 дат мы прекрасно видим, что первые 2 идут с разницей в 1 секунду, а последующие с разницей в 3 секунды. Это можно увязать с временем обновления списка заказов. Первые 2 раза обновление происходит быстрее, чем в последующие.</p>
  <h2>Содержимое ответов</h2>
  <p>Сразу скажу, я логгировал только ответы со статусом &quot;session&quot;. Т.е. непосредственно содержимое сессии.</p>
  <p>Типичный ответ выглядит так:</p>
  <pre>{
    &quot;orders&quot;: {// заказы
        &quot;служба такси:позывной&quot;: [// список
            {//заказ №1
                &quot;FPDATE&quot;: null,
                &quot;FOTID&quot;: число (предп. ID заказа),
                &quot;FDIAL_T&quot;: число (предп. дата заказа),
                &quot;FLIGHT&quot;: &quot;число&quot;,
                &quot;FDIAL_S&quot;: &quot;число&quot;,
                &quot;FTEL&quot;: null (предп. номер телефона),
                &quot;FA&quot;: null,
                &quot;FSTATUS&quot;: 21,
                &quot;FDIAL_O&quot;: &quot;ORDER_DRI&quot;,
                &quot;FAD_ROUTE&quot;: [
                   // массив строк
                ],
                &quot;FCOST&quot;: 105, // сумма заказа
                &quot;FAD_STR&quot;: &quot;куда ехать (напр. ул. Пушкина, дом Колотушкина)&quot;,
                &quot;FCLI&quot;: null,
                &quot;FAD_PO&quot;: null,
                &quot;FAD_H&quot;: null,
                &quot;FDIS&quot;: null,
                &quot;FDRI_TAXI&quot;: null,
                &quot;FDRI_ID&quot;: null,
                &quot;FCOST_DATA&quot;: {
                    &quot;distance&quot;: &quot;333(0) + 10004(0) + 0(0)&quot;,// хз вообще что
                    &quot;cost_s&quot;: &quot;105 грн.&quot;, // сумма заказа в гривнах
                    &quot;Coord&quot;: [// координаты
                        [
                            // массив координат с точностью до 3-х знаков
                        ],
                        [
                            // массив координат с точностью до 5-ти знаков
                        ],
                        [
                           // массив координат с точностью до 7-ми знаков
                        ]
                    ],
                    &quot;area&quot;: &quot;район заказа&quot;
                },
                &quot;FOT&quot;: &quot;предп. ID службы&quot;,
                &quot;FOPR&quot;: &quot;предп ID оператора&quot;,
                &quot;FID&quot;: ID,
                &quot;FDATE&quot;: дата,
                &quot;FOTW&quot;: флаг,
                &quot;F0&quot;: null,
                &quot;UHASH&quot;: &quot;07&quot;,
                &quot;FAD_NOTE&quot;: null,
                &quot;FLOCK&quot;: null,
                &quot;FDRI&quot;: null
            },
            //еще заказ</pre>
  <pre>//и еще
    &quot;status&quot;: [
        {
            &quot;user_id&quot;: ID водителя,
            &quot;order&quot;: ID текущего заказа,
            &quot;order_data&quot;: данные по текущему заказу,
            &quot;point&quot;: флаг (значение либо &quot;0&quot;, либо null),
            &quot;timestamp&quot;: время,
            &quot;session&quot;: &quot;ID текущей сессии&quot;
        }
    ],
    &quot;road_from&quot;: &quot;visicom&quot;
}</pre>
  <p></p>
  <p>Также в поле статуса показываются координаты твоего заказа. По крайней мере они совпадают с теми, что передаются в массиве заказов.</p>
  <pre>{
    &quot;response&quot;: &quot;session&quot;,
    &quot;data&quot;: [
        {
            &quot;fmanid&quot;: &quot;ID водителя&quot;,
            &quot;session&quot;: &quot;ID текущей сессии&quot;
        }
    ],
    &quot;error&quot;: &quot;&quot;,
    &quot;settings&quot;: [
        {</pre>
  <pre>// настройки блокировки
            &quot;block_time&quot;: &quot;600&quot;
        }
    ],
    &quot;money&quot;: [
        {
            &quot;ftaxi&quot;: &quot;служба такси&quot;,
            &quot;fdri&quot;: &quot;позывной&quot;,
            &quot;fservice&quot;: &quot;название службы такси&quot;
        }
    ],</pre>
  <pre>//настройки
    &quot;common_settings&quot;: {
        &quot;autoget&quot;: &quot;5000&quot;,
        &quot;autohighlight&quot;: &quot;5000&quot;,
        &quot;coords&quot;: {
            &quot;lat&quot;: &quot;широта&quot;,
            &quot;lng&quot;: &quot;долгота&quot;
        },
        &quot;Taxoid_pA_Check_Enabled&quot;: 0,
        &quot;Taxoid_pA_Check_Radius&quot;: &quot;500&quot;
    }</pre>
  <p>Также не совсем понятно присутствие флага номера телефона в списке заказов. Его значение можно узнать только при принятии заказа.</p>
  <p>Ничего особо интересного там более нет.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@svolf/rk71foZjr</guid><link>https://teletype.in/@svolf/rk71foZjr?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=svolf</link><comments>https://teletype.in/@svolf/rk71foZjr?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=svolf#comments</comments><dc:creator>svolf</dc:creator><title>Информация по сокетам</title><pubDate>Thu, 07 Nov 2019 13:53:31 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/65/6503f145-5bca-43ab-9184-53ee3442028a.png"></media:content><description><![CDATA[<img src="https://teletype.in/files/65/6503f145-5bca-43ab-9184-53ee3442028a.png"></img>Учитывая, как изменился метод отдачи заказов, можно утверждать, что приложение напрямую ими не управляет.]]></description><content:encoded><![CDATA[
  <p>Учитывая, как изменился метод отдачи заказов, можно утверждать, что приложение напрямую ими не управляет.</p>
  <p>До версии 2.6 запросы на сервер отправлялись циклично. Внутри APK был код, который через каждые N миллисекунд отправлял запрос на сервер. Приложение само запрашивало у сервера данные, следовательно его можно было обмануть. К примеру, &quot;ускорить&quot; время с помощью таких программ, как GameGuardian или GameKiller. В этом случае побеждал тот, у кого больше запросов к серверу.</p>
  <p>Разработчики это прекрасно понимали, и начиная с версии 2.6 они перешли на протокол связи в режиме реального времени - проще говоря, WebSocket.</p>
  <p>Тут хорошо подходит аналогия с мессенджером: мистер xxx пишет сообщение, и отправляет его мистеру yyy. К сожалению, мистер ххх пишет сообщения очень медленно, но это никак не исправить. Ты не можешь заставить собеседника печатать быстрее, если он не в состоянии это делать. То же самое и с клиентом. Клиент не может заставить сервер отправлять ему сообщения в более ускоренном темпе. Тут-то как раз и появляются флексы с серверами, точнее с их портами. Я не спец в этом деле, не могу сказать, что есть 100% рабочий метод заставить сервер быстрее отсылать сообщения, только если это не скомпрометированный сервер.</p>
  <p>Я скажу лишь о тех моментах, которые связаны с получением данных через Socket протокол. Для удобства анализа всё будет представлено в виде Java-кода, а не smali. Java более проста для понимания сложных алгоритмов.</p>
  <p>Итак, преступим:</p>
  <p>Сначала стоит поискать по ключевому слову &quot;Socket&quot;</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/65/6503f145-5bca-43ab-9184-53ee3442028a.png" width="800" />
    <figcaption>Результаты поиска</figcaption>
  </figure>
  <p>Нашло 46 результатов. Теперь еще раз сделаем выборку. На этот раз по слову &quot;taxoid&quot;. Там и вовсе 2 класса:</p>
  <ol>
    <li><code>c.c.a.d.b.a.l.java</code></li>
  </ol>
  <figure class="m_original">
    <img src="https://teletype.in/files/b0/b0a6c118-0e4a-456a-be09-16c7e5ae86d4.png" width="1920" />
  </figure>
  <p>Я изменял эти переменные еще в самом начале изучения Taxoid-а. Объясню, что тут происходит:</p>
  <p>Присваиваются несколько переменных.</p>
  <p>Класс <code>d.b.b.e</code> объявляется как переменная <code>e</code></p>
  <p>В эту переменную складываются сценарии ответа в формате &quot;ключ-значение&quot;. Какое событие выполнится при коннекте, при ошибке, таймауте, ошибке повторного коннекта и т.д.</p>
  <p>В дальнейшем коде идут запросы на сервер, с твоими данными локации, логином-паролем и т.д.</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/e4/e4f47007-224d-4728-811c-036cce4c723f.png" width="1920" />
    <figcaption>Код коннектов к серверу. Класс <code>d.b.b.e</code></figcaption>
  </figure>
  <p>А где же сокеты?</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/e1/e1e55e92-0385-4439-9a54-778213399ca0.png" width="1920" />
    <figcaption>При ошибке подключения используется сокетное оповещение</figcaption>
  </figure>
  <p>2. <code> c.c.a.d.c.e.java</code></p>
  <p>Глядим здесь упоминание сокетов:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/f5/f5290b90-a6ae-4add-b826-e7e6f5200b82.png" width="1920" />
  </figure>
  <p>Здесь:</p>
  <p>Устанавливается сокетное соединение с уже данным хостом и портом</p>
  <p>Устанавливается таймаут в 10 секунд</p>
  <p>Начинается чтение данных с сокетного соединения</p>
  <p>Устанавливается флаг коннекта в положение true. Скорее всего, чтобы не коннектиться каждый раз по новой.</p>
  <p>А сам адрес, откуда берутся данные:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/1b/1b45a293-1ed5-42f3-b2ad-c96d31610822.png" width="1920" />
  </figure>
  <p>Круг замкнулся. Осталось только посмотреть, что за данные он отдаёт</p>
  <p>Об этом чуть позже.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@svolf/Syh2bls9S</guid><link>https://teletype.in/@svolf/Syh2bls9S?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=svolf</link><comments>https://teletype.in/@svolf/Syh2bls9S?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=svolf#comments</comments><dc:creator>svolf</dc:creator><title>Обзор мода с паролем (часть 2)</title><pubDate>Sat, 02 Nov 2019 12:08:19 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/b5/b52cc3f7-552b-4072-9e03-71a676601356.png"></media:content><description><![CDATA[<img src="https://teletype.in/files/b5/b52cc3f7-552b-4072-9e03-71a676601356.png"></img>Реальных изменений маловато. После разгребания путающего кода, остаются след. изменения:]]></description><content:encoded><![CDATA[
  <p>Реальных изменений маловато. После разгребания путающего кода, остаются след. изменения:</p>
  <p><strong>com/pk/taxoid/activities/AuthActivity.smali</strong> - добавлен метод <code>disableDoze()</code>, который добавляет отключение оптимизации Doze Mode, и, в теории, обеспечивает более стабильную работу приложения в фоновом режиме (система не будет выгружать его при малом заряде батареи)</p>
  <ul>
    <li><strong>smali/com/pk/taxoid/activities/NavigationActivity2.smali</strong></li>
    <li><strong>smali/com/pk/taxoid/activities/NavigationActivity.smali</strong></li>
    <li><strong>smali/com/pk/taxoid/activities/SelectLocationActivity2.smali</strong></li>
    <li><strong>smali/com/pk/taxoid/activities/SettingsActivity$FilterPreferenceFragment.smali</strong></li>
    <li><strong>smali/com/pk/taxoid/activities/SettingsActivity.smali</strong></li>
    <li><strong>smali/com/pk/taxoid/widget/LimitedEditText.smali</strong></li>
    <li><strong>smali/ru/yandex/bz.smali</strong></li>
  </ul>
  <p>Удалены все тосты (всплывающие сообщения с текстом).</p>
  <p>smali/com/pk/taxoid/libs/location/b.smali - изменено дефолтное значение локации с &quot;unknown&quot; на &quot;pinkypieunknownpinkypie&quot;. Зачем - непонятно.</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/b5/b52cc3f7-552b-4072-9e03-71a676601356.png" width="1920" />
  </figure>
  <p>И еще такие же:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/d3/d3473b0e-e2b6-41cf-8045-210962e0dfb4.png" width="1920" />
    <figcaption>Какой-то фетиш на pinkypie</figcaption>
  </figure>
  <figure class="m_original">
    <img src="https://teletype.in/files/e4/e46fe249-3334-47bb-b715-6516e2a76a87.png" width="1920" />
  </figure>
  <p><strong>/smali/d/a/a/a/n/g/l.smali</strong></p>
  <p><strong>/smali/d/a/a/a/n/g/r.smali </strong></p>
  <p>Удалены ссылки для отправки отчетов об ошибках разработчикам.</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/2a/2af56ca0-d5dd-4d22-96f1-700dc50ff16f.png" width="1920" />
  </figure>
  <p>Манифест</p>
  <p>Заменен ключ Google карт</p>
  <p>Добавлены разрешения:</p>
  <p>android.permission.SYSTEM_ALERT_WINDOW<br />android.permission.READ_LOGS<br />net.dinglisch.android.tasker.PERMISSION_RUN_TASKS<br />android.permission.BLUETOOTH_ADMIN<br />android.permission.VIBRATE<br />android.permission.SYSTEM_ALERT_WINDOW<br />android.permission.CHANGE_WIFI_STATE<br />android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS<br />android.permission.ACCESS_NETWORK_STATE<br />android.permission.USE_FINGERPRINT<br />android.permission.ACCESS_WIFI_STATE<br />android.permission.BLUETOOTH<br />android.permission.WRITE_SETTINGS<br />android.permission.READ_SETTINGS</p>
  <p>Вот и всё. Из значимых изменений, только doze. Остальное  - пшик.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@svolf/B19ObTc5H</guid><link>https://teletype.in/@svolf/B19ObTc5H?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=svolf</link><comments>https://teletype.in/@svolf/B19ObTc5H?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=svolf#comments</comments><dc:creator>svolf</dc:creator><title>Обзор мода с паролем (часть 1)</title><pubDate>Sat, 02 Nov 2019 08:42:25 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/cc/ccef53a5-7875-462d-88a8-c353d855541a.png"></media:content><description><![CDATA[<img src="https://teletype.in/files/08/089688bd-ff3e-4fd4-8cf6-cc460f1bcb75.png"></img>Прежде всего, стоит сказать, что на первый взгляд, мод сделан абсолютнейшим дилетантом, ничего не смыслящим в моддинге от слова совсем. И вот почему:]]></description><content:encoded><![CDATA[
  <p>Прежде всего, стоит сказать, что на первый взгляд, мод сделан абсолютнейшим дилетантом, ничего не смыслящим в моддинге от слова совсем. И вот почему:</p>
  <ul>
    <li>Диалог ввода пароля сделан с помощью готового импланта из приложения AppCloner (Android)</li>
    <li>Приложение зашифровано через MT Manager (Android)</li>
    <li>К приложению применен хук снятия проверки подписи mthook, из того же MT Manager. При этом, в оригинальном приложении нет проверки подписи!</li>
    <li>При запуске приложение фризит (не реагирует на нажатия кнопок) до того момента, пока ты вручную не выдашь все разрешения через настройки</li>
  </ul>
  <p>Т.е из этого можно сделать вывод, что у моддера либо нет ПК (иначе бы он не стал маяться такой фигней с андроид приложениями для моддинга), либо он конченный извращенец...</p>
  <p>Ну что, заглянем внутрь?</p>
  <h2>Структура мода</h2>
  <p>И с самого первого взгляда становится ясно, что без бубна тут не обойтись:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/08/089688bd-ff3e-4fd4-8cf6-cc460f1bcb75.png" width="1918" />
    <figcaption>Сравнение структуры папок из оригиала (слева) и мода (справа)</figcaption>
  </figure>
  <p>К оригинальным папкам со smali, добавилось еще 2:</p>
  <ul>
    <li>smali_classes2</li>
    <li>smali_mthook</li>
  </ul>
  <p>Сначала глянем, что же в первой. А в ней есть следующие папки с классами:</p>
  <p><strong>andhook/lib/</strong> - множество классов, целью которых являются снятие проверки подписи APK через череду хаков. Но вот в чем прикол - в оригинальном приложении я не нашел даже намёка на ее наличие. Зачем этот хук нужен здесь - не особо понятно. Также внутри <strong>andhook/lib/</strong> имеется отдельная папка с названием xposed. При беглом анализе я понял, что это тот же самый хук, только еще и при помощи xposed (для тех, у кого он установлен). Но дела это не меняет.</p>
  <p><strong>android/os/Environmenu.smali </strong>- изнасилованная копия стандартного класса <strong>android.os.Environment. </strong>Отличие лишь в добавленной отладке для более лучшего дебага.</p>
  <p><strong>com/applisto/appcloner/</strong> - классы, добавленные небезызвестным приложением AppCloner. Все те самые моды, которые можно добавить через него, лежат здесь. Суть в том, что даже если тебе нужно добавить всего 1 фичу в приложение, например тот же пароль на запуск, в приложение интегрируется не только экран с паролем, а ВООБЩЕ ВСЕ ФИЧИ, которые предоставляет AppCloner. Т.е всякие маскировщики, смена икони и названия, автозагрузчики, чистильщики кеша при выходе из приложения, блокировщики сенсоров камеры и т.д. тоже будут вкорячены внутрь, просто будут отключены через специальный файл конфигурации <strong>cloneSettings.json</strong> (зашифрован)</p>
  <p><strong>java/io/ByteArrayOutputStrean.smali</strong> - изнасилованная копия стандартного класса <strong>java.io.ByteArrayOutputStream. </strong>Отличие лишь в добавленной отладке для более лучшего дебага.</p>
  <p>С первым дексом разобрались. А что же со вторым (<strong>smali_mthook</strong>)?</p>
  <p>Это тоже обход проверки подписи, встроенный в MT Manager. Просто это более ранняя его версия (появилась чуть более 2-х лет назад). Тот хук, который я описывал в начале, это его приемник (появился чуть более 3-х месяцев назад). Скорее всего человек применил сразу 2 патча, чтоб наверняка.</p>
  <p>Ресурсы (разметка, иконки, и т.д.) зашифрованы и складированы в одну кучу в папке <strong>/r/</strong>. Их анализ не представляется возможным, ввиду огромного количества времени и сил, которое мне придется потратить (не день, не два и не три).</p>
  <h2>А был ли мальчик?</h2>
  <p>Перейдём к самой главной папке smali, в которой находится код приложения. Может быть здесь будет нечто интересное, крышесносное, и вообще прям &quot;пушка&quot;? Как бы не так...</p>
  <p>Открываем папку, и видим, что очень много smali файлов отличаются между собой на несколько десятков байт. Открываем первый попавшийся файл и нам предстаёт картина маслом:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/cc/ccef53a5-7875-462d-88a8-c353d855541a.png" width="1920" />
  </figure>
  <p>Содержимое этих файлов идентично. Различается только лишь строка <code>.source</code>. Если в оригинале её значение равно &quot;&quot;, то в моде мы видим &quot;SourceFile_xxx&quot;. Вместо xxx могут быть абсолютно любые числа. Сделано это умышленно, чтобы всяческие утилиты сравнения файлов считали эти файлы отличающимися. Да, они отличаются, но по факту это лишь пыль в глаза.</p>
  <p>Иной мододел, будь он на моем месте, опустил бы руки, сказав &quot;я не знаю&quot;, но я-то плюс ко всему еще и разработчик...</p>
  <p>Стоит лишь убрать эти строки, с помощью регулярных выражений</p>
  <p>Для того, чтобы убрать эти строки, нужно написать регулярное выражение. Удобнее всего это делать на <a href="https://regex101.com/" target="_blank">regex101.com</a></p>
  <figure class="m_original">
    <img src="https://teletype.in/files/6b/6b5ce214-852c-4ed5-ac61-0838a39642e5.png" width="1920" />
  </figure>
  <p>Используя следующее регулярное выражение, стоит лишь найти и заменить все совпадения через текстовый редактор с такой функцией (я использую Atom)</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/f2/f2ecb625-6f2b-4270-9f91-248e21e4dd44.png" width="1920" />
  </figure>
  <p>В результате я привел 4 тысячи файлов к оригинальному виду:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/13/1336a879-d211-4c8b-a511-fd8a733a04b9.png" width="393" />
  </figure>
  <p>Делать это вручную было бы сродни самоубийству.</p>
  <p>Ну и последнее, пакет приложения был изменен с com.pk.taxoid на com.pk.taxoie, следовательно нужно его переименовать для удобства сравнения.</p>
  <p>И еще пара штрихов:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/fa/fa78282f-c92f-4cb1-9f20-1edc2e33e11d.png" width="1920" />
  </figure>
  <p>Изменения приложения опишу завтра. Их там не особо много. Скажу лишь одно: этот мод - сборная солянка, помноженная на 1000 и 1 патч для ApkEditor, и накрытая слоем говна от AppCloner.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@svolf/BkBEkS_qH</guid><link>https://teletype.in/@svolf/BkBEkS_qH?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=svolf</link><comments>https://teletype.in/@svolf/BkBEkS_qH?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=svolf#comments</comments><dc:creator>svolf</dc:creator><title>Сравнение 2.7 и 2.8.1 (Частные случаи)</title><pubDate>Thu, 31 Oct 2019 11:02:04 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/6a/6ab56321-11c9-487b-b850-112f01cfba9d.png"></media:content><description><![CDATA[<img src="https://teletype.in/files/6a/6ab56321-11c9-487b-b850-112f01cfba9d.png"></img>Итак, продолжим...]]></description><content:encoded><![CDATA[
  <p>Итак, продолжим...</p>
  <p>Приложение постепенно избавляется от костылей. Множество классов переписываются на использование стоковых андроидовских API, вместо кастомных велосипедов.</p>
  <p>В основном это касается виджетов, Но и некоторые другие классы были изменены.</p>
  <p>Список виджетов:</p>
  <ul>
    <li>/smali/com/pk/taxoid/widget/Button.smali - кнопки</li>
    <li>/smali/com/pk/taxoid/widget/FastPanel.smali - панель вверху списка заказов</li>
    <li>/smali/com/pk/taxoid/widget/LimitedEditText.smali - поле ввода радиуса автозахвата</li>
    <li>/smali/com/pk/taxoid/widget/TableFixHeaders.smali - табы</li>
  </ul>
  <p>В основном изменения однотипны. Разработчик пытается использовать стоковые API по максимуму, минимизируя использование сторонних библиотек и своих костылей.</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/6a/6ab56321-11c9-487b-b850-112f01cfba9d.png" width="1920" />
    <figcaption>Типичные изменения</figcaption>
  </figure>
  <p>Проведены различные оптимизации smali. Множество классов отличаются только лишь отсутствием лишних регистров и прыжков. Скорее всего это результат обработки приложения утилитой R8, которая заменила собой обфускатор ProGuard.</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/0a/0aac1eed-b352-4251-9f65-f71934123f00.png" width="1920" />
  </figure>
  <p>Изменены такие классы как LocationTrackerService (сервис отслеживания локации), MessagingService (сервис, посылающий сообщения водителям - &quot;У вас новое сообщение&quot;) и т.д.</p>
  <p>Экран регистрации в приложении и экран прохождения TO реализован в одной активности -  RegistrationActivirty, с двумя разными фрагментами (в зависимости от того, какая кнопка нажата)</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@svolf/r1PARI7cH</guid><link>https://teletype.in/@svolf/r1PARI7cH?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=svolf</link><comments>https://teletype.in/@svolf/r1PARI7cH?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=svolf#comments</comments><dc:creator>svolf</dc:creator><title>Сравнение 2.7 и 2.8.1 (Общие случаи)</title><pubDate>Sun, 27 Oct 2019 18:15:43 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/fe/fef169bf-a44e-4a2c-aa13-3062b54c0365.png"></media:content><description><![CDATA[<img src="https://teletype.in/files/fe/fef169bf-a44e-4a2c-aa13-3062b54c0365.png"></img>Между 2.7 и 2.8.1 прошло 6 билдов, но изменений там довольно таки много (с точки зрения smali, естественно).]]></description><content:encoded><![CDATA[
  <p>Между 2.7 и 2.8.1 прошло 6 билдов, но изменений там довольно таки много (с точки зрения smali, естественно).</p>
  <p>Сначала скажу о том, что не поменялось с последней исследуемой мной сборки:</p>
  <p>Ассеты - без изменений (искл чейнджлог)</p>
  <p>Нативные библиотеки - без изменений</p>
  <p>Ну а теперь к интересному:</p>
  <h2>Основные изменения</h2>
  <p>Приложение переведено на AndroidX вместо устаревших support library. Не прошло и полутора лет. Большинство фактических изменений в коде будут связаны именно с этим. Поменялись имена и пути классов, теги у Layout-ов и т.д. Всё это очень усложняет сравнение.</p>
  <p>AndroidX? Support library? Что это за набор букв?</p>
  <p>Грубо говоря, AndroidX - это библиотека поддержки от Google, с помощью которой можно использовать новые API на старых версиях Android (например материальный дизайн появился только начиная с Android 5.0, но с помощью данной библиотеки можно использовать элементы этого дизайна и на Android 4.x)</p>
  <p>В 2018 Google изменила концепцию разработки этих бибилиотек. Был изменен рабочий цикл разработки, а так же изменила имя пакета с <strong>android.support.**</strong> на <strong>androidx.**</strong> и <strong>com.google.**</strong></p>
  <p>В общем понятно. Если есть вопросы - дорога в гугл и оф документацию.</p>
  <p><strong>/smali/a/</strong></p>
  <p><strong>/smali/b/</strong></p>
  <p><strong>/smali/d/</strong></p>
  <p>Эти пакеты несут в себе часть классов из AndroidX и прочих библиотек</p>
  <p><strong>/smali/c/ - </strong>бывшая часть <strong>/smali/com/pk/taxoid/libs</strong></p>
  <p><strong>/smali/f/</strong> - бывший <strong>/smali/c/</strong></p>
  <p>Добавлена библиотека Glide <strong>(smali/com/bumptech/glide/)</strong> для загрузки изображений из сети. Сама по себе ничего интересного не представляет, но генерирует просто туеву хучу мусорного кода. Я подозреваю, что она используется для загрузки изображений при прохождении TO (теперь его можно пройти прямо через приложение, а не через сайт, как раньше)</p>
  <p>Обновлена библиотека <strong>okHttp</strong>, используемая при запросах на сервер</p>
  <h2>com/pk/taxoid</h2>
  <figure class="m_original">
    <img src="https://teletype.in/files/fe/fef169bf-a44e-4a2c-aa13-3062b54c0365.png" width="1920" />
    <figcaption>Туева хуча &quot;классических&quot; изменений имен пакетов</figcaption>
  </figure>
  <p><strong>activities/NavigationActivity2.smali</strong></p>
  <p>Улучшения работы и точности карт</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/70/70bde79f-04c1-4036-9f9c-d55c821316f6.png" width="1920" />
    <figcaption>Туева хуча &quot;классических&quot; изменений имен пакетов. Ппц</figcaption>
  </figure>
  <p>Завтра будет продолжение</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@svolf/ByRPLnn_B</guid><link>https://teletype.in/@svolf/ByRPLnn_B?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=svolf</link><comments>https://teletype.in/@svolf/ByRPLnn_B?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=svolf#comments</comments><dc:creator>svolf</dc:creator><title>Mod версия</title><pubDate>Thu, 10 Oct 2019 13:47:18 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/6e/6e8685ac-7030-455d-baaa-96acf993a4d0.png"></media:content><description><![CDATA[<img src="https://teletype.in/files/b2/b26fa4a4-f91c-4668-8c0f-1ed49c5d435d.png"></img>Мод версия реализует простую защиту, основанную на запросах к серверу. Впрочем, человек с головой на плечах с лёгкостью ее обойдёт)]]></description><content:encoded><![CDATA[
  <p>Мод версия реализует простую защиту, основанную на запросах к серверу. Впрочем, человек с головой на плечах с лёгкостью ее обойдёт)</p>
  <p>Вся магия происходит в классе <strong>smali/com/pk/taxoid/libs/d/a/a.smali</strong>:</p>
  <p>В оригинальный класс добавлено 2 переменных:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/b2/b26fa4a4-f91c-4668-8c0f-1ed49c5d435d.png" width="1366" />
  </figure>
  <p>Переменная <strong>count</strong> - это количество обращений к серверу мододела (об этом ниже)</p>
  <p>Переменная <strong>timestamp</strong> это дата обращения. Timestamp это количество миллисекунд прошедшее с 1 января 1970 года. Можешь посмотреть википедию, если хочется больше объяснений.</p>
  <p>Внутри существующего метода <strong>run()</strong> вставлен вызов нового метода <strong>setNewTimer()</strong></p>
  <figure class="m_original">
    <img src="https://teletype.in/files/cc/cc9caaab-5466-4517-a924-21707ba7bc8f.png" width="619" />
  </figure>
  <p>Если результат выполнения метода <code>doGet()</code> меньше <code>100</code>, то переменной <code>e</code> присваивается значение <code>30</code></p>
  <p>Глянем метод <strong>doGet()</strong></p>
  <pre> public static long doGet() throws Exception {
        if (count &gt;= 600) {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(((HttpURLConnection) new URL(&quot;http://taxoid.freeoda.com/?customer=96&quot;).openConnection()).getInputStream()));
            StringBuffer stringBuffer = new StringBuffer();
            while (true) {
                String readLine = bufferedReader.readLine();
                String str = readLine;
                if (readLine != null) {
                    stringBuffer.append(str);
                } else {
                    bufferedReader.close();
                    String stringBuffer2 = stringBuffer.toString();
                    count = 0;
                    timeStamp = Long.parseLong(stringBuffer2);
                    return Long.parseLong(stringBuffer2);
                }
            }
        } else {
            count++;
            return timeStamp;
        }
    }</pre>
  <p>Вот примерная схема работы этого кода:</p>
  <ul>
    <li>если <strong>count</strong> равно 600 или больше</li>
    <ul>
      <li>Подключаемся к серверу <code><a href="http://taxoid.freeoda.com/?customer=96" target="_blank">http://taxoid.freeoda.com/?customer=96</a></code></li>
      <li>Смотрим, какую строку он выдаёт</li>
      <ul>
        <li>Если строка существует, то сохраняем ее значение в переменную</li>
        <li>Если строка не существует, то создаём ее самостоятельно, ставим count = 0, и присваиваем значение строки в переменную timestamp</li>
      </ul>
    </ul>
    <li>Иначе, прибавляем единицу к <strong>count</strong> и возвращаем переменную <strong>timestamp</strong></li>
  </ul>
  <p></p>
  <p>Грубо говоря, timestamp устанавливается на сервере, и ты можешь работать ровно до того момента, как он не пересечёт определенную отметку, устанавливаемую мододелом.</p>
  <p>Сервер, кстати, до сих пор работает:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/29/2998ca9f-c904-40ff-ace2-1aef28e8ccb5.png" width="491" />
    <figcaption>Всё ущё возвращает 0</figcaption>
  </figure>
  <p>Но сама эта проверка ни что иное, как собачий пук, потому что легко убирается всего лишь удалением условия с <strong>doGet()</strong> в методе <strong>setNewTimer()</strong></p>
  <h2>Прочие изменения</h2>
  <h3><strong>smali/com/pk/taxoid/libs/d/d.smal</strong>i:</h3>
  <figure class="m_original">
    <img src="https://teletype.in/files/41/418b4128-de9b-4c5c-82b1-97bdfcc89ba3.png" width="1366" />
  </figure>
  <p>Уменьшен триггер с <code>0x331</code> (817) до <code>0x1</code> (1)</p>
  <h3>smali/com/pk/taxoid/libs/i.smali<strong>:</strong></h3>
  <figure class="m_original">
    <img src="https://teletype.in/files/1a/1ad4e513-1a46-49ec-9b7c-20931c3bcc9f.png" width="1366" />
  </figure>
  <p>Переменная k теперь равна 2000 вместо 0</p>
  <p>Переменная n равна 2000 вместо 1000</p>
  <h3>smali/com/pk/taxoid/widget/FastPanel.smali:</h3>
  <figure class="m_original">
    <img src="https://teletype.in/files/b8/b8e91af1-2bf1-4082-85a5-a892788aff82.png" width="1366" />
  </figure>
  <p>Верхняя панель ввода радиуса автозахвата. Увеличен лимит до 20 000. Важно понимать, что лимит можно сделать хоть 100 000, но работать это будет только в том случае, если это поддерживает сервис.</p>
  <p></p>
  <p>Вот и все фишки данного мода. Такие дела.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@svolf/Hk85pGquS</guid><link>https://teletype.in/@svolf/Hk85pGquS?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=svolf</link><comments>https://teletype.in/@svolf/Hk85pGquS?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=svolf#comments</comments><dc:creator>svolf</dc:creator><title>Сравнение v61 и v69 (часть II)</title><pubDate>Tue, 08 Oct 2019 14:30:38 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/2b/2b11192b-54e9-4447-8d13-976362b7aacf.png"></media:content><description><![CDATA[<img src="https://teletype.in/files/ef/efa99cf7-f942-4536-bdda-1d47ffb48cbc.png"></img>smali/com/pk/taxoid/libs/a/*** - добавлены архитектурные компоненты. Приложение потихоньку переписывается под современные реалии.]]></description><content:encoded><![CDATA[
  <p><strong>smali/com/pk/taxoid/libs/a/***</strong> - добавлены архитектурные компоненты. Приложение потихоньку переписывается под современные реалии.</p>
  <p><strong>smali/com/pk/taxoid/libs/b/***</strong></p>
  <p> <strong>smali/com/pk/taxoid/libs/с/***</strong></p>
  <p> <strong>smali/com/pk/taxoid/libs/e/***</strong></p>
  <p>Классы сильно перетасованы. Что-то сказать сложно. Можно утверждать, что это какие-то улучшения работы с сервисом карт от Яндекса, и прочие внутренние изменения</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/ef/efa99cf7-f942-4536-bdda-1d47ffb48cbc.png" width="1366" />
  </figure>
  <p><strong>smali/com/pk/taxoid/network/c/b.smali</strong> - в запросах к API стала хардкодиться версия приложения. Тупо отдельным параметром:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/02/02a0ea93-3313-4e9a-96a7-b3643e1d7094.png" width="1366" />
  </figure>
  <p><strong>/smali/com/pk/taxoid/network/retrofit/ApiService.smal</strong>i - Добавлены методы запросов на сервис регистрации (getCars/getCities/uploadPhoto и т.д) </p>
  <p><strong>smali/com/pk/taxoid/services/***</strong> полностью отдан под реализацию логики регистрации в сервисе такси</p>
  <h2>Местоположение</h2>
  <p>Хочется остановится подробнее именно на этом изменении. В 2.7 появился отдельный сервис трекинга местоположения. Класс <strong>LocationTrackerService</strong> является foreground сервисом, который имеет постоянное уведомление в строке состояния. Циклично отсылает данные о твоём местоположении. Хочу отметить, что отправка данных начинается сразу после запуска, еще на главном экране.</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/48/488a4841-7775-4e61-b70e-c8b953157c1d.png" width="1366" />
    <figcaption>Создание уведомления о работе сервиса</figcaption>
  </figure>
  <p>Запуск отслеживания идет в методе onStartCommand</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/10/10b8dce9-06f6-48a0-84f2-e60a881a8b36.png" width="1366" />
    <figcaption>Выделенная строка отвечает за передачу геоданных водителя</figcaption>
  </figure>
  <p>Вся основная логика работы с сервисом располагается внутри пакета location, который, в свою очередь, просто-напросто отсылает широту и долготу на сервер. </p>
  <figure class="m_original">
    <img src="https://teletype.in/files/8d/8d608b25-7baf-4bbd-9a09-598c6abe58a8.png" width="588" />
    <figcaption>Эти классы отвечают за передачу локации</figcaption>
  </figure>

]]></content:encoded></item></channel></rss>