<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Snow Volf</title><author><name>Snow Volf</name></author><id>https://teletype.in/atom/svolf</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/svolf?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@svolf?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=svolf"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/svolf?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-09-21T09:56:45.097Z</updated><entry><id>svolf:HJ7g2rAkU</id><link rel="alternate" type="text/html" href="https://teletype.in/@svolf/HJ7g2rAkU?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=svolf"></link><title>OkHttp</title><published>2020-01-04T17:31:22.634Z</published><updated>2020-01-04T17:31:22.634Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/2e/22/2e22d9f6-3ddf-4195-9940-bb32b2a5fdad.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/6e/cd/6ecd0f65-5f24-45ce-aeca-a2415b54f002.png&quot;&gt;OkHttp - библиотека для работы с сетью. Согласно статье на хабре:</summary><content type="html">
  &lt;p&gt;OkHttp - библиотека для работы с сетью. Согласно &lt;a href=&quot;https://habr.com/ru/post/281965/&quot; target=&quot;_blank&quot;&gt;статье на хабре&lt;/a&gt;:&lt;/p&gt;
  &lt;blockquote&gt;OkHttp была создана для прямой работы с верхним уровнем сокетов Java, при этом не используя какие-либо дополнительные зависимости. Она поставляется в виде JAR-файла, так что разработчики могут использовать ее на любых устройствах с JVM (куда мы включаем, конечно, и Android).&lt;/blockquote&gt;
  &lt;p&gt;Сегодня я не буду рассказывать плюсы и минусы данной библиотеки, приводить ее аналоги и т.д. Нне ради этого я пишу этот пост.&lt;/p&gt;
  &lt;p&gt;Ты обратил внимание на метод &lt;code&gt;closeCodeExceptionMessage(int code)&lt;/code&gt; класса &lt;code&gt;okhttp3.internal.ws.WebSocketProtocol.&lt;/code&gt; И действительно, если просто глянуть на этот метод, кажется будто он выполняет какую-то &amp;quot;магию&amp;quot;, но на самом деле это просто возвращение строки.&lt;/p&gt;
  &lt;p&gt;Взглянем на декомпилированный метод:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/6e/cd/6ecd0f65-5f24-45ce-aeca-a2415b54f002.png&quot; width=&quot;655&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul&gt;
    &lt;li&gt;Поясню, что тут происходит:&lt;/li&gt;
    &lt;li&gt;На вход подается переменная i&lt;/li&gt;
    &lt;li&gt;Если i не находится в диапазоне от 1000 до 5000, метод возвращает сообщение: &lt;code&gt;&amp;quot;Code must be in range [1000,5000): &amp;quot;&lt;/code&gt;&lt;/li&gt;
    &lt;li&gt;Иначе проверяется  ((i меньше 1004 или  i больше 1006) и (i меньше 1012 или i больше 2999)). Если оба этих условия выполняются, то возвращается null&lt;/li&gt;
    &lt;ul&gt;&lt;/ul&gt;
  &lt;/ul&gt;
  &lt;p&gt;Иначе возвращается сообщение о том, что код занят и уже используется&lt;/p&gt;
  &lt;pre&gt;sb.append(&amp;quot;Code &amp;quot;);
sb.append(i);
sb.append(&amp;quot; is reserved and may not be used.&amp;quot;);&lt;/pre&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;К счастью, исходники у этой библиотеки открыты. Идем на GitHub и смотрим, &lt;s&gt;а был ли мальчик&lt;/s&gt; вносились ли какие-нибудь изменения в код со стороны разработчика приложения&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/97/85/97857546-c4e3-41d4-8439-2e722319da50.png&quot; width=&quot;859&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Как видим, код практически не отличается. Да и то, отличия кода из приложения лишь в проделанных оптимизациях со стороны компилятора. Технически же они вообще не отличаются.&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;Посмотрим где этот код используется. К счастью, таких мест всего несколько:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/2e/22/2e22d9f6-3ddf-4195-9940-bb32b2a5fdad.png&quot; width=&quot;800&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Ну и пару примеров использования&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/18/09/18096301-808b-4b86-8c05-e36472534f04.png&quot; width=&quot;587&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/35/f9/35f9b921-2fe0-42fd-8ed2-90268cd454ba.png&quot; width=&quot;855&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Увы. Но данный отрезок кода лишь оповещает разработчика об ошибке, которую он может допустить при разработке, но никак иначе.&lt;/p&gt;

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

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

