Pull to refresh

Comments 22

Ну наконец-то! ) Спасибо, для нуба (как я в андроиде) — самое то! Надеюсь что на виме под маком сильно отличаться процесс не будет.

если кто решит повторить на маке — у меня получилась такая последовательность:

~/Library/Android/sdk/build-tools/25.0.1/aapt package -f -m -S ~/Documents/sources/android/testapp/res/ -J ./src/ -M ./AndroidManifest.xml -I ~/Library/Android/sdk/platforms/android-25/android.jar

/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/bin/java -jar ~/Library/Android/sdk/build-tools/25.0.1/jack.jar --output-dex ./bin/ -cp ~/Library/Android/sdk/platforms/android-25/android.jar -D jack.java.source.version=1.8 "./src/com/example/testapp/R.java" "./src/com/example/testapp/MainActivity.java"

~/Library/Android/sdk/build-tools/25.0.1/aapt package -f -M ./AndroidManifest.xml -S ./res/ -I ~/Library/Android/sdk/platforms/android-25/android.jar -F ./bin/AndroidTest.unsigned.apk ./bin/

подписываем

/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/bin/keytool -genkey -validity 10000 -dname «CN=AndroidDebug, O=Android, C=US» -keystore ./AndroidTest.keystore -storepass android -keypass android -alias androiddebugkey -keyalg RSA -v -keysize 2048

/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/bin/jarsigner -sigalg SHA1withRSA -digestalg SHA1 -keystore ./AndroidTest.keystore -storepass android -keypass android -signedjar ./bin/AndroidTest.signed.apk ./bin/AndroidTest.unsigned.apk androiddebugkey

~/Library/Android/sdk/platform-tools/adb install ./bin/AndroidTest.signed.apk
Если уж делаете руководство для чайников: Команда 'call' не найдена.
Дружище, все замечательно… но… где плюшки отличия от сборки через IDE? где то удобство подсветки синтаксиса? Где дебаг? Зачем?
Затем, чтобы я понимал, что именно и как именно происходит, когда я разрабатываю приложение под Андроид. IDE делает очень много, но командная строка дает понятие того, что именно делает IDE.

Т.е. на вопрос «Зачем?» следует простейший ответ — научиться.
В IDE удобно писать код, но в текущих версиях android tools сборка происходит средствами сборщика – android build tools, gradle, maven-зависимости и вот это всё. Даже Android Studio просто запускает это внутри себя. Но никто не мешает запускать сборку из консоли через готовый gradle wrapper (./gradlew), или её же, но из той же IDE как gradle task. Зачастую это даже удобнее, так как виден результат выполнения процесса, а не просто один прогресс-бар, скрывающий за собой вызовы десятков команд.
Вы точно прочитали параграф «Вступление»?
В Android Nougat появилась OpenJDK и ее классы? Что нового из core java теперь доступно на android?
«apk-файл занимает всего около 4 килобайт»
А вот это очень интересно, откуда тогда берутся целые мегабайты на «чистое» приложение без подключенных библиотек? Неужели только от стандартных ресурсов?

Ну, с мегабайтами вы погорячились, но студия создает проект сразу со стандартными иконками и подключенным саппортом. Недавно на рабочем проекте настроили proguard, и он выпилил из support-v4 12000 методов, и еще несколько тысяч из v7 (и это только код, ресурсов в саппортах тоже достаточно), что как бы намекает, откуда размер. С другой стороны, экономить полмегабайта, но писать все костыли, предусмотренные саппортами, — нет уж, увольте.

Если таргетить приложение хотя бы на 4.0 и выше, то часто support libs не нужны, если не требуются различные фишки MaterialDesign и пр. Сам стиль Material легко вешается на приложение через обычные стили (в values-v21/styles.xml), и будет работать только на соответствующей платформе. При этом без библиотек совместимости размер итогового приложения действительно не будет превышать и сотни килобайт.

Начать следует с того, что саппорты — это не только дизайн, но и 2-3 килограмма свежего мяса куча костылей, подпирающих работу каких-то новых фишек на старых версиях. Те же фрагменты — они как бы в системе и давно есть, но в саппорте вот недавно чайлд-фрагменты пофиксили, а на устройствах с 4.0 системные как работали при выходе, так и продолжат работать.


Сам стиль Material легко вешается на приложение через обычные стили (в values-v21/styles.xml), и будет работать только на соответствующей платформе.

