LINUX.ORG.RU

Много лишнего мусора вкомпиливается

 


0

4

Создаю простейшее приложение с пустым activity, компилирую, выходит больше мегабайта кода (2.3 MB в Kotlin проекте, чуть больше мегабайта без Kotlin). Включаю minifyEnabled, всё равно несколько сотен килобайтов выходит. Судя по всему это всё support libraries. Мне не нравится столько лишнего мусора. Если отключить support libraries и использовать Java, то получаются нормальные маленькие приложения, в которых только мой код и ничего лишнего, но, судя по всему, это вообще неподдерживаемая конфигурация? Откуда вообще столько лишнего кода выходит? Как это победить? Или всем пофиг?

★★★★★

Переходи на AndroidX. Он модульный и ненужные тебе куски можно просто не тащить.

minifyEnabled если мне изменяет память менее агрессивный по сравнению с proguard. Точно не скажу, но всё равно перепроверь влияет ли proguard-rules на код и оптимально ли он настроен. Там ещё что-то есть про сжатие ресурсов вроде.

Так можно сгладить углы, но чтобы было минимум кода – да, не используй сторонние библиотеки и пиши на Java. Это сложно, но в целом возможно. Да, всем всё равно и приложения в несколько десятков мегабайт это обыденность.

a1batross ★★★★★
()
Ответ на: комментарий от a1batross

Переходи на AndroidX. Он модульный и ненужные тебе куски можно просто не тащить.

Ну вроде хело ворлд и создаётся с androidx:

    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'com.google.android.material:material:1.2.1'
Legioner ★★★★★
() автор топика
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от Legioner

appcompat можно вырезать если ты готов пожертвовать API level.

material это либа со всякими виджетами. Она вот жирная, да. В целом можно тоже выпилить, но это уже вопрос дизайна UI.

a1batross ★★★★★
()
Ответ на: комментарий от a1batross

appcompat можно вырезать если ты готов пожертвовать API level.

Что значит эта фраза? Ты имеешь в виду поддержку старых версий? В чём эта поддержка будет выражаться? Изредка поставить if где-нибудь? Неужто, чтобы показать один пустой activity совместимо со всеми версиями андроида, нужен почти мегабайт минифицированного байткода? Т.е. вручную обеспечить эту совместимость будет практически невозможно?

Ещё удивляет, что Fragment-ы, похоже, вообще обязательно использовать только с support, т.к. он вообще изначально помечен как Deprecated.

Legioner ★★★★★
() автор топика
Ответ на: комментарий от Legioner

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

anonymous
()

Если отключить support libraries и использовать Java, то получаются нормальные маленькие приложения, в которых только мой код и ничего лишнего, но, судя по всему, это вообще неподдерживаемая конфигурация? Откуда вообще столько лишнего кода выходит?

Android Support Libraries и включающий их AndroidX — это и есть сама поддерживаемость. То есть, они скрывают различия API. Если ты их отключаешь, то получаешь приложение, которое заработает на единственной версии андроида.

Ну и ты еще не видел приложения с одним пустым окном на Delphi 10, которое в 32-битном билде весит 2 Мб, а в 64-битном — все 3.5 Мб. Пару сотен килобайт по сравнению с этим — это вполне себе по-божески.

byko3y ★★★★
()
Ответ на: комментарий от anonymous

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

Legioner ★★★★★
() автор топика
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от byko3y

Ну и ты еще не видел приложения с одним пустым окном на Delphi 10, которое в 32-битном билде весит 2 Мб, а в 64-битном — все 3.5 Мб. Пару сотен килобайт по сравнению с этим — это вполне себе по-божески.

Ну во-первых было время, когда я писал приложения на Delphi (вроде 7 тогда была), которые весили несколько десятков килобайтов. И это была вполне распространённая тема, многие так делали. Отключаешь VCL и пользуешься чистым WinAPI.

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

Legioner ★★★★★
() автор топика
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от Legioner