</content></entry><entry><id>svolf:rk71foZjr</id><link rel="alternate" type="text/html" href="https://teletype.in/@svolf/rk71foZjr?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=svolf"></link><title>Информация по сокетам</title><published>2019-11-07T13:53:31.104Z</published><updated>2019-11-07T13:53:31.104Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/65/6503f145-5bca-43ab-9184-53ee3442028a.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/65/6503f145-5bca-43ab-9184-53ee3442028a.png&quot;&gt;Учитывая, как изменился метод отдачи заказов, можно утверждать, что приложение напрямую ими не управляет.</summary><content type="html">
  &lt;p&gt;Учитывая, как изменился метод отдачи заказов, можно утверждать, что приложение напрямую ими не управляет.&lt;/p&gt;
  &lt;p&gt;До версии 2.6 запросы на сервер отправлялись циклично. Внутри APK был код, который через каждые N миллисекунд отправлял запрос на сервер. Приложение само запрашивало у сервера данные, следовательно его можно было обмануть. К примеру, &amp;quot;ускорить&amp;quot; время с помощью таких программ, как GameGuardian или GameKiller. В этом случае побеждал тот, у кого больше запросов к серверу.&lt;/p&gt;
  &lt;p&gt;Разработчики это прекрасно понимали, и начиная с версии 2.6 они перешли на протокол связи в режиме реального времени - проще говоря, WebSocket.&lt;/p&gt;
  &lt;p&gt;Тут хорошо подходит аналогия с мессенджером: мистер xxx пишет сообщение, и отправляет его мистеру yyy. К сожалению, мистер ххх пишет сообщения очень медленно, но это никак не исправить. Ты не можешь заставить собеседника печатать быстрее, если он не в состоянии это делать. То же самое и с клиентом. Клиент не может заставить сервер отправлять ему сообщения в более ускоренном темпе. Тут-то как раз и появляются флексы с серверами, точнее с их портами. Я не спец в этом деле, не могу сказать, что есть 100% рабочий метод заставить сервер быстрее отсылать сообщения, только если это не скомпрометированный сервер.&lt;/p&gt;
  &lt;p&gt;Я скажу лишь о тех моментах, которые связаны с получением данных через Socket протокол. Для удобства анализа всё будет представлено в виде Java-кода, а не smali. Java более проста для понимания сложных алгоритмов.&lt;/p&gt;
  &lt;p&gt;Итак, преступим:&lt;/p&gt;
  &lt;p&gt;Сначала стоит поискать по ключевому слову &amp;quot;Socket&amp;quot;&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/65/6503f145-5bca-43ab-9184-53ee3442028a.png&quot; width=&quot;800&quot; /&gt;
    &lt;figcaption&gt;Результаты поиска&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p&gt;Нашло 46 результатов. Теперь еще раз сделаем выборку. На этот раз по слову &amp;quot;taxoid&amp;quot;. Там и вовсе 2 класса:&lt;/p&gt;
  &lt;ol&gt;
    &lt;li&gt;&lt;code&gt;c.c.a.d.b.a.l.java&lt;/code&gt;&lt;/li&gt;
  &lt;/ol&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/b0/b0a6c118-0e4a-456a-be09-16c7e5ae86d4.png&quot; width=&quot;1920&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Я изменял эти переменные еще в самом начале изучения Taxoid-а. Объясню, что тут происходит:&lt;/p&gt;
  &lt;p&gt;Присваиваются несколько переменных.&lt;/p&gt;
  &lt;p&gt;Класс &lt;code&gt;d.b.b.e&lt;/code&gt; объявляется как переменная &lt;code&gt;e&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;В эту переменную складываются сценарии ответа в формате &amp;quot;ключ-значение&amp;quot;. Какое событие выполнится при коннекте, при ошибке, таймауте, ошибке повторного коннекта и т.д.&lt;/p&gt;
  &lt;p&gt;В дальнейшем коде идут запросы на сервер, с твоими данными локации, логином-паролем и т.д.&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/e4/e4f47007-224d-4728-811c-036cce4c723f.png&quot; width=&quot;1920&quot; /&gt;
    &lt;figcaption&gt;Код коннектов к серверу. Класс &lt;code&gt;d.b.b.e&lt;/code&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p&gt;А где же сокеты?&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/e1/e1e55e92-0385-4439-9a54-778213399ca0.png&quot; width=&quot;1920&quot; /&gt;
    &lt;figcaption&gt;При ошибке подключения используется сокетное оповещение&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p&gt;2. &lt;code&gt; c.c.a.d.c.e.java&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;Глядим здесь упоминание сокетов:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/f5/f5290b90-a6ae-4add-b826-e7e6f5200b82.png&quot; width=&quot;1920&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Здесь:&lt;/p&gt;
  &lt;p&gt;Устанавливается сокетное соединение с уже данным хостом и портом&lt;/p&gt;
  &lt;p&gt;Устанавливается таймаут в 10 секунд&lt;/p&gt;
  &lt;p&gt;Начинается чтение данных с сокетного соединения&lt;/p&gt;
  &lt;p&gt;Устанавливается флаг коннекта в положение true. Скорее всего, чтобы не коннектиться каждый раз по новой.&lt;/p&gt;
  &lt;p&gt;А сам адрес, откуда берутся данные:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/1b/1b45a293-1ed5-42f3-b2ad-c96d31610822.png&quot; width=&quot;1920&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Круг замкнулся. Осталось только посмотреть, что за данные он отдаёт&lt;/p&gt;
  &lt;p&gt;Об этом чуть позже.&lt;/p&gt;