Во-первых, стили holo и material привести к общему знаменателю довольно накладно. Во-вторых, вряд ли пользователям 4.4 сильно понравится убогий древний дизайн. В-третьих, вам никто так делать не даст :) Ни в одной компании не скажут: "На лоллипопе пусть все будет круто, а на остальных 50% как будет, так и будет". Нарисуется один общий дизайн (в стиле material, скорее всего) и скажут реализовывать. Понятно, что для поиграться в каком-то низкоуровневом pet-project-е типа SuperSU подход без саппортов может прокатить, там дизайн — не главное. Ну, либо в телеграме — у них вообще все свое. Но опять же дизайн общий на всех версиях, просто велосипеды другие.

Всё хорошо, но если есть дизайнеры, прорабатывается UI и прочее, то это уже явно не уровень HelloWorld, о котором говорится в статье. Про работу фрагментов, про единые гайдлайны, про фоллбеки для старых систем, и прочее в сапорт-либах знаю, просто если мы про HelloWorld или другое тестовое приложение «для себя», то обычно незачем увеличивать размер выходного файла на полтора мегабайта лишь ради «единого дизайна». Новички, делая HelloWorld'ы ещё могут не знать как собирается и из чего состоит приложение (иначе эта статья бы не появилась), но при этом они получают в нагрузку много либ, непонятные неймспейсы в xml, кучу файлов в ресурсах и на выходе (если заглянут в итоговую сборку apk). К тому же, из-за переопределения стилей в support-либе меняется описание тех же стилей и некоторых элементов (например, android:showAsAction vs app:showAsAction в описаниях menu), что может создавать дополнительную путаницу для начинающих.
Нет, ничего он не погорячился с мегабайтами, только неделю назад скачивал андроид студию и создавал простейшее HelloWorld приложение средствами среды с настройками по умолчанию. Готовый apk занимает 1.4 мегабайта.
Нет, ничего он не погорячился с мегабайтами

Готовый apk занимает 1.4 мегабайта

Все же математические правила мне подсказывают, что 1.4 к множественному числу не округляется. К тому же мы выяснили, что, во-первых, с самого начала некоторые библиотеки все же подключены, а вот proguard не настроен.

Мне кажется, konstantin_berkow имел в виду именно тот факт, что вообще HelloWorld занимает больше мегабайта. А так да, согласен с вами, что 1.4 ближе к одному, чем к нескольким мегабайтам.

И все же печалит, что по умолчанию подключаются толстые библиотеки, которые не всегда нужны. В большинстве небольших приложений, коих сейчас штопают пачками, без них можно вполне обойтись, а пользователь сэкономит по мегабайту с каждого такого приложения. Кто-то скажет, что сейчас-то о весе приложения уже можно и не париться. Да, возможно, если речь идет всего об одном приложении. Но если с каждого сэкономить по мегабайту, глядишь, еще одна игрушка объема Angry Birds влезет, или минута видео важного события из вашей жизни.

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

Качество включает в себя не только размер. Саппорт библиотеки содержат в себе кучу кода в стиле:


    if (Build.VERSION.SDK_INT >= 23) {
            ActivityCompatApi23.something();
        } else if (Build.VERSION.SDK_INT >= 21) {
            ActivityCompat21.something();
        } else ...

Писать все это вручную — моветон и вряд ли повысит качество.
Кстати, делал когда-то тестовое, в котором требовалось не использовать сторонние библиотеки. Так вот, саппорты использовать разрешалось. К тому же, повторюсь в N-ный раз — настройте proguard, и он на этапе сборки вырежет все неиспользуемые методы.

gradle :module_name:dependencies показывает от куда.
Например support-v7 в итоге тянет за собой по умолчанию

+--- com.android.support:appcompat-v7:23.4.0
| +--- com.android.support:animated-vector-drawable:23.4.0
| | \--- com.android.support:support-vector-drawable:23.4.0
| | \--- com.android.support:support-v4:23.4.0 (*)

Отличная статья, спасибо.

Просьба — опишите то же самое, только для Android NDK. На примере Qt/С++ =)
Я плохо знаю Android NDK, к сожалению…
«Выкладываю архив проекта...» => Not Found
Пожалуйста, выложите еще рас на рабочем ресурсе.
Sign up to leave a comment.

Articles