Самое странное, что, похоже, мне одному, ну или гугл меня изолировал от нужной информации. Никаких исследований последних лет по этой теме не находится

https://developer.android.com/topic/performance/reduce-apk-size#remove-unused

«Note: code shrinking can clean up some of a library's unnecessary code, but it might not be able to remove some large internal dependencies.»

https://developer.android.com/topic/libraries/support-library

Исследований не нужно, потому что всё уже написано в доках.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

Там ничего не написано по тому вопросу, который меня интересует, к сожалению. Всё это я читал, там вода. Нет конкретики - какие именно проблемы решает support библиотека по пунктам и как их можно решать без неё. Уже выяснили, что для пустой activity support библиотека не нужна. Теперь осталось выяснить, для чего же она всё-таки нужна.

Legioner ★★★★★
() автор топика
Последнее исправление: Legioner (всего исправлений: 2)
Ответ на: комментарий от Legioner

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

anonymous
()
Ответ на: комментарий от Legioner

В вебе это вроде прекрасно понимают, а в андроиде как-то странно всё

Не вижу. Не вижу, чтобы в вебе это понимали. Сайты растут как на дрожжах. В том числе тот мусор, который я сам разрабатываю.

Ну во-первых было время, когда я писал приложения на Delphi (вроде 7 тогда была), которые весили несколько десятков килобайтов. И это была вполне распространённая тема, многие так делали. Отключаешь VCL и пользуешься чистым WinAPI

Была еще версия VCL, переписанная на object вместо class. Причина раздувания — это неспособность компилятора оптимизировать генерацию RTTI для классов, поскольку теоретически любой класс из подключаемого модуля может быть инстанциирован, а отсюда тянутся все виртуальные методы из описаний классов, и дальше по цепочке половина VCL.

byko3y ★★★★
()
Ответ на: комментарий от Legioner

Т.е. вручную обеспечить эту совместимость будет практически невозможно?

Я как-то очень давно пытался, получилось не очень, постоянно приходилось костылять темы на каких-нибудь Samsung и т. д. Зато размер APK получался действительно микроскопическим: https://github.com/EXL/AstroSmash/releases (набор иконок приложения весит внутри APK-пакета больше чем все скомпилированные классы).

В мире Android практически любое приложение тянет эти одинаковые мегабайты Support/Compat библиотек, это давно уже «норма». Примерно такая же норма, когда каждое Spring Boot приложение тянет с собой собственный Tomcat (или др. сервер).

Был бы Android нормальный, support-либы шли бы как системные обновляемые компоненты хотя бы по типу VC++ Runtime в Windows. Но что имеется, то имеется.

EXL ★★★★★
()
Ответ на: комментарий от byko3y

Не вижу. Не вижу, чтобы в вебе это понимали. Сайты растут как на дрожжах. В том числе тот мусор, который я сам разрабатываю.

Ну возможность делать так, чтобы сайты не росли, есть. Фреймворки минималистичные делают (svelte весит 3.6 KB), форматы новые придумывают (видео, картинок) и тд. То, что некоторые предпочитают этим не пользоваться, это их выбор. Нет никакой рекомендации от Google Chrome подключить какой-нибудь support.js на полтора мегабайта гзипленного кода, чтобы поддерживать какое-нибудь старое API. Хотя не удивлюсь, если появится. Вон они уже разговоры ведут выкинуть XSLT. Но пока вроде нет. Впрочем ладно, это уже оффтоп.

Legioner ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Что такое v4? Это до androidx что-то? Проглядел зависимости, не вижу ничего с названием v4, что можно было бы дропнуть.

Legioner ★★★★★
() автор топика
Ответ на: комментарий от EXL

Понятно, пожалуй это то, что я хотел услышать, раз получилось не очень, видимо не буду голову морочить.

Legioner ★★★★★
() автор топика
Ответ на: комментарий от EXL

Был бы Android нормальный, support-либы шли бы как системные обновляемые компоненты хотя бы по типу VC++ Runtime в Windows. Но что имеется, то имеется

