Секреты MIUI 12: Масштабная очистка смартфона от лишних программ

Отключил на своём смартфоне Xiaomi сразу 15 приложений, не несущих абсолютно никакой пользы, при условии использовании MIUI.
А некоторые из них и вовсе расходовали оперативную память и мобильный интернет, а значит потребляли заряд аккумулятора.
Надеюсь вы, как и я соскучились по таким статьям и раз уж мы потихоньку приближаемся к финалу, я решил не создавать несколько десятков похожих по смыслу публикаций, а собрал несколько групп однотипных приложений в двух материалах «без воды», долгих речей и множества скриншотов. Поэтому берите свои гаджеты в руки, настраиваетесь на нужный лад, а я пожалуй начну.
Наследие «чистого» Android
Несколько статей назад я уже рассказывал вам о группе приложений «Rounded», основной задачей которых является смена формы значков приложений на смартфонах с «чистым» андроидом. Но для нас, как для пользователей MIUI, они не несут никакой пользы.
Похожие задачи стоят перед группами приложений «Filled» (от 4 до 5 штук в зависимости от версии Android) и «Circular» (5 штук), сюда же относится программа «Teardrop».

Так же стоит упомянуть приложения «Gestural Navigation Bar» в количестве четырёх штук. Они отвечают за стандартные жесты управления в системе Android, но для владельцев MIUI абсолютно бесполезны.

Каждую из двенадцати перечисленных служб, вы можете без последствий отключить на ваших смартфонах, но только в том случае, если вы используете обычную, официальную версию MUI, на кастомных прошивках после отключения могут быть проблемы.
Приложения от Google и китайские сервисы
Начнём с китайских сервисов, которые не работают на территории наших стран, но при этом отлично передают данные, расходуют трафик мобильного интернета, имеют фоновую активность и разряжают батарею.
В Android 11 служба, которую мы отключали ранее, появилась вновь, но под другим названием. Притаившись в моём Redmi Note 10 Pro, она периодически использовала оперативную память и имела кучу разрешений, в том числе «Неограниченный доступ в интернет» и «Запуск активных сеансов».
Я говорю о «MConnService» знакомой нам под именем «vsimcore» — компонент Mi Роуминг, для использования виртуальных сим-карт на территории Китая и Индии. Отключил без раздумий.

Далее идёт ещё один «подарок» от китайских разработчиков, работающий только на родине Xiaomi. Приложение «Справочник» является определителем номера входящих вызовов китайских компании. Так что если вам регулярно не звонят из Китая, его можно и нужно отключить.

Обратите внимание на количество разрешений. Практически все службы смартфона подконтрольны этому безобидному, на первый взгляд, приложению.
Следующее приложение принадлежит «Google» и предоставляет возможность использовать стандартные SMS сообщения как чат мессенджеров (WhatsApp, Viber, Telegram), уверен вы подобным не пользовались и вряд ли будете, так как в Android 11 эта служба уже отсутствует, а вот в Redmi Note 8T (Android 10) постоянно висит в оперативной памяти и расходует мобильный интернет. Название приложения — «uceShimService».

В итоге я избавил свой смартфон от 15 лишних приложений (на самом деле их больше, но об остальных расскажу в следующей статье, чтоб не нагружать). Имена пакетов ждут вас в закреплённом комментарии, все действия проводились с помощью программы ADB App Control (ссылка на видео с инструкцией ниже).
Троянское приложение для Android обходит проверки Google Bouncer
Аналитики ESET обнаружили интересный метод скрытной атаки на пользователей Android, который содержит в себе интересную особенность. В магазине приложений Google Play нам удалось обнаружить несколько приложений, которые маскировались под легитимные, но на самом деле содержали в себе другое приложение с вредоносными функциями. Это встроенное приложение называлось systemdata или resourcea.

