Save 37% off PRO during our Black Friday Sale! »

«Сборка Android-приложения. Задачка со звёздочкой», Антон Потапов, FunCorp

5d08ba0cd07942f2ddbf82e5b21ba5e7?s=47 FunCorp
August 03, 2019

«Сборка Android-приложения. Задачка со звёздочкой», Антон Потапов, FunCorp

5d08ba0cd07942f2ddbf82e5b21ba5e7?s=128

FunCorp

August 03, 2019
Tweet

Transcript

  1. Сборка Android-приложения. Задачка со звездочкой Антон Потапов, FunCorp

  2. FunCorp 2 • iFunny (from 2011) • АйДаПрикол (from 2011)

    • FunCubator (2017) • FunCorp Production (2019)
  3. Чем плох Gradle? • Наблюдаются некоторые проблемы с инкрементальной сборкой

    • Слабоват на монолитных проектах • Достаточно долго прогревается • Потребляет много ресурсов 3
  4. О чем поговорим? • Структура APK • Сборка из консоли

    • Maven • Bazel • Buck • Сравнительный анализ 4
  5. *.apk 5 res resources.arsc assets classes.dex lib aidl AndroidManifest.xml

  6. Собираем HelloWorld из консоли 6

  7. Этапы сборки • Скачивание и распаковка сторонних зависимостей • R.java

    • Kotlin • Dex • Unaligned apk • Aligned apk • Подпись 7
  8. Распаковываем сторонние .aar библиотеки 8 aars=$(ls -p $LIBS | grep

    -v /) for filename in $aars; do DESTINATION=$LIBS_OUT_DIR/${filename%.*} echo "unpacking $filename into $DESTINATION" unzip -o -q $LIBS/$filename -d $DESTINATION libs_res="$libs_res -S $DESTINATION/res" libs_classes="$libs_classes:$DESTINATION/classes.jar" done
  9. Генерируем R.java 9 $BUILD_TOOLS/aapt package -f -m \ -J $GEN_DIR

    \ -M $PROJ/AndroidManifest.xml \ -S $PROJ/res \ $libs_res \ -I $ANDROID_JAR --auto-add-overlay
  10. Компилируем Kotlin 10 compiledKotlin=$KOTLIN_OUT_DIR/compiled.jar kotlinc $PROJ/java $GEN_DIR -include-runtime \ -cp

    "$ANDROID_JAR$libs_classes"\ -d $compiledKotlin
  11. Dex 11 dex=$DEX_OUT_DIR/classes.dex $BUILD_TOOLS/dx --dex --output=$dex $compiledKotlin

  12. Запаковываем все в .apk 12 unaligned_apk=$OUT_DIR/unaligned.apk $BUILD_TOOLS/aapt package -f -m

    \ -F $unaligned_apk \ -M $PROJ/AndroidManifest.xml \ -S $PROJ/res \ $libs_res \ -I $ANDROID_JAR --auto-add-overlay
  13. Оптимизируем 13 aligned_apk=$OUT_DIR/aligned.apk $BUILD_TOOLS/zipalign -f 4 $unaligned_apk $aligned_apk

  14. Подписываем 14 $BUILD_TOOLS/apksigner sign --ks $DEBUG_KEYSTORE $aligned_apk

  15. Clean build 7s Inc build 7s Цифры 15

  16. ВСЕ 16 Кто так делает?

  17. Maven 17

  18. Факты 18 • Apache Software Foundation • XML • Ant

    -> Maven
  19. Про плюсы maven 19 • Кеширование (в том числе и

    удаленное) • Умеет разрешать зависимости • Много подробной документации • Привычный механизм
  20. Про минусы maven 20 • Зависим от версии Java •

    Android-plugin от сторонних разработчиков • Громоздкий xml • Медленнее Gradle
  21. pom.xml project 21 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0">

    <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>myapplication</artifactId> <version>1.0.0</version> <packaging>apk</packaging> <name>My Application</name> <properties> <kotlin.version>1.3.41</kotlin.version> </properties>
  22. pom.xml dependencies 22 <dependencies> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-stdlib</artifactId> <version>${kotlin.version}</version> </dependency> <dependency>

    <groupId>com.google.android</groupId> <artifactId>android</artifactId> <version>4.1.1.4</version> <scope>provided</scope> </dependency> </dependencies>
  23. pom.xml plugin 1 23 <plugin> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <version>${kotlin.version}</version> <executions> <execution>

    <id>compile</id> <phase>process-sources</phase> <goals> <goal>compile</goal> </goals> </execution> </executions> </plugin>
  24. pom.xml plugin 2 24 <plugin> <groupId>com.simpligility.maven.plugins</groupId> <artifactId>android-maven-plugin</artifactId> <extensions>true</extensions> <configuration> <sdk>

    <platform>28</platform> <buildTools>28.0.3</buildTools> </sdk> <failOnNonStandardStructure>false</failOnNonStandardStructure> </configuration> </plugin>
  25. Clean build 12.14s Inc build 10.76s Цифры 25

  26. Кто так делает? 26

  27. Bazel 27

  28. Факты 28 • Google • Skylark/Starlark • Bazel

  29. О плюсах bazel 29 • ios/android/… • Кеширование (в том

    числе и удаленное) • Умеет разрешать зависимости • Поддержка удаленных проектов • Отличная масштабируемость
  30. О минусах bazel 30 • Сложно поддерживать • Некоторые примеры

    не собираются • Скудная документация • На маленьких проекта анализ билд-конфигов занимает больше времени, чем сборка
  31. WORKSPACE android sdk 31 android_sdk_repository( name = "androidsdk", api_level =

    28, build_tools_version = "28.0.3" ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
  32. WORKSPACE kotlin 32 RULES_KOTLIN_VERSION = "990fcc53689c8b58b3229c7f628f843a60cb9f5c" http_archive( name = "io_bazel_rules_kotlin",

    url = "https://github.com/bazelbuild/rules_kotlin/archive/%s.zip" % RULES_KOTLIN_VERSION, strip_prefix = "rules_kotlin-%s" % RULES_KOTLIN_VERSION ) load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kotlin_repositories", "kt_register_toolchains") kotlin_repositories() kt_register_toolchains()
  33. BUILD binary 33 load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") android_binary( name = "app", custom_package

    = "com.example.myapplication", manifest = "src/main/AndroidManifest.xml", manifest_values = { "minSdkVersion": "15", }, deps = [ ":lib", ], )
  34. BUILD kotlin 34 kt_android_library( name = "lib", srcs = glob(["src/main/java/**/*"]),

    deps = [ ":res", ":appcompat", ], ) android_library( name = "res", resource_files = glob(["src/main/res/**/*"]), manifest = "src/main/AndroidManifest.xml", custom_package = "com.example.myapplication", )
  35. BUILD libs 35 aar_import( name = "appcompat", aar = "libs/appcompat.aar",

    deps = [ ":appcompat_core", ] ) aar_import( name = "appcompat_core", aar = "libs/core.aar", )
  36. Clean build 35.31s Inc build 3.36s Цифры 36

  37. Кто так делает? 37

  38. Buck 38

  39. Факты 39 • Facebook • Python DSL -> Skylark/Starlark •

    Ant
  40. О преимуществах buck 40 • ios/android/… • Кеширование (в том

    числе и удаленное) • Своя реализация dex • Дополнительные оптимизации процесса сборки • Есть плагин для Gradle, позволяющий использовать Buck
  41. О недостатках buck 41 • Сложно поддерживать • Не умеет

    разруливать maven зависимости
  42. Binary 42 android_binary( name = 'app', manifest = 'src/main/AndroidManifest.xml', manifest_entries

    = { 'min_sdk_version': 15, }, keystore = ':debug_keystore', deps = [ ':lib', ], )
  43. Keystore + kotlin 43 keystore( name = 'debug_keystore', store =

    'debug.keystore', properties = 'debug.keystore.properties', ) android_library( name = 'lib', srcs = glob(['src/main/java/*.kt']), deps = [ ':res', ':compat', ':compat_core', ], language = 'kotlin', )
  44. res + libs 44 android_resource( name = 'res', res =

    "src/main/res", package = 'com.example.myapplication', ) android_prebuilt_aar( name = 'compat', aar = "libs/appcompat.aar", ) android_prebuilt_aar( name = 'compat_core', aar = "libs/core.aar", )
  45. Clean build 7.5s Inc build 0.2s Цифры 45

  46. Кто так делает? 46

  47. Немного выводов и график 47

  48. Немного измерений 48 0 10 20 30 40 Terminal Gradle

    Maven Bazel Buck Clean build Incremental build
  49. 49 Gradle Buck и Bazel ПРОСТОЙ может быть супербыстрым сам

    разруливает зависимости ios + android очень много туториалов форсит многомодульность самая активная поддержка Плюсы
  50. 50 Gradle Buck и Bazel может быть медленным более сложные

    билдконфиги неэффективный меньше обучалок Минусы
  51. А как у нас? Gradle 51

  52. Clean build 2m46s Inc build 47s Непонятно, стоит ли игра

    свеч 52 1
  53. Сложнее поддерживать 2 53

  54. Дорого 3 54

  55. 55 Сборка проекта дольше 45 минут Gradle Buck/Bazel да нет

  56. https://github.com/FlashLight13/BuildSystems Sample project 56

  57. flashlight13@fun.co @flashlight13 57 flashlight13