Posted on Leave a comment

Android compilers, AOT, JIT, performance, etc

Android CPU, Compilers, D8 & R8 [ https://proandroiddev.com/android-cpu-compilers-d8-r8-a3aa2bfbc109 ]

Android app startup time: why we care [ https://medium.com/inlocotech/android-app-startup-time-why-we-care-b70eada84b26 ]

Сжимаем APK, стараясь сохранить его работоспособность [ https://habr.com/ru/post/452524/ ]

Increasing performance in an Android application [ https://heartbeat.fritz.ai/increasing-performance-in-an-android-application-1086640aeef ]

How to optimize memory consumption when using Glide [ https://proandroiddev.com/how-to-optimize-memory-consumption-when-using-glide-9ac984cfe70f ]

The internals of Android APK build process — Article
Understanding the flow of the Android APK build process, the execution environment, and code compilation
[https://medium.com/androiddevnotes/the-internals-of-android-apk-build-process-article-5b68c385fb20]

Going Deep on JetPack Benchmark
[https://proandroiddev.com/going-deep-on-androidx-benchmark-d06b89765f9e]

Optimize the build speed for your Android project
[https://www.crazylegend.dev/2020/07/optimize-build-speeds-for-your-android.html]

Инструменты для запуска и разработки Java приложений, компиляция, выполнение на JVM
[https://habr.com/ru/post/471772/] [http://www.arvifox.com/wp-content/uploads/2020/08/java-jvm-habr.pdf]

Android изнутри: сравнение Dalvik и ART
[https://habr.com/ru/post/513928/] [http://www.arvifox.com/wp-content/uploads/2020/08/java-jvm-habr-2.pdf]

Android Runtime — How Dalvik and ART work?
[https://proandroiddev.com/android-runtime-how-dalvik-and-art-work-6e57cf1c50e5]

Загрузка и сборка AOSP
[https://habr.com/ru/post/517922/]

«Холодный» запуск Android-приложения
[https://habr.com/ru/post/521522/]

Отрисовка первого кадра Android-приложения
[https://habr.com/ru/post/522670/]

Бесшовные A/B-обновления в Android: как они устроены
[https://habr.com/ru/company/sberdevices/blog/521036/]

Comparison of ProGuard vs. R8: October 2019 edition [ https://www.guardsquare.com/en/blog/comparison-proguard-vs-r8-october-2019-edition ]

Shrinking Your App with R8
[https://medium.com/androiddevelopers/shrinking-your-app-with-r8-909efac25de4]

R8 Shrinking in Android
[https://medium.com/better-programming/r8-shrinking-in-android-27f3edbbad9e]

How to break your Android App with proguard / R8
[https://medium.com/@woitaschek/how-to-break-your-android-app-with-proguard-r8-6566bc387b63]

R8 Optimization: Lambda Groups
[https://jakewharton.com/r8-optimization-lambda-groups/]

Что такое Android Lint и как он помогает писать поддерживаемый код [ https://habr.com/ru/post/456272/ ]

Support for newer Java language APIs
14.07.2020 [https://medium.com/androiddevelopers/support-for-newer-java-language-apis-bca79fc8ef65]

Everything you need to know about Memory Leaks in Android. [ https://proandroiddev.com/everything-you-need-to-know-about-memory-leaks-in-android-d7a59faaf46a ]

Android Internals: ART vs DVM deep dive [ https://android.jlelse.eu/android-internals-art-vs-dvm-deep-dive-def34cf664d7 ]

Exploring the Android build process: Caching [ https://medium.com/asos-techblog/exploring-the-android-build-process-caching-a9ee3e12873a ]

Exploring the Android build process: demystifying Gradle flags [ https://medium.com/asos-techblog/exploring-the-android-build-process-demystifying-gradle-flags-74334255462 ]

Android Internals 101: How Android OS Starts You Application [ https://proandroiddev.com/android-internals-101-how-android-os-starts-you-application-e1c98a014c05 ]

Android Permissions System Vulnerabilities and Possible Workarounds [ https://medium.com/swlh/android-permissions-system-vulnerabilities-and-possible-workarounds-8098519aefa9 ]

Making Android Lint Theme Aware — Part 1 [ https://proandroiddev.com/making-android-lint-theme-aware-6285737b13bc ]

Is there a unique Android device ID? [ https://stackoverflow.com/questions/2785485/is-there-a-unique-android-device-id ]

Top 12 Ways to Reduce Android App Size During App Development Lifecycle [ https://www.mindinventory.com/blog/how-to-reduce-android-app-size/ ]

R8 Optimization: Class Reflection and Forced Inlining [ https://jakewharton.com/r8-optimization-class-reflection-and-forced-inlining/ ]

Feature Flags – How to use [ https://jeroenmols.com/blog/2019/08/20/featureflagshowtouse/ ]

Фантастические плагины, vol. 1. Теория [ https://habr.com/ru/company/hh/blog/463583/ ]

Dealing with Large Memory Requirements on Android [ https://pspdfkit.com/blog/2019/android-large-memory-requirements/ ]

Speed up your Android Studio [ https://blog.kaush.co/2019/08/19/android-studio-slow-as-fxxx/ ]

TimingLogger: An idiomatic Android approach to measuring execution time [ https://itnext.io/timinglogger-an-idiomatic-android-approach-to-measuring-execution-time-8ac10a8fa0ba ]

Memory Management
Android Memory Management, Garbage collection, DDMS, How to Improve Memory Usage, How to Avoid Memory Leaks, Android Profiling Tools [ https://medium.com/@nik.arora8059/memory-management-in-android-3bdf307c8e23 ]

Android third party tools to increase the performance of your app. [ https://andrey-kazarovets.com/android-third-party-tools-for-performance/ ]

Your Android Application Silently Skips Frames [ https://www.techyourchance.com/android-application-skips-frames/ ]

The battle for jank*-less UI on Android [ https://medium.com/swlh/the-battle-for-junk-less-ui-713d7680aebc ]

Virtual Machine in Android: Everything you need to know [ https://android.jlelse.eu/virtual-machine-in-android-everything-you-need-to-know-9ec695f7313b ]

Инструменты для запуска и разработки Java приложений, компиляция, выполнение на JVM [ https://habr.com/ru/post/471772/ ]

A tool used to obfuscate aab resources [ https://github.com/bytedance/AabResGuard ]

Is Your Kotlin Code Really Obfuscated?
[https://proandroiddev.com/is-your-kotlin-code-really-obfuscated-a36abf033dde]

Как Java 8 поддерживается в Android [ https://habr.com/ru/company/tinkoff/blog/478692/ ] [ https://jakewharton.com/androids-java-8-support/ ]


Facebook proguard r8 [ https://github.com/facebookarchive/proguard/tree/master/examples/dictionaries ]

D8 Library Desugaring [ https://jakewharton.com/d8-library-desugaring/ ]

Shrinking Kotlin Libraries and Applications using Kotlin Reflection with R8
15.07.2020 [https://medium.com/androiddevelopers/shrinking-kotlin-libraries-and-applications-using-kotlin-reflection-with-r8-6fe0a0e2d115]


Измерение производительности андроид приложений [https://android-tools.ru/coding/izmerenie-proizvoditelnosti-raboty-prilozheniya/]
Performance Improvements for Search on The Yelp Android App https://engineeringblog.yelp.com/2018/05/android-search-perf-improvements-part-1.html

Instagram: Improving performance with background data prefetching https://instagram-engineering.com/improving-performance-with-background-data-prefetching-b191acb39898

Kotlin performance on Android [https://habr.com/company/oleg-bunin/blog/420143/]

Android performance by Google [https://www.udacity.com/course/android-performance–ud825]

Зачем инженерам тратить время на перформанс
15.07.2020 [https://habr.com/ru/company/avito/blog/509392/]

Android Internals for Rendering a View [https://medium.com/better-programming/android-internals-for-rendering-a-view-430cd394e225]



Developer Options in Android [ https://medium.com/mindorks/developer-options-in-android-dfa94fe6c501 ]

System App In Android [ https://android.jlelse.eu/system-app-in-android-f003d418b4cc ]

Как перестать бояться Proguard и начать жить [ https://habr.com/ru/post/415499/ ]

Debugging Proguard configuration issues
18.01.2021 [https://krossovochkin.com/posts/2021_01_18_debugging_proguard_configuration_issues/]

ADB-The Most useful tool in Android [ https://medium.com/mindorks/the-most-useful-tool-in-android-b281c8e5746a ]

Diving deep into Android Dex bytecode R8 [ https://proandroiddev.com/diving-deep-into-android-dex-bytecode-48db82b170c8 ]

How to make Android Studio Lightning Fast? [ https://medium.com/@ankushkapoor2015/how-to-speed-up-android-studio-43aed38d248f ]

Smaller APKs with resource optimization
by Jake Wharton [https://jakewharton.com/smaller-apks-with-resource-optimization/]
android.enableResourceOptimizations=true

Android Vitals – What time is it?
[https://dev.to/pyricau/android-vitals-what-time-is-it-2oih]

Android Vitals – Rising to the first drawn surface
[https://dev.to/pyricau/android-vitals-rising-to-the-first-drawn-surface-1j9e]

Android Vitals – Diving into cold start waters
[https://dev.to/pyricau/android-vitals-diving-into-cold-start-waters-5hi6]

Collecting the Garbage: A brief history of GC over Android versions
[https://proandroiddev.com/collecting-the-garbage-a-brief-history-of-gc-over-android-versions-f7f5583e433c]

Reverse engineering an Android Application
[https://epic.blog/reverse-engineering/2020/07/27/reverse-engineering-android-app.html]

Энергопотребление Android-приложений
[https://habr.com/ru/company/citymobil/blog/512668/]

Maximizing OkHttp connection reuse
[https://medium.com/booking-com-development/maximizing-okhttp-connection-reuse-b1f0ad6ec66c]

Practical Guide To Solve OutOfMemoryError in Android Application
[https://medium.com/mindorks/practical-guide-to-solve-outofmemoryerror-in-android-application-8cccfdc5c60c]

Android Battery Testing at Microsoft YourPhone
[https://medium.com/android-microsoft/android-battery-testing-at-microsoft-yourphone-a1d6068bf09e]

App size reduction at Microsoft SwiftKey
[https://medium.com/android-microsoft/app-size-reduction-at-microsoft-swiftkey-f77d7d5916b]

Analyze and improve Android app performance with System Tracing
[https://proandroiddev.com/analyze-and-improve-android-app-performance-with-system-tracing-badb278f995a]

High refresh rate rendering on Android
[https://android-developers.googleblog.com/2020/04/high-refresh-rate-rendering-on-android.html]

R8 changes “protected” methods of abstract class to “public” without -allowaccessmodification flag
[https://stackoverflow.com/questions/59681793/r8-changes-protected-methods-of-abstract-class-to-public-without-allowacces]

R8 does not resolve dependencies from maven. You need to add to gradle.
[https://github.com/gradle/gradle/issues/11321]

 metadataSources {    mavenPom()    artifact() } 


VSyncs or Vertical Sync — Never heard of it or did you?
[https://medium.com/@kiitvishal89/vsyncs-or-vertical-sync-never-heard-of-it-or-did-you-edc055a0decd]


R8, AGP
how to force update R8

buildscript {
  repositories {
    maven {url 'http://storage.googleapis.com/r8-releases/raw'}
  }
  dependencies {
    classpath 'com.android.tools:r8:2.1.52'
    classpath 'com.android.tools.build:gradle:4.0.1'
  }
}


Java
Android’s Java 9, 10, 11, and 12 Support
[https://jakewharton.com/androids-java-9-10-11-and-12-support/]

Возможности языка Java 8
[https://developer.android.com/guide/platform/j8-jack?hl=ru]

Use Java 8 language features and APIs
[https://developer.android.com/studio/write/java8-support]

Как работает программа «Hello World!»?
[https://nuancesprog.ru/p/8609/]

Как работает виртуальная машина Java — взгляд изнутри
[https://tproger.ru/blogs/jvm-insides/]

Фреймворк Executor в Java
[https://nuancesprog.ru/p/9627/]


Оптимизируем скорость сборки приложения

Сборка приложения — это извечная тема для споров, докладов и постоянных улучшений. И, как бы смешно это ни было, от неё зависит то, какое количество фич мы можем сделать в определённый отрезок времени.
Некоторые полагаются на стандратные настройки проекта и начинают добавлять улучшения только тогда, когда сборка становится до невозможности долгой.

Но есть советы, которые можно попробовать применить сразу после старта проекта.
Для начала выполните следуюущую команду, чтобы понять текущую скорость сборки:
./gradlew –profile –offline –rerun-tasks assembleDebug

Начнём улучшать:
🔹применим org.gradle.configureondemand=true — флаг включает конфигурацию проектов по запросу, что позволяет собирать только то, что участвует в сборке.

🔹увеличим Java heap при помощи org.gradle.jvmargs=-Xmx1536m, если позволяет ваша оперативная память.

🔹задействуем kapt.use.worker.api=true. Флаг задействует worker API для стадии annotation processing в kapt, а также перемещает выполнение этой стадии отдельно от Kotlin Compile Daemon.

🔹включим параллельную сборку мультимодульных проектов при помощи org.gradle.parallel=true.

🔹если в проекте есть room, то добавим room.incremental = true. Начиная с версии 2.3.0, флаг включен по умолчанию.

🔹добавим org.gradle.unsafe.watch-fs=true. Работает флаг так: чтобы gradle мог определить, надо выполнять задачу или нет, ему необходимо проверить, был ли изменён файл с момента последней сборки. Daemon хранит эту информацию в памяти, если задействован данный флаг. Иначе — он собирает её для каждой сборки. Больше деталей можно узнать тут (https://blog.gradle.org/introducing-file-system-watching).

🔹можно включить конфигурационный кэш при помощи org.gradle.unsafe.configuration-cache=true.

🔹если у вас есть png в проекте, то можно выключить автоматическое сжатие png-файлов для сборок, отличных от debug, где оно автоматически выключено при помощи crunchPngs false.

🔹посмотрите, чтобы у вас везде в проекте были указаны точные названия версий, избегайте названий в виде 1.+.

Конечно, это далеко не полный список возможных улучшений, но даже эти флаги ускорят сборку вашего проекта. Чуть больше информации о них можно почитать в статье (https://www.crazylegend.dev/2020/07/optimize-build-speeds-for-your-android.html).

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.