Это второе приложение скрытно сбрасывается в память устройства из первого, но спрашивает у пользователя разрешение на установку. Оно представляется в качестве инструмента для управления настройками устройства «Manage Settings». После своей установки, приложение работает как служба в фоновом режиме.
Антивирусные продукты ESET обнаруживают приложения, которые содержат в себе это дополнительное приложение как Android/TrojanDropper.Mapin. Согласно нашим данным, на долю Индии приходится наибольшее количество заражений устройств Android этим вредоносным ПО.
Вредоносная программа представляет из себя бэкдор, который получает контроль над устройством и включает его в состав ботнета. Бэкдор использует специальный внутренний таймер для отложенного исполнения своей полезной нагрузки. Таким образом, авторы могут обмануть различные автоматические системы анализа файлов, которые могут причислить файл к подозрительным из-за его поведения. В некоторых случаях, бэкдор может ждать три дня прежде чем активировать полезную нагрузку. Скорее всего, такая мера позволяет авторам обойти механизмы проверки инструмента анализа файлов Google Bouncer, используемый Google для проверки загружаемых в Play приложений.
После активации полезной нагрузки, троян запрашивает права администратора в системе и начинает взаимодействовать со своим C&C-сервером. Android/Mapin содержит в себе различные функции, например, отображение пользователю различных уведомлений, загрузка, установка и запуск других приложений, а также получение личной информации пользователя на устройстве. В то же время, основной его функцией является отображение fullscreen-рекламы на зараженном устройстве.
Векторы распространения
Вредоносные приложения были размещены в магазине приложений Google Play в конце 2013 г. и в 2014 г. Названия приложений были различными, включая, «Hill climb racing the game», «Plants vs zombies 2», «Subway suffers», «Traffic Racer», «Temple Run 2 Zombies», «Super Hero Adventure» разработчиков TopGame24h, TopGameHit и SHSH. Точные даты загрузки приложений были 24-30 ноября 2013 г. и 22 ноября 2014 г. Согласно статистике ресурса MIXRANK, приложение Plants vs zombies 2 было загружено более 10 тыс. раз перед его удалением из магазина. В то же самое время, приложения «System optimizer», «Zombie Tsunami», «tom cat talk», «Super Hero adventure», «Classic brick game», а также вышеупомянутые приложения Google Play с вредоносными возможностями, были загружены в альтернативные магазины приложений Android теми же авторами. Такой же бэкдор был обнаружен в комплекте с другими приложениями, которые были загружены в магазин разработчиком PRStudio (не путать с prStudio) в альтернативные магазины приложений со ссылками на Google Play. Данный разработчик загрузил как минимум и пять других троянских приложений в альтернативные магазины приложений: «Candy crush» или «Jewel crush», «Racing rivals», «Super maria journey», «Zombie highway killer», «Plants vs Zombies». Эти приложения все еще доступны для скачивания из этих магазинов. Перечисленные приложения были загружены пользователями сотни раз.

Рис. Значки вредоносных приложений.

Рис. Вредоносное приложение, которое получило достаточно положительных оценок.

Рис. Еще одно приложение, получившее положительные оценки.
Существуют различные варианты исполнения вредоносной программы после того, как пользователь загрузил нелегитимное приложение. Один из вариантов предполагает, что жертве будет предложено запустить файл с вредоносной программой спустя 24 после первого исполнения загруженного приложения. Такой метод является менее подозрительным для пользователя, который считает, что запрос на запуск поступил от ОС. Другой метод подразумевает под собой выдачу мгновенного запроса пользователю. Оба варианта рассчитаны на срабатывание после изменения подключения к сети, для этого вредоносная программа регистрирует т. н. broadcast receiver в манифесте.

Рис. Регистрация т. н. broadcast receiver.
После изменения подключения, пользователю будет предложено установить «системное приложение». Само сброшенное на устройство вредоносное приложение может называться «Google Play Update» или «Manage Settings».

Рис. Вредоносное приложение маскируется под системное.
В том случае, если пользователь выбирает отмену установки, то вредоносная программа будет показывать запрос каждый раз при смене сетевого подключения. Можно предположить, что простой пользователь будет уверен в серьезности отображаемого уведомления и в какой-то момент, скорее всего, нажмет кнопку установки только чтобы избавиться от него. После запуска троян исполняется в качестве сервиса со своим зарегистрированным broadcast receiver, ожидая изменения подключения.
Когда такое изменение произойдет, троян попытается зарегистрировать себя с помощью сервиса Google Cloud Messages (GCM) для последующего получения сообщений. После этого, Android/Mapin попытается зарегистрировать зараженное устройство на сервере злоумышленников, отправляя туда такую информацию как имя пользователя, аккаунт Google, IMEI, регистрационный идентификатор (ID) и название своего пакета приложения.

Рис. Процесс регистрации устройства на сервере злоумышленников.
Для того, чтобы исключить возможность своего удаления из системы, троян требует от пользователя активировать режим администратора устройства.