</content></entry><entry><id>svolf:Syh2bls9S</id><link rel="alternate" type="text/html" href="https://teletype.in/@svolf/Syh2bls9S?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=svolf"></link><title>Обзор мода с паролем (часть 2)</title><published>2019-11-02T12:08:19.785Z</published><updated>2019-11-02T12:08:19.785Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/b5/b52cc3f7-552b-4072-9e03-71a676601356.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/b5/b52cc3f7-552b-4072-9e03-71a676601356.png&quot;&gt;Реальных изменений маловато. После разгребания путающего кода, остаются след. изменения:</summary><content type="html">
  &lt;p&gt;Реальных изменений маловато. После разгребания путающего кода, остаются след. изменения:&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;com/pk/taxoid/activities/AuthActivity.smali&lt;/strong&gt; - добавлен метод &lt;code&gt;disableDoze()&lt;/code&gt;, который добавляет отключение оптимизации Doze Mode, и, в теории, обеспечивает более стабильную работу приложения в фоновом режиме (система не будет выгружать его при малом заряде батареи)&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;smali/com/pk/taxoid/activities/NavigationActivity2.smali&lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;smali/com/pk/taxoid/activities/NavigationActivity.smali&lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;smali/com/pk/taxoid/activities/SelectLocationActivity2.smali&lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;smali/com/pk/taxoid/activities/SettingsActivity$FilterPreferenceFragment.smali&lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;smali/com/pk/taxoid/activities/SettingsActivity.smali&lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;smali/com/pk/taxoid/widget/LimitedEditText.smali&lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;smali/ru/yandex/bz.smali&lt;/strong&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;Удалены все тосты (всплывающие сообщения с текстом).&lt;/p&gt;
  &lt;p&gt;smali/com/pk/taxoid/libs/location/b.smali - изменено дефолтное значение локации с &amp;quot;unknown&amp;quot; на &amp;quot;pinkypieunknownpinkypie&amp;quot;. Зачем - непонятно.&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/b5/b52cc3f7-552b-4072-9e03-71a676601356.png&quot; width=&quot;1920&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;И еще такие же:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/d3/d3473b0e-e2b6-41cf-8045-210962e0dfb4.png&quot; width=&quot;1920&quot; /&gt;
    &lt;figcaption&gt;Какой-то фетиш на pinkypie&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/e4/e46fe249-3334-47bb-b715-6516e2a76a87.png&quot; width=&quot;1920&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;/smali/d/a/a/a/n/g/l.smali&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;/smali/d/a/a/a/n/g/r.smali &lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Удалены ссылки для отправки отчетов об ошибках разработчикам.&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/2a/2af56ca0-d5dd-4d22-96f1-700dc50ff16f.png&quot; width=&quot;1920&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Манифест&lt;/p&gt;
  &lt;p&gt;Заменен ключ Google карт&lt;/p&gt;
  &lt;p&gt;Добавлены разрешения:&lt;/p&gt;
  &lt;p&gt;android.permission.SYSTEM_ALERT_WINDOW&lt;br /&gt;android.permission.READ_LOGS&lt;br /&gt;net.dinglisch.android.tasker.PERMISSION_RUN_TASKS&lt;br /&gt;android.permission.BLUETOOTH_ADMIN&lt;br /&gt;android.permission.VIBRATE&lt;br /&gt;android.permission.SYSTEM_ALERT_WINDOW&lt;br /&gt;android.permission.CHANGE_WIFI_STATE&lt;br /&gt;android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS&lt;br /&gt;android.permission.ACCESS_NETWORK_STATE&lt;br /&gt;android.permission.USE_FINGERPRINT&lt;br /&gt;android.permission.ACCESS_WIFI_STATE&lt;br /&gt;android.permission.BLUETOOTH&lt;br /&gt;android.permission.WRITE_SETTINGS&lt;br /&gt;android.permission.READ_SETTINGS&lt;/p&gt;
  &lt;p&gt;Вот и всё. Из значимых изменений, только doze. Остальное  - пшик.&lt;/p&gt;

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