VC++ Runtime под каждую версию студии нужен свой. В итоге софтины либо тягают эти либы с собой, либо тягают официальную инсталяшку от MS с этими либами.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

Либо просто не используют этот рантайм.

Legioner ★★★★★
() автор топика
Ответ на: комментарий от Legioner

Нет никакой рекомендации от Google Chrome подключить какой-нибудь support.js на полтора мегабайта гзипленного кода, чтобы поддерживать какое-нибудь старое API. Хотя не удивлюсь, если появится

Это как раз не оффтоп, а тот же сраный гугл со своими бесконечными инновациями и предложениями приобрести свежий, более совершенный анальный зонд. Всем хорошо было — нет, нужно придумать Shadow DOM.

byko3y ★★★★
()
Ответ на: комментарий от Legioner

Это классы для поддержки запуска приложений на старых версиях андроида 4.х версий, и там есть и другое старье, которое давно пометили как deprecated, тем не менее оно все еще живое и шевелится. В общем-то если ты хочешь реально мультиверсионное приложение и оставаться в пределах условного «java» стека, но действительно не так уж и жирно 3мб за совместимость и возможность не сильно болеть головой в попытках их как-то запуститься и отобразиться на доисторических телефонах. Есть и другой вариант, не писать на «java» вполне приличное приложение можно и на с++ написать, правда в итоге ты там сошками затянешь отнюдь не меньше вспомогательных библиотек чтобы не сильно страдать.

anonymous
()
Ответ на: комментарий от byko3y

Люди хотят кушать, люди кушают, кого волнуют страдания какой-то обезьяны с морковкой, без негатива.

anonymous
()

У тебя minSDK в какое значение установлен?

TheKnight ★★★
()
Ответ на: комментарий от Jefail

Релизный. Изменение minSdk эффекта не даёт.

PS чем больше ковыряюсь с андроидом тем больше он раздражает. У эппла хоть все огорожено но работать в сто раз приятней. Чистая установка студии даёт ошибки в стандартных либах.

Legioner ★★★★★
() автор топика
Ответ на: комментарий от Legioner

Ещё удивляет, что Fragment-ы, похоже, вообще обязательно использовать только с support, т.к. он вообще изначально помечен как Deprecated.

Фрагменты депрекейтнули в апи 28, года 2 назад всего. Ребята осознали, что с десятком необновляемых вариаций реализации фрагментов в сдк каши вообще не сварить и решили, что внешнюю либу хоть обновлять можно.

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

F457 ★★★★
()
Ответ на: комментарий от Legioner

В вебе это вроде прекрасно понимают, а в андроиде как-то странно всё.

Большинством интернета невозможно пользоваться с еджем, оно очень плохо работает. Жизнь уже с 3г начинается...

Может тебе свою нетленку для начала по простому написать? А там глядишь, оно не нужно не будет никому и вопрос размера апк решится сам собой.

F457 ★★★★
()

Всем пофиг.

Пиши на джаве только с фичами своего мин сдк, кто мешает собственно? С правильным мин сдк там вполне себе можно жить.

F457 ★★★★
()

Когда то дельфи делал экзешники по мегабайту заворачивая туда vcl статически. И хотелось чтоб vcl была в dll отдельно. Это было в 1999 году. ЗАЧЕМ в 2020 году пердолится за мегабайт???

unstable-case
()

20 ЛЕТ назад мегабайт было значительным размером

unstable-case
()

ТСу

Android NDK не пробовал?

sqq
()
Ответ на: комментарий от Legioner

Мало кто будет заморачиваться родни сотни людей живущих на даче без нормального дешевого интернета когда в городах с нормальным покрытием и flat-rate тарифами живут миллионы. Ну вот огромный фейсбук озадачен продолжением роста аудитории и сделал лайт-версию своего приложения чтобы получше охватить Индию, Африку и сельские районы. Для разработчика приложения +1мб на саппорт либы даст гораздо больше в плане совместимости, а значит и охвата потенциальной аудитории чем уменьшение времени и стоимости загрузки

cobold ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.