Рис. Предложение пользователю об активации режима администратора устройства.
Троян сообщит на удаленный сервер об успешности активации режима администратора устройства. Как только такая операция произойдет, вредоносная программа будет показывать пользователю рекламу в полноэкранном режиме (interstitial). Такая реклама (interstitial ad) будет отображаться пользователю заново каждый раз при смене подключения. Разработка такого типа рекламы возможна с использованием легитимного AdMob SDK.

Рис. Full-screen реклама (interstitial ad).
Сетевое взаимодействие
Троян взаимодействует со своим управляющим сервером используя сервис Google Cloud Messaging (GCM). Этот сервис все чаще используется современными вредоносными программами для своих целей, через него злоумышленники могут инструктировать бот на выполнение нужных им действий.

Рис. Обрабатываемые ботом команды.
Не все функции вредоносной программы полностью реализованы в ее коде, кроме этого, не все уже реализованные функции используются. Возможно, что сама угроза все еще находится на уровне разработки и будет улучшена в будущем. Как мы уже упоминали, ее основная цель заключается в доставке агрессивной full-screen рекламы для ее отображения пользователю, маскируясь под системное приложение. Бот также может быть использован злоумышленниками для установки другого вредоносного ПО на скомпрометированное устройство.
Кроме показа рекламы, список выполняемых им вспомогательных функций достаточно обширен: изменение идентификатора publisher ID отображаемой рекламы, загрузка и запуск других приложений, отображение уведомлений пользователю, отключение режима администратора устройства, изменение адреса управляющего C&C-сервера, создание на домашнем экране Android ярлыков, которые ведут на URL-адреса загрузки приложений. После исполнения каждой задачи, полученной с помощью GCM, бот будет информировать об этом удаленный сервер с использованием протокола HTTPS.
Троянская программа была успешно загружена в магазин Google Play, поскольку содержала в себе механизм отложенной активации вредоносных функций и, таким образом, не вызвала к себе подозрений со стороны инструмента Bouncer. Интересным вопросом является и то, почему Bouncer не специализируется на статическом анализе исполняемых файлов внутри загруженных приложений. По этим причинам троянская программа свободно распространялась пользователям через официальный магазин приложений Google для Android. Вредоносная игра «Super Hero adventure» была загружена в Play Store разработчиком SHSH. Вполне возможно, что этот разработчик загрузил больше приложений в магазин Play. В конечном счете, все они были удалены из магазина, но оставались незамеченными там в течение полутора лет. Возможно, что подобные случаи стали причиной того, что в марте 2015 г. Google объявила о том, что все приложения и обновления должны проходить проверку со стороны человека.
Лучшей практикой для поддержания своего устройства в безопасности является использование только официального магазина приложений для их загрузки. Кроме этого, необходимо уделять внимание отзывам и комментариям пользователей к размещаемым там приложениям. При установке приложения следует внимательно следить за запрашиваемыми приложением правами. Если вы заметили что-либо подозрительное в поведении приложения, его можно отправить в качестве образца в антивирусную лабораторию с соответствующими комментариями о причинах отправки.
Ниже представлена информация о проанализированных нами образцах вредоносной программы.
ChatGPT написал Android-приложение