</content></entry><entry><id>svolf:BkBEkS_qH</id><link rel="alternate" type="text/html" href="https://teletype.in/@svolf/BkBEkS_qH?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=svolf"></link><title>Сравнение 2.7 и 2.8.1 (Частные случаи)</title><published>2019-10-31T11:02:04.571Z</published><updated>2019-10-31T11:02:04.571Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/6a/6ab56321-11c9-487b-b850-112f01cfba9d.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/6a/6ab56321-11c9-487b-b850-112f01cfba9d.png&quot;&gt;Итак, продолжим...</summary><content type="html">
  &lt;p&gt;Итак, продолжим...&lt;/p&gt;
  &lt;p&gt;Приложение постепенно избавляется от костылей. Множество классов переписываются на использование стоковых андроидовских API, вместо кастомных велосипедов.&lt;/p&gt;
  &lt;p&gt;В основном это касается виджетов, Но и некоторые другие классы были изменены.&lt;/p&gt;
  &lt;p&gt;Список виджетов:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;/smali/com/pk/taxoid/widget/Button.smali - кнопки&lt;/li&gt;
    &lt;li&gt;/smali/com/pk/taxoid/widget/FastPanel.smali - панель вверху списка заказов&lt;/li&gt;
    &lt;li&gt;/smali/com/pk/taxoid/widget/LimitedEditText.smali - поле ввода радиуса автозахвата&lt;/li&gt;
    &lt;li&gt;/smali/com/pk/taxoid/widget/TableFixHeaders.smali - табы&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;В основном изменения однотипны. Разработчик пытается использовать стоковые API по максимуму, минимизируя использование сторонних библиотек и своих костылей.&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/6a/6ab56321-11c9-487b-b850-112f01cfba9d.png&quot; width=&quot;1920&quot; /&gt;
    &lt;figcaption&gt;Типичные изменения&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p&gt;Проведены различные оптимизации smali. Множество классов отличаются только лишь отсутствием лишних регистров и прыжков. Скорее всего это результат обработки приложения утилитой R8, которая заменила собой обфускатор ProGuard.&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/0a/0aac1eed-b352-4251-9f65-f71934123f00.png&quot; width=&quot;1920&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Изменены такие классы как LocationTrackerService (сервис отслеживания локации), MessagingService (сервис, посылающий сообщения водителям - &amp;quot;У вас новое сообщение&amp;quot;) и т.д.&lt;/p&gt;
  &lt;p&gt;Экран регистрации в приложении и экран прохождения TO реализован в одной активности -  RegistrationActivirty, с двумя разными фрагментами (в зависимости от того, какая кнопка нажата)&lt;/p&gt;