Вчера чат-бот с искусственным интеллектом ChatGPT написал за меня Android-приложение! Оно очень примитивное, но компилируется, запускается и работает. Но как он это сделал? С первой попытки или пришлось долго сидеть и мучить его?
Кратко про ChatGPT
В ноябре 2022 года компания OpenAI запустила новый чат-бот с искусственным интеллектом ChatGPT, который уже успел наделать немало шума. Пока главные мировые СМИ рассуждают, заменит ли чат-бот с AI людей (The Guardian, New York Times), ChatGPT уже пишет качественные эссе и сценарии ситкомов. Ну и наверное все, кто заходит на StackOverflow, уже успели увидеть баннер о том, что ответы от ChatGPT запрещены на платформе.
Я решил узнать, сможет ли ChatGPT написать простое Android-приложение. Я знаю, что есть модель OpenAI Codex и проект Copilot, которые заточены именно на помощь разработчикам писать код. Но мне интересно, сможет ли именно чат-бот ChatGPT написать приложение в режиме реального общения в чате.
Придумываем задание для ChatGPT
Я выбрал такое задание: сделать приложение, которое выводит на экран 50 популярных акций фондового рынка и их цены.
И решил придерживаться таких условий:
- лично я не пишу ни строчки кода;
- всё, что я делаю, это копи-паст того, что мне скажет чат-бот;
- я выполняю различные настройки по указанию чат-бота (пройти Wizard в Android Studio, получить API ключ в сервисе и т.д.);
- если появляются любые ошибки или баги, я спрашиваю у чат-бота и исправляю так, как он ответит.
Чего я хочу добиться:
- код должен компилироваться;
- приложение должно запускаться;
- в идеале приложение должно отобразить на экране 50 популярных акций и их цены.
Как думаете, получится? Небольшой спойлер — вот что получилось:
Всё ли сделал бот на 100%? Пришлось ли мне написать самому код? Давайте посмотрим!
Формат
Проект на GitHub, это то самое Android-приложение, которое написал ChatGPT.
Весь разговор с ChatGPT у меня занял 78 вопросов и ответов. По ссылке вы можете прочитать полный разговор со всеми ответами и примерами кода, который дал ChatGPT. В статье я буду сокращать, рассказывать про наиболее интересные, важные и удивительные, на мой взгляд, моменты. Ответы буду приводить не всегда полные, потому что зачастую они были объёмные.
Настройка, первые шаги
Итак, я задал свой первый вопрос:
Q: I want to write an Android app that shows me 50 stock prices as a list from Yahoo API. How can I do it?
В этом вопросе я сразу сказал про Yahoo API, потому что это единственное API по акциям, о котором я что-либо слышал. В итоге так получилось даже интересней, потому что получить API ключ из ответа бота у меня не вышло и позже я попросил другой API сервис. Но первый ответ меня уже удивил:
A: To retrieve stock prices from Yahoo API and display them in an Android app, you will need to perform the following steps:
— Obtain an API key from Yahoo Finance API. You can sign up [. ]
— Set up an Android development environment. You will need to install [. ]
— Create a new Android project in Android Studio. This will give you [. ]
— Add the necessary dependencies to your app. You will need to add the following dependencies to your app’s build.gradle file:
implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
— Create a Java interface for the Yahoo Finance API. This interface will define [. ]
— Use Retrofit to make HTTP requests to [. ]
— Parse the response from the API and display [. ]
[. ]
В первом же ответе ChatGPT расписал все шаги, которые нужно сделать. Некоторые шаги были очень общие, а некоторые очень конкретные, как, например, добавить в зависимость Retrofit.
После того как у меня не вышло получить API ключ в Yahoo по ссылке, которую он дал, я спросил:
Q: What public and free API I can use to get stocks price?
Одним из предложенных вариантов был Alpha Vantage, его я и выбрал. ChatGPT дал мне ссылку, где получить API ключ и по этой ссылке я получил ключ.
Дальше я старался всегда идти последовательно. Если бот давал мне список шагов, то я задавал вопросы по каждому шагу. В первом ответе были шаги про создание пустого проекта и Java Interface для API, эти вопросы я и задал.
Q: How can I create a new Android project in Android Studio with a basic structure?
A: [. ]Q: How should I start to build an android app to get stock prices from alphavantage and show it in the app?
A: [. ]Q: How to create a Java interface for the Alpha Vantage API?
A: [. ]
Java и Kotlin
На последний вопрос он рассказал, как создать Java interface и дал 3 куска кода:
public interface AlphaVantageAPI < String BASE_URL = "https://www.alphavantage.co/"; String API_KEY = "YOUR_API_KEY_HERE"; @GET("query") CallgetStockPrices(@Query("apikey") String apiKey, @Query("symbol") String symbol); >
Retrofit retrofit = new Retrofit.Builder() .baseUrl(AlphaVantageAPI.BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); AlphaVantageAPI alphaVantageAPI = retrofit.create(AlphaVantageAPI.class);
Call call = alphaVantageAPI.getStockPrices(AlphaVantageAPI.API_KEY, "AAPL"); call.enqueue(new Callback() < @Override public void onResponse(Callcall, Response response) < // Parse the response and display the stock prices in the app >@Override public void onFailure(Call call, Throwable t) < // Handle the failure >>);
Я человек современный и знаю, что есть Kotlin, поэтому спросил:
Q: Can you repeat the same in Kotlin?
A: Certainly. Here is an example of how you can create a Kotlin interface for the Alpha Vantage API to retrieve stock prices: […]
На моё удивление, бот повторил все 3 куска кода на Kotlin. Возможно, для знатоков AI это обычное дело, но я был впечатлён в этом моменте.
Я добросовестно скопипастил всё, что чат-бот мне написал. И вижу, что есть неизвестные классы.

Здесь и во всех будущих подобных ситуациях я прямо спрашивал:
Q: Can you show me StockResponse class?
A: Here is an example of a StockResponse class that you can use to parse the response from the Alpha Vantage API:
class StockResponse < @SerializedName("Global Quote") @Expose private val stock: Stock? = null fun getStock(): Stock < return stock!! >>
This StockResponse class has a single field called stock, which is a Stock object that contains the stock price and other information about the stock. [. ]
Класс Stock он тоже привёл.
Когда бот просто скидывал мне кусок кода (например, создание Retrofit’а), то я спрашивал, куда мне его положить:
Q: Where should I put the code with creating retrofit and calling getStockPrices?
В ответ обычно получал распечатку кода MainActivity, где бот заботливо кладёт весь код в onCreate методе. Ну ок, ничего страшного, у нас цель — сделать работающее приложение!
Иногда бот давал код опять на Java и приходилось его просить:
Q: Can you show me the same code in Kotlin?
И он отлично переводил всё то же самое на Kotlin. В этом моменте меня начало поражать, как бот хранит в себе контекст. Он помнит, что за приложение мы пишем, какие там были классы ранее (StockResponse, Stock), какое API мы выбрали, как что называется и т.д.
Фиксим ошибочки
Но не всегда код был такой «идеальный». Иногда бот давал код, где есть обращение к приватным методам или дублирование полей. По каждой проблеме я задавал вопрос и получал фикс, например:
Q: Why do I have an error «Cannot access ‘stock’: it is private in ‘StockResponse'»?
A: The error «Cannot access ‘stock’: it is private in ‘StockResponse'» means that you are trying to access a private field of the StockResponse class from outside of the class, [. ]
To fix this error, you will need to make the stock field visible to other classes by removing the private keyword [. ]
Here is an example of how you can modify the StockResponse class to make the stock field visible to other classes:
class StockResponse
Иногда приходилось переспрашивать и немного менять формулировку, но обычно это обходилось одним уточнением.
Далее я пошёл спрашивать у бота про остальные ошибки компиляции: неизвестные ресурсы, неизвестные вьюхи и т.д.
Q: Ok. But what is «R.id.text_view»? I got error: «Unresolved reference: text_view». Can you fix it?
A: [. ]Q: I already have a TextView in my activity_main.xml generated by default. Should I replace it?
A: [. ]Q: Can you show me show my activity_main.xml should look like?
A: [. ]Q: But I still get error «Unresolved reference: text_view» in my MainActivity at «textView = findViewById(R.id.text_view)» line. Can you fix it?
A: [. ]
На данном этапе я на все вопросы получал отличные ответы, которые просто копипастил в проект.
Компилируется
Поправив все ошибки, я дошёл до момента, когда проект начал успешно собираться. Делаем первый запуск и получаем:
java.lang.SecurityException: Permission denied (missing INTERNET permission?)
Решаем проблемы с помощью бота:
Q: When I try to launch the app It crashes and I see the error «java.lang.SecurityException: Permission denied (missing INTERNET permission?)». How to fix it?
После этого обязательно получаем NPE, тоже решаем с помощью бота вопросом:
Q: I have crash with error «java.lang.NullPointerException» on line «val price = stock. price». How can I fix it?
Бот предлагает решить проблему через if-чик.
if (stock != null) < val price = stock.price . >else < // Handle the case where the stock field is null textView.text = "Error: stock field is null" >
Не крашится
Ура! Приложение запускается и не крашится! Есть первый скриншот.

Видим ошибку про null и начинаем разбираться. Проблема в API модельках. На решение этих проблем ушло много вопросов, штук 10. Не буду здесь их все приводить, можете почитать в полной версии разговора. Но здесь я почувствовал, что боту сложно. Хотелось уже вмешаться и исправить одну строчку, чтобы всё заработало. Но я решил добиться этого с помощью бота и сам подсказал ему, что он противоречит сам себе, и надо написать правильную SerializedName аннотацию у поля.
Q: But you contradict yourself. If JSON response is «Global Quote», and the name of the field in the StockResponse class is stock then we need to use SerializedName annotation.
A: I apologize for the confusion. You are correct that the SerializedName annotation is needed in this case to correctly map the «Global Quote» field in the JSON response to the stock field in the StockResponse class.
Here is the corrected code for the StockResponse class:
data class StockResponse( @SerializedName("Global Quote") val stock: Stock ) data class Stock( val name: String, val price: String )
The `@SerializedName` («Global Quote») annotation specifies that the «Global Quote» field in the JSON response should be mapped to the stock field in the StockResponse class.
I apologize for any confusion that my previous explanations may have caused. I hope this helps clarify things. Let me know if you have any other questions.
Эта подсказка сработала на отлично. Мне очень понравилось, что бот признал, что он был не прав, написал новую версию кода и даже извинился в конце. С одной стороны, можно посчитать, что я немного считерил, и бот не справился. С другой стороны, если рассматривать бота как собеседника, коллегу (ведь именно такую роль хочет играть ChatGPT), то всё выглядит приемлемо: твой коллега немного запутался, ты ему подсказал и он всё решил.
После того как мы поправили все ошибки с API модельками, наше приложение получает и отображает цену акций Apple.

Масштабирование
Я хвалил ChatGPT, что он круто запоминает контекст. Но здесь он забыл, что я изначально просил вывести список из 50 акций, а не одну. Что ж, поехали дальше масштабировать наше приложение.
Q: Now the app shows only one stock — Apple. I want to show the 50 most popular stocks. Can you show me how to do it?
A: To show a list of the 50 most popular stocks in your Android app, you will need to modify your code in several places. Here is an outline of the steps you can follow:
— Modify the Alpha Vantage API endpoint [. ].
— Modify the StockResponse and Stock classes[. ].
— Modify the getStockPrices() method to use the new API endpoint [. ].
— Modify the layout of the app [. ] Instead of using a single TextView element [. ] you will need to use [. ] RecyclerView or ListView, to display a list of stocks. You will also need to create a custom adapter to bind the data from the Stock objects to the layout elements in the list.
Бот перечислил все шаги, которые нужно сделать, включая обновление API классов, использование RecyclerView и создания адаптера для него. Не будем вдаваться в детали. С этой задачей мы тоже справились за последующие 10-15 простых вопросов.
Следующим камнем преткновения стала ошибка неверного API метода. Чат-бот предложил использовать метод TOP_100, чтобы получить акции. Такого метода в API не существует, может быть, он существовал ранее. Но бот не говорил, что это может быть причиной, пока я ему не показал JSON ответ API:
Q: I got response from alphavantage API: «»Error Message»: «This API function (TOP_100) does not exist.»»
A: It appears that the TOP_100 function is not a valid function in the Alpha Vantage API. This may be the cause of the error you are seeing.
To retrieve the top 100 stocks from the Alpha Vantage API, you will need to use a different function. Here are a few options you could consider: [. ]
В итоге мы с ботом решили запросить акции просто перебором:
Q: I need to get 50 popular stock prices from alphavantage API. How can I do it?
val stockSymbols = listOf("AAPL", "MSFT", "GOOG", "FB", "AMZN", "JNJ", "XOM", "V", "PG", "JPM")
Kotlin synthetics
Затем я наткнулся на любопытную историю. В одном из предыдущих ответов бот дал мне такой код:
import kotlinx.android.synthetic.main.stock_item.view.text_view . override fun onBindViewHolder(holder: StockViewHolder, position: Int) < val stock = stocks[position] holder.view.text_view.text = "$- $" >
И я столкнулся с проблемой дубликата классов.
Q: Now I got an error «Execution failed for task ‘:app:checkDebugDuplicateClasses’. A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable Duplicate class kotlinx.android.extensions.CacheImplementation found in modules kotlin-android-extensions-1.3.61 (org.jetbrains.kotlin:kotlin-android-extensions:1.3.61) [. ]». How can I fix it?
A: It looks like you have a conflict between different versions of the kotlin-android-extensions library in your project [. ]
Бот много раз предлагал перепроверить версии разных зависимостей, но ничего не помогало.
Даже с подсказками:
Q: No. It didn’t help. Maybe it is connected to “org.jetbrains.kotlin.android“ plugin?
Мне кажется, дело в том, что в описании ChatGPT есть такое ограничение: Limited knowledge of world and events after 2021. Возможно, этот баг связан с тем, что более новых данных в модели ещё нет, и баги связанные с актуализированием версий могут быть пока проблемой.
В итоге я просто попросил сделать как-то по-другому:
Q: It did not help. I guess the problem with «kotlin-android-extensions». Can we use another approach?
A: If you are experiencing issues with the kotlin-android-extensions plugin, you can try using a different approach to access views in your layout XML file from your Kotlin code.
One alternative approach is to use the findViewById method to access views in your layout XML file. Here is an example of how you might do this: [. ]
О, findViewById — мне подходит!
Классика NetworkOnMainThreadException
Все баги пофикшены, запускаем и получаем долгожданный NetworkOnMainThreadException . Идем в чат фиксить:
Q: Now I have an error «android.os.NetworkOnMainThreadException» in line «val stockResponse = alphaVantageAPI.getStockPrices(symbol = symbol).execute().body()». How can I fix it?
A: The error «android.os.NetworkOnMainThreadException» indicates that you are trying to perform a network operation [. ]
To fix this error, you need to perform the network operation on a background thread. In Android, you can use an AsyncTask or a Thread to run code on a background thread.
ChatGPT предлагает использовать AsyncTask или Thread. AsyncTask! Видимо, точно модель не обучена новым данным. Я выбрал Thread.
Несколько вопросов про дизайн не особо помогли.
Q: Can you do fancy design for this app?
A: [. ]Q: Can you give me example of a fancy theme for this app?
A: [. ]Q: Can you show theme.xml file?
A: [. ]Q: Can you show me how to do nice looking paddings and margins for this app?
A: [. ]
Разве что паддинги добавил.
В итоге получаем вот такое приложение:

Мы получили список из 50 популярных акций фондового рынка и их цену. На скриншоте видно, что один из элементов “null — null”. Это Facebook. ChatGPT запросил данные по тикеру “FB”, но API такого не нашло, потому что теперь оно META.
Выводы
На мой взгляд, можно уверенно говорить, что ChatGPT написал Android-приложение! Оно компилируется, запускается и даже работает. Если вы ждали чуда, написание кода без ошибок, разделение на слои, архитектуру и прочее по списку — увы, пока ещё AI не на таком уровне. Бот пихает всё в MainActivity, норовит писать на Java, предлагает использовать AsyncTask и далее по списку. Но за это я на него не в обиде. Думаю, что дело не за горами.
Давайте проверим, выполнили ли мы все условия:
- Лично я не пишу ни строчки кода — ☑️
- Все что я делаю, это копи-паст того, что мне скажет чат-бот — ☑️;
- Я выполняю различные настройки по указанию чат-бота — ☑️;
- Если появляются любые ошибки или баги, я спрашиваю у чат-бота и исправляю так, как он ответит — ☑️, но с поправкой, что 2 раза я сам сильно подсказал боту. Поэтому здесь может быть половинчатая галочка.
Я был приятно поражён и удивлён результатом. Бот рассказал, как написать приложение, дал все нужные куски кода, помнит про контекст в течение разговора, реагирует за ответные замечания и вообще очень вежливый.
Подписывайтесь на канал Dodo Mobile, там мы коротко рассказываем о том, как разрабатываем мобильные приложения для нашей сети ресторанов быстрого питания.
Filled — что за программа на Андроид?

Filled — данный компонент предположительно связан с отображением значков Андроид, их оформлением/стилем.
Информации о данном приложении нет вообще.
Немного удалось выяснить:
- Filled переводится как заполнять, наполнять, скорее всего имеется ввиду содержимое иконок, возможно оформление, цвет, стиль.
- Это может быть программа, которая отвечает за корректную работу иконок. Возможно телефон получил обновление Filled, после установки которого — могут обновиться значки системных программ, меню, значки разных настроек и прочее. То есть связано с интерфейсом.
- Нет информации о том, что это вирус, опасная программа.
- Также в биосе компьютера вместо модели материнки может быть указана следующая надпись: To Be Filled By O.E.M.. Означает что название материнки задается поставщиком. Обычно данное поле нужно при инвентаризации компьютеров в организации.
- Еще нашел информацию — Filled это может быть одна из тем оформления иконок. Могут быть и другие, например Rounded, Circular.

К сожалению больше никакой информации нет.