</content></entry><entry><id>svolf:r1PARI7cH</id><link rel="alternate" type="text/html" href="https://teletype.in/@svolf/r1PARI7cH?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=svolf"></link><title>Сравнение 2.7 и 2.8.1 (Общие случаи)</title><published>2019-10-27T18:15:43.013Z</published><updated>2019-10-27T18:15:43.013Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/fe/fef169bf-a44e-4a2c-aa13-3062b54c0365.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/fe/fef169bf-a44e-4a2c-aa13-3062b54c0365.png&quot;&gt;Между 2.7 и 2.8.1 прошло 6 билдов, но изменений там довольно таки много (с точки зрения smali, естественно).</summary><content type="html">
  &lt;p&gt;Между 2.7 и 2.8.1 прошло 6 билдов, но изменений там довольно таки много (с точки зрения smali, естественно).&lt;/p&gt;
  &lt;p&gt;Сначала скажу о том, что не поменялось с последней исследуемой мной сборки:&lt;/p&gt;
  &lt;p&gt;Ассеты - без изменений (искл чейнджлог)&lt;/p&gt;
  &lt;p&gt;Нативные библиотеки - без изменений&lt;/p&gt;
  &lt;p&gt;Ну а теперь к интересному:&lt;/p&gt;
  &lt;h2&gt;Основные изменения&lt;/h2&gt;
  &lt;p&gt;Приложение переведено на AndroidX вместо устаревших support library. Не прошло и полутора лет. Большинство фактических изменений в коде будут связаны именно с этим. Поменялись имена и пути классов, теги у Layout-ов и т.д. Всё это очень усложняет сравнение.&lt;/p&gt;
  &lt;p&gt;AndroidX? Support library? Что это за набор букв?&lt;/p&gt;
  &lt;p&gt;Грубо говоря, AndroidX - это библиотека поддержки от Google, с помощью которой можно использовать новые API на старых версиях Android (например материальный дизайн появился только начиная с Android 5.0, но с помощью данной библиотеки можно использовать элементы этого дизайна и на Android 4.x)&lt;/p&gt;
  &lt;p&gt;В 2018 Google изменила концепцию разработки этих бибилиотек. Был изменен рабочий цикл разработки, а так же изменила имя пакета с &lt;strong&gt;android.support.**&lt;/strong&gt; на &lt;strong&gt;androidx.**&lt;/strong&gt; и &lt;strong&gt;com.google.**&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;В общем понятно. Если есть вопросы - дорога в гугл и оф документацию.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;/smali/a/&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;/smali/b/&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;/smali/d/&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Эти пакеты несут в себе часть классов из AndroidX и прочих библиотек&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;/smali/c/ - &lt;/strong&gt;бывшая часть &lt;strong&gt;/smali/com/pk/taxoid/libs&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;/smali/f/&lt;/strong&gt; - бывший &lt;strong&gt;/smali/c/&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Добавлена библиотека Glide &lt;strong&gt;(smali/com/bumptech/glide/)&lt;/strong&gt; для загрузки изображений из сети. Сама по себе ничего интересного не представляет, но генерирует просто туеву хучу мусорного кода. Я подозреваю, что она используется для загрузки изображений при прохождении TO (теперь его можно пройти прямо через приложение, а не через сайт, как раньше)&lt;/p&gt;
  &lt;p&gt;Обновлена библиотека &lt;strong&gt;okHttp&lt;/strong&gt;, используемая при запросах на сервер&lt;/p&gt;
  &lt;h2&gt;com/pk/taxoid&lt;/h2&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/fe/fef169bf-a44e-4a2c-aa13-3062b54c0365.png&quot; width=&quot;1920&quot; /&gt;
    &lt;figcaption&gt;Туева хуча &amp;quot;классических&amp;quot; изменений имен пакетов&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;activities/NavigationActivity2.smali&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Улучшения работы и точности карт&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/70/70bde79f-04c1-4036-9f9c-d55c821316f6.png&quot; width=&quot;1920&quot; /&gt;
    &lt;figcaption&gt;Туева хуча &amp;quot;классических&amp;quot; изменений имен пакетов. Ппц&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p&gt;Завтра будет продолжение&lt;/p&gt;

</content></entry><entry><id>svolf:ByRPLnn_B</id><link rel="alternate" type="text/html" href="https://teletype.in/@svolf/ByRPLnn_B?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=svolf"></link><title>Mod версия</title><published>2019-10-10T13:47:18.137Z</published><updated>2019-10-10T13:47:18.137Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/6e/6e8685ac-7030-455d-baaa-96acf993a4d0.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/b2/b26fa4a4-f91c-4668-8c0f-1ed49c5d435d.png&quot;&gt;Мод версия реализует простую защиту, основанную на запросах к серверу. Впрочем, человек с головой на плечах с лёгкостью ее обойдёт)</summary><content type="html">
  &lt;p&gt;Мод версия реализует простую защиту, основанную на запросах к серверу. Впрочем, человек с головой на плечах с лёгкостью ее обойдёт)&lt;/p&gt;
  &lt;p&gt;Вся магия происходит в классе &lt;strong&gt;smali/com/pk/taxoid/libs/d/a/a.smali&lt;/strong&gt;:&lt;/p&gt;
  &lt;p&gt;В оригинальный класс добавлено 2 переменных:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/b2/b26fa4a4-f91c-4668-8c0f-1ed49c5d435d.png&quot; width=&quot;1366&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Переменная &lt;strong&gt;count&lt;/strong&gt; - это количество обращений к серверу мододела (об этом ниже)&lt;/p&gt;
  &lt;p&gt;Переменная &lt;strong&gt;timestamp&lt;/strong&gt; это дата обращения. Timestamp это количество миллисекунд прошедшее с 1 января 1970 года. Можешь посмотреть википедию, если хочется больше объяснений.&lt;/p&gt;
  &lt;p&gt;Внутри существующего метода &lt;strong&gt;run()&lt;/strong&gt; вставлен вызов нового метода &lt;strong&gt;setNewTimer()&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/cc/cc9caaab-5466-4517-a924-21707ba7bc8f.png&quot; width=&quot;619&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Если результат выполнения метода &lt;code&gt;doGet()&lt;/code&gt; меньше &lt;code&gt;100&lt;/code&gt;, то переменной &lt;code&gt;e&lt;/code&gt; присваивается значение &lt;code&gt;30&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;Глянем метод &lt;strong&gt;doGet()&lt;/strong&gt;&lt;/p&gt;
  &lt;pre&gt; public static long doGet() throws Exception {
        if (count &amp;gt;= 600) {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(((HttpURLConnection) new URL(&amp;quot;http://taxoid.freeoda.com/?customer=96&amp;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;
        }
    }&lt;/pre&gt;
  &lt;p&gt;Вот примерная схема работы этого кода:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;если &lt;strong&gt;count&lt;/strong&gt; равно 600 или больше&lt;/li&gt;
    &lt;ul&gt;
      &lt;li&gt;Подключаемся к серверу &lt;code&gt;&lt;a href=&quot;http://taxoid.freeoda.com/?customer=96&quot; target=&quot;_blank&quot;&gt;http://taxoid.freeoda.com/?customer=96&lt;/a&gt;&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;Смотрим, какую строку он выдаёт&lt;/li&gt;
      &lt;ul&gt;
        &lt;li&gt;Если строка существует, то сохраняем ее значение в переменную&lt;/li&gt;
        &lt;li&gt;Если строка не существует, то создаём ее самостоятельно, ставим count = 0, и присваиваем значение строки в переменную timestamp&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/ul&gt;
    &lt;li&gt;Иначе, прибавляем единицу к &lt;strong&gt;count&lt;/strong&gt; и возвращаем переменную &lt;strong&gt;timestamp&lt;/strong&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;Грубо говоря, timestamp устанавливается на сервере, и ты можешь работать ровно до того момента, как он не пересечёт определенную отметку, устанавливаемую мододелом.&lt;/p&gt;
  &lt;p&gt;Сервер, кстати, до сих пор работает:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/29/2998ca9f-c904-40ff-ace2-1aef28e8ccb5.png&quot; width=&quot;491&quot; /&gt;
    &lt;figcaption&gt;Всё ущё возвращает 0&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p&gt;Но сама эта проверка ни что иное, как собачий пук, потому что легко убирается всего лишь удалением условия с &lt;strong&gt;doGet()&lt;/strong&gt; в методе &lt;strong&gt;setNewTimer()&lt;/strong&gt;&lt;/p&gt;
  &lt;h2&gt;Прочие изменения&lt;/h2&gt;
  &lt;h3&gt;&lt;strong&gt;smali/com/pk/taxoid/libs/d/d.smal&lt;/strong&gt;i:&lt;/h3&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/41/418b4128-de9b-4c5c-82b1-97bdfcc89ba3.png&quot; width=&quot;1366&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Уменьшен триггер с &lt;code&gt;0x331&lt;/code&gt; (817) до &lt;code&gt;0x1&lt;/code&gt; (1)&lt;/p&gt;
  &lt;h3&gt;smali/com/pk/taxoid/libs/i.smali&lt;strong&gt;:&lt;/strong&gt;&lt;/h3&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/1a/1ad4e513-1a46-49ec-9b7c-20931c3bcc9f.png&quot; width=&quot;1366&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Переменная k теперь равна 2000 вместо 0&lt;/p&gt;
  &lt;p&gt;Переменная n равна 2000 вместо 1000&lt;/p&gt;
  &lt;h3&gt;smali/com/pk/taxoid/widget/FastPanel.smali:&lt;/h3&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/b8/b8e91af1-2bf1-4082-85a5-a892788aff82.png&quot; width=&quot;1366&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Верхняя панель ввода радиуса автозахвата. Увеличен лимит до 20 000. Важно понимать, что лимит можно сделать хоть 100 000, но работать это будет только в том случае, если это поддерживает сервис.&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;Вот и все фишки данного мода. Такие дела.&lt;/p&gt;

</content></entry><entry><id>svolf:Hk85pGquS</id><link rel="alternate" type="text/html" href="https://teletype.in/@svolf/Hk85pGquS?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=svolf"></link><title>Сравнение v61 и v69 (часть II)</title><published>2019-10-08T14:30:38.298Z</published><updated>2019-10-08T14:30:38.298Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/2b/2b11192b-54e9-4447-8d13-976362b7aacf.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/ef/efa99cf7-f942-4536-bdda-1d47ffb48cbc.png&quot;&gt;smali/com/pk/taxoid/libs/a/*** - добавлены архитектурные компоненты. Приложение потихоньку переписывается под современные реалии.</summary><content type="html">
  &lt;p&gt;&lt;strong&gt;smali/com/pk/taxoid/libs/a/***&lt;/strong&gt; - добавлены архитектурные компоненты. Приложение потихоньку переписывается под современные реалии.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;smali/com/pk/taxoid/libs/b/***&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt; &lt;strong&gt;smali/com/pk/taxoid/libs/с/***&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt; &lt;strong&gt;smali/com/pk/taxoid/libs/e/***&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Классы сильно перетасованы. Что-то сказать сложно. Можно утверждать, что это какие-то улучшения работы с сервисом карт от Яндекса, и прочие внутренние изменения&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/ef/efa99cf7-f942-4536-bdda-1d47ffb48cbc.png&quot; width=&quot;1366&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;smali/com/pk/taxoid/network/c/b.smali&lt;/strong&gt; - в запросах к API стала хардкодиться версия приложения. Тупо отдельным параметром:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/02/02a0ea93-3313-4e9a-96a7-b3643e1d7094.png&quot; width=&quot;1366&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;/smali/com/pk/taxoid/network/retrofit/ApiService.smal&lt;/strong&gt;i - Добавлены методы запросов на сервис регистрации (getCars/getCities/uploadPhoto и т.д) &lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;smali/com/pk/taxoid/services/***&lt;/strong&gt; полностью отдан под реализацию логики регистрации в сервисе такси&lt;/p&gt;
  &lt;h2&gt;Местоположение&lt;/h2&gt;
  &lt;p&gt;Хочется остановится подробнее именно на этом изменении. В 2.7 появился отдельный сервис трекинга местоположения. Класс &lt;strong&gt;LocationTrackerService&lt;/strong&gt; является foreground сервисом, который имеет постоянное уведомление в строке состояния. Циклично отсылает данные о твоём местоположении. Хочу отметить, что отправка данных начинается сразу после запуска, еще на главном экране.&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/48/488a4841-7775-4e61-b70e-c8b953157c1d.png&quot; width=&quot;1366&quot; /&gt;
    &lt;figcaption&gt;Создание уведомления о работе сервиса&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p&gt;Запуск отслеживания идет в методе onStartCommand&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/10/10b8dce9-06f6-48a0-84f2-e60a881a8b36.png&quot; width=&quot;1366&quot; /&gt;
    &lt;figcaption&gt;Выделенная строка отвечает за передачу геоданных водителя&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p&gt;Вся основная логика работы с сервисом располагается внутри пакета location, который, в свою очередь, просто-напросто отсылает широту и долготу на сервер. &lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/8d/8d608b25-7baf-4bbd-9a09-598c6abe58a8.png&quot; width=&quot;588&quot; /&gt;
    &lt;figcaption&gt;Эти классы отвечают за передачу локации&lt;/figcaption&gt;
  &lt;/figure&gt;

</content></entry></feed>