Какой файл содержит генерируемые константы приложения
Android -приложения могут быть простыми и сложными, но строение приложений всегда будет одинаковым. Есть обязательные элементы приложений, а есть опциональные, которые используются по мере необходимости. Android - приложение состоит из нескольких основных компонентов: манифест приложения, набор различных ресурсов и исходный код программы .
Следующая таблица демонстрирует обязательные и возможные составляющие структуры Android -приложения:
1.5.1. Файл манифеста AndroidManifest.xml
Файл манифеста AndroidManifest.xml предоставляет системе основную информацию о программе. Каждое приложение должно иметь свой файл AndroidManifest.xml. Редактировать файл манифеста можно вручную, изменяя XML-код или через визуальный редактор Manifest Editor, который позволяет осуществлять визуальное и текстовое редактирование файла манифеста приложения.
- описывает компоненты приложения – Activities, Services, Broadcast receivers и Content providers;
- содержит список необходимых разрешений для обращения к защищенным частям API и взаимодействия с другими приложениями;
- объявляет разрешения, которые сторонние приложения обязаны иметь для взаимодействия с компонентами данного приложения;
- объявляет минимальный уровень API Android, необходимый для работы приложения;
- перечисляет связанные библиотеки.
Корневым элементом манифеста является . Помимо данного элемента обязательными элементами являются теги и . Элемент является основным элементом манифеста и содержит множество дочерних элементов, определяющих структуру и работу приложения. Порядок расположения элементов, находящихся на одном уровне, произвольный. Все значения устанавливаются через атрибуты элементов. Кроме обязательных элементов, упомянутых выше, в манифесте по мере необходимости используются другие элементы. Перечислим некоторые из них:
По умолчанию Eclipse создает элемент с четырьмя атрибутами:
xmlns:android определяет пространство имен Android.
package определяет уникальное имя пакета приложения.
android:versionCode указывает на внутренний номер версии.
android:versionName указывает номер пользовательской версии.
Наиболее распространненные разрешения:
INTERNET – доступ к интернету
READ_CONTACTS – чтение (но не запись) данных из адресной книги пользователя
WRITE_CONTACTS – запись (но не чтение) данных в адресную книгу пользователя
RECEIVE_SMS – обработка входящих SMS
ACCESS_FINE_LOCATION – точное определение местонахождения при помощи GPS
android:minSdkVersion определяет минимальный уровень API, требуемый для работы приложения. Система Android будет препятствовать тому, чтобы пользователь установил приложение, если уровень API системы будет ниже, чем значение, определенное в этом атрибуте.
android:maxSDKVersion позволяет определить самую позднюю версию, которую готова поддерживать программа.
targetSDKVersion позволяет указать платформу, для которой разрабатывалось и тестировалось приложение.
android.hardware.camera – требуется аппаратная камера.
android.hardware.camera.autofocus – требуется камера с автоматической фокусировкой.
1.5.2. Ресурсы
В Android принято хранить такие объекты, как изображения, строковые константы, цвета, анимацию, стили и тому подобное, за пределами исходного кода. Система поддерживает хранение ресурсов во внешних файлах. Внешние ресурсы легче поддерживать, обновлять и редактировать.
В основном, ресурсы хранятся в виде XML-файлов в каталоге res с подкаталогами values, drawable-ldpi, drawable-mdpi, drawable-hdpi, layout. Но также бывают еще два типа ресурсов: raw и assets.
Для удобства система создает идентификаторы ресурсов и использует их в файле R.java (класс R, который содержит ссылки на все ресурсы проекта), что позволяет ссылаться на ресурсы внутри кода программы. Статический класс R генерируется на основе заданных ресурсов и создается во время компиляции проекта. Так как файл R генерируется автоматически, то нет смысла его редактировать вручную, потому что все изменения будут утеряны при повторной генерации.
В общем виде ресурсы представляют собой файл (например, изображение) или значение (например, заголовок программы), связанные с создаваемым приложением. Удобство использования ресурсов заключается в том, что их можно изменять без повторной компиляции или новой разработки приложения.
Самыми распространенными ресурсами являются, пожалуй, строки (string), цвета (color) и графические рисунки (bitmap).
В следующей таблице перечислены основные ресурсы Android-приложения:
Помимо изображений в каталоге res/drawable могут храниться ресурсы простых геометрических фигур. Вот лишь некоторые из возможных атрибутов:
- android:shape задает тип фигуры: rectangle (прямоугольник), oval (овал), line (линия), ring (окружность);
- создает закругленные углы для прямоугольника;
- задает градиентную заливку для фигуры; в Android можно создавать три типа градиентов: Linear (линейный), Radial (радиальный) и Sweep (разверточный);
- задает размеры фигуры;
- задает сплошной цвет для фигуры.
Анимация в Android бывает двух видов:
- Frame Animation – кадровая анимация, традиционная анимация при помощи быстрой смены последовательных изображений, как на кинопленке.
- Tween Animation – анимация преобразований может выполняться в виде ряда простых преобразований: изменение позиции (класс TranslateAnimation), размера (ScaleAnimation), угла вращения (RotateAnimation) и уровня прозрачности (AlphaAnimation). Команды анимации определяют преобразования, которые необходимо произвести над объектом. Преобразования могут быть последовательными или одновременными. Последовательность команд анимации определяется в XML-файле (предпочтительно) или в программном коде.
В Android имеется еще один каталог, в котором моrут храниться файлы, предназначенные для включения в пакет – /assets . Это не ресурсы, а просто необработанные файлы. Этот каталог находится на том же уровне, что и /res. Для файлов, располагающихся в /assets, в R.java не генерируются идентификаторы ресурсов. Для их считывания необходимо указать путь к файлу. Путь к файлу является относительным и начинается с /assets. Этот каталог, в отличие от подкаталога res/, позволяет задавать произвольную глубину подкаталогов и произвольные имена файлов.
1.5.3. Разметка
В Android-приложениях, пользовательский интерфейс построен на View и ViewGroup объектах. Класс ViewGroup является основой для подкласса Layout (разметка).
Разметка (также используются термины компоновка или макет) хранится в виде XML-файла в папке /res/layout . Это сделано для того, чтобы отделить код от дизайна, как это принято во многих технологиях (HTML и CSS, Visual Studio и Expression Blend). Кроме основной компоновки для всего экрана, существуют дочерние компоновки для группы элементов. По сути, компоновка – это некий визуальный шаблон для пользовательского интерфейса приложения, который позволяет управлять элементами, их свойствами и расположением. В своей практике вам придется познакомиться со всеми способами размещения.
Android-плагин для Eclipse включает в себя специальный редактор для создания разметки двумя способами. Редактор имеет две вкладки: одна позволяет увидеть, как будут отображаться элементы управления, а вторая – создавать XML-разметку вручную.
Создавая пользовательский интерфейс в XML-файле, можно отделить дизайн приложения от программного кода. Можно изменять пользовательский интерфейс в файле разметки без необходимости изменения программного кода. Например, можно создавать XML-разметки для различных ориентаций экрана мобильного устройства (portrait, landscape), размеров экрана и языков интерфейса. Впрочем, элементы интерфейса можно создавать и программно, когда это необходимо.
Каждый файл разметки должен содержать только один корневой элемент компоновки, который должен быть объектом View или ViewGroup. Внутри корневого элемента можно добавлять дополнительные объекты разметки или дочерние элементы интерфейса, чтобы постепенно формировать иерархию элементов, которую определяет создаваемая разметка.
Существует несколько стандартных типов разметок:
- FrameLayout является самым простым типом разметки. Обычно это пустое пространство на экране, которое можно заполнить только дочерним объектом View или ViewGroup . Все дочерние элементы FrameLayout прикрепляются к верхнему левому углу экрана. В разметке FrameLayout нельзя определить различное местоположение для дочернего объекта View. Последующие дочерние объекты View будут просто рисоваться поверх предыдущих представлений, частично или полностью затеняя их, если находящийся сверху объект непрозрачен
- LinearLayout выравнивает все дочерние объекты в одном направлении – вертикально или горизонтально. Направление задается при помощи атрибута ориентации android:orientation . Все дочерние элементы помещаются в стек один за другим, так что вертикальный список представлений будет иметь только один дочерний элемент в строке независимо от того, насколько широким он является. Горизонтальное расположение списка будет размещать элементы в одну строку с высотой, равной высоте самого высокого дочернего элемента списка.
- TableLayout позиционирует свои дочерние элементы в строки и столбцы. TableLayout не отображает линии обрамления для рядов, столбцов или ячеек. TableLayout может иметь ряды с разным количеством ячеек. При формировании разметки таблицы некоторые ячейки при необходимости можно оставлять пустыми. TableLayout удобно использовать, например, при создании логических игр типа Судоку, Крестики-Нолики и тому подобных.
- RelativeLayout позволяет дочерним элементам определять свою позицию относительно родительского представления или относительно соседних дочерних элементов.
Все описываемые разметки являются подклассами ViewGroup и наследуют свойства, определенные в классе View.
Разметки ведут себя как элементы управления, и их можно группировать. Расположение элементов управления может быть вложенным. Например, можно использовать RelativeLayout в LinearLayout и так далее. Однако, слишком большая вложенность элементов управления вызывает проблемы с производительностью.
Для более лучшего понимания Android application я рекомендую ознакомится со структурой проекта и его папками и файлами.
В прошлом уроке мы разобрались как настроить SDK Android и создать первое приложения Hello World. Сейчас я предлагаю познакомится по ближе с приложением на Android и разобрать его структуру, а начнем знакомство мы с создания проекта в Intellij IDEA 12.
И в только что созданном проекте посмотрим во вкладку “Project“:
src – cодержит исходный код приложения.
com.example.StructureProjectApp – это package, наименование которого, указывается при создании проекта.
Main.java – файл исходного кода, в котором описан класс главной Activity.
gen – содержит java файлы, создаваемые автоматически во время разработки приложения. Файлы, находящиеся в папке gen не должны изменяться в ручную!
BuildConfig.java – содержит константу DEBUG, значение константы устанавливается автоматически в зависимости от того, является ли версия текущей сборки приложения, конечной или промежуточной.
Константа позволяет запускать код только в режиме отладки. Файл BuildConfig.java был добавлен после выхода ADT revision 17.
R.java – хранит уникальные идентификаторы для всех ресурсов приложения (ID).
Имена этих ID – констант совпадают с именами файлов ресурсов. Рассмотрим содержимое XML-файла строковых ресурсов res\values\strings.xml :
main.xml – файл описывает компоновку элементов экрана.
assets – папка, позволяющая организовать совершенно произвольную структуру вложенных папок и файлов. Содержимое папки assets не считается ресурсами.
bin – каталог сборки приложения. При компиляции приложения Google Android получается сборка, размещаемая в этом каталоге.
res – содержит структуру папок ресурсов приложения. Наименование каждой папки определяет тип ресурсов, которые она должна содержать.
res/drawable-ldpi предназначается для файлов изображений, которые будут применяться на экранах низкой плотности.
res/values – для строковых ресурсов, цветов и размеров.
res/layout – для файлов компоновки экрана.
В Google Android множество видов ресурсов. Каждый из которых, я буду разбирать по мере создания нашего первого приложения.
AndroidManifest – файл, который указывает точку входа в приложение.
Служит для задания общей информации о приложении. Определения атрибутов приложения. Запроса прав доступа к определенным критическим операциям и другой информации. Данный файл принято называть файлом описания, или файлом манифеста.
protect.properties – содержит параметры проекта, например версию API. Файл создается автоматически и не может быть удален.
В этом более теоретическом, чем практическом уроке хочу открыть на некоторые возможности AndroidManifest.xml, на который мало кто обращает особое внимание.
генерировать ресурсы Android
вы можете получить к ним доступ обычным способом с @string/app_name или R.string.app_name
Структура ‘AndroidManifest.xml’
Когда вы перейдете к написанию бослее сложного проекта, то вы заметите, что вам часто прейдется обращаться к этому файлу для того чтобы сконфигурировать какой-то из необходимых вам компонентов.
Но для того, чтобы там что-то конфигурировать думаю не плохо было бы знать, что и для чего нужно, именно об этом пойдет речь ниже.
Вот все основные возможности AndroidManifest.xml они представлены в виде xml тегов.
Примерно так выглядит манифест файл, где каждый из тегов может хранить какуе-то конфигурацию.
А теперь по очереди, что и для чего.
Это самый главный тег в котором вложена вся конфигурация проекта.
По умолчанию он создается вместе с файлом AndroidManifest и изначально имеет начальный набор параметров:
Что же значат эти параметры?
xmins:android – определяет пространство имен Android;
package – определяет уникальное имя пакета приложения, которое вы задали при создании проекта.
Для чего нужно указывать package? Если вы захотите загрузить ваше приложение на Google Play, то он проверяет уникальность при приеме приложения, поэтому рекомендуется использовать свое имя для избежания конфликтов с другими разработчиками.
android:versionCode – по сути это версия вашего приложения. Выпуская новую версию вы указываете её в этом поле, оно должно быть целым числом.
Выше мы говори про уникальность пакета, так вот если вы ранее загрузили на Google Play ваше приложение, то когда вы решите загрузить обновленную версию приложения, то вам нужно придерживаться нескольких правил. Имя пакета должно совпадать с тем, что уже загружено Google Play и указать версию android:versionCode на порядок выше. Но это при условии что вы выпускаете новую версию приложения, в случае если вы хотите добавить немного исправленную версию, то это читайте ниже.
Изменив данный параметр и загрузив приложение на Google Play все пользователям вашего приложения будет предложено обновится до новой версии приложения.
android:versionName – указывает номер пользовательской версии. Если вы нашли несколько недоработок в вашем приложении и исправили их, то в этом случае можно указать для этого поля новую версию, что будет говорить Google Play, что это не новая версия приложения, а улучшенная. Для именования версии можно использовать строку или строковый ресурс.
Изменив данный параметр и загрузив приложение на Google Play все пользователям вашего приложения будет предложено обновится до модифицированной версии приложения.
Тег позволяет вам запрашивать разрешение, которые приложению должны быть предоставлены системой для его нормального функционирования.
Разрешения предоставляются во время установки приложения, а не во время его работы. имеет единственный атрибут с именем разрешения android:name.
android:name – позволяет дать разрешения на использование ресурсов системы. Например:
android:name=’android.permission.CAMERA’
или
android:name=’android.permission.READ_CONTACTS’
Наиболее распространенные разрешения
– INTERNET – доступ к интернету;
– READ_CONTACTS – чтение данных из адресной книги пользователя;
– WRITE_CONTACTS – запись данных из адресной книги пользователя;
– RECEIVE_SMS – обработка входящих SMS;
– ACCESS_COARSE_LOCATION – использование приблизительного определения местонахождения при помощи вышек сотовой связи или точек доступа Wi-Fi;
– ACCESS_FINE_LOCATION – точное определение местонахождения при помощи GPS.
– позволяет установить разрешения на использования ресурсов системы или запретить использование компонентов приложения.
android:name – название разрешения
android:label – имя разрешения, отображаемое пользователю
android:description – описание разрешения
android:icon – значок разрешения
android:permissionGroup – определяет принадлежность к группе разрешений
android:protectionLevel – уровень защиты
– объявляет базовое имя для дерева разрешений.
Этот элемент объявляет не само разрешение, а только пространство имен, в которое могут быть помещены дальнейшие разрешения.
– определяет имя для набора логически связанных разрешений.
Этот элемент не объявляет разрешение непосредственно, только категорию, в которую могут быть помещены разрешения.
Разрешение можно поместить в группу, назначив имя группы в атрибуте permissionGroup элемента .
– объявляет объект instrumentation, который дает возможность контролировать взаимодействие приложения с системой.
Обычно используется при отладке и тестировании приложения и удаляется из release-версии приложения.
– позволяет объявлять совместимость приложения с указанной версией (или более новыми версиями API) платформы Android.
Уровень API, объявленный приложением, сравнивается с уровнем API системы мобильного устройства, на который инсталлируется данное приложение.
Данный тег имеет следующие атрибуты:
android:minSdkVersion – определяет минимальный уровень API, требуемый для работы приложения.
Система Android будет препятствовать тому, чтобы пользователь установил приложение, если уровень API системы будет ниже, чем значение, определенное в этом атрибуте. Вы должны всегда объявлять этот атрибут, например:
android:minSdkVersion=”17″
android:maxSDKVersion – позволяет определить самую позднюю версию, которую готова поддерживать ваше приложение.
Ваше приложение будет невидимым в Google Play для устройств с более свежей версией.
targetSDKVersion – позволяет указать платформу, для которой вы разрабатывали и тестировали приложение.
Устанавливая значение для этого атрибута, вы сообщаете системе, что для поддержки этой конкретной версии не требуется никаких изменений.
– указывает требуемую для приложения аппаратную и программную конфигурацию мобильного устройства.
Например, приложение приложению для работы нужно наличие фронтальной камеры или USB порт. Спецификация используется, чтобы избежать установки приложения на устройствах, которые не поддерживают требуемую конфигурацию.
Если приложение может работать с различными конфигурациями устройства, необходимо включить в манифест отдельные элементы для каждой конфигурации. Вы можете задать любую комбинацию, содержащие следующие устройства
– reqHardKeyboard – используйте значение true, если приложению нужна аппаратная клавиатура;
– reqKeyboardType – позволяет задать тип клавиатуры: nokeys, qwerty, twelvekey, undefined;
– reqNavigation – укажите одно из значений: nonav, dpad, trackball, wheel или undefined, если требуется устройство для навигации;
Приложение не будет устанавливаться на устройстве, которое не соответствует заданной вами конфигурации.
В идеале, вы должны разработать такое приложение, которое будет работать с любым сочетанием устройств ввода. В этом случае не нужен.
объявляет определенную функциональность, требующуюся для работы приложения.
Таким образом, приложение не будет установлено на устройствах, которые не имеют требуемую функциональность. Например, приложение могло бы определить, что оно требует фронтальную камеру с автофокусом. Если устройство не имеет встроенную фронтальную камеру с автофокусом, приложения не будет инсталлировано.
android.hardware.camera.front – требуется аппаратная камера
android.hardware.camera.autofocus – требуется камера с автоматической фокусировкой
В офф. документации Android можно посмотреть все параметры, вот ссылка.
Можно переопределить требование по умолчанию, добавив атрибут required со значением false.
Например, если вашей программе не нужно, чтобы камера поддерживала автофокус:
– определяет разрешение экрана, требуемое для функционирования устройства.
Данный тег позволяет указать размеры экран, для которого было создано приложение. Система будет масштабировать ваше приложение на основе ваших макетов на тех устройствах, которые поддерживают указанные вами разрешения экран.
Для других случаев система будет растягивать макет по мере возможности.
smallScreen – QVGA экраны
normalScreen – стандартные экраны HVGA и WQVGA
largeScreen – большие экраны
xlargeScreen – очень большие экраны, которые превосходят размеры планшетов
anyDensity – установите значение true, если ваше приложение способно масштабироваться для отображения на экране с любым разрешением.
По умолчанию, для каждого атрибута установлено значение true. Вы можете указать, какие размеры экранов ваше приложение не поддерживает.
Начиная с API 13 – Android 3, у тега появились новые атрибуты:
requiresSmallestWidthDp – указываем минимальную поддерживаемую ширину экрана в аппаратно-независимых пикселях. С его помощью можно отфильтровать устройства при размещении приложения в Google Play
compatibleWidthLimitDp – задаёт верхнюю границу масштабирования для вашего приложения. Если экран устройства выходит за указанную границу, система включит режим совместимости.
largestWidthLimitDp – задаёт абсолютную верхнюю границу, за пределами которой ваше приложение точно не может быть смаштабировано. В этом случае приложение запускается в режиме совместимости, которую нельзя отключить.
Следует избегать подобных ситуаций и разрабатывать макеты для любых экранов.
– указывает для каждого экрана конфигурацию, с которой оно совместимо. Только один экземпляр элемента допускается в манифесте, но он может содержать несколько элементов .
Каждый элемент указывает конкретный размер экрана с которой приложение совместимо.
Этот элемент является информационным и может быть использован внешние услуги (например, Google Play), чтобы лучше понять совместимость приложения с конкретными конфигурациями экрана и включить фильтрацию для пользователей.
можно ли объявить переменную в Gradle, используемую в Java ? В основном я хотел бы объявить некоторые vars в сборке.gradle, а затем получить его (очевидно) во время сборки. Так же, как макросы предварительного процессора в C/C++.
примером объявления было бы что-то вроде этого . :
есть ли способ сделать что-то подобное ?
Генерировать Константы Java
вы можете получить к ним доступ с BuildConfig.FOO
Предназначения
В AndroidManifest.xml можно настроить следующие возможности:
1. Указать имя Java-пакета приложения, который служит уникальным идентификатором;
2. Описать компоненты приложения, службы;
3. Указать список необходимых разрешений для обращения к защищенным частям API и взаимодействия с другими приложениями;
4. Разрешить доступ к ресурсам, которые сторонние приложения обязаны иметь для взаимодействия с компонентами данного приложения;
5. Указать минимальный и максимальный уровень API Android, необходимый для работы приложения;
Содержимое
AndroidManifest.xml – предоставляет подробную информацию о приложении. В каждом Android приложении вы должны в увидите этот файл, так как он является обязательным для создания приложения на ОС Android.
Содержимое
AndroidManifest.xml – предоставляет подробную информацию о приложении. В каждом Android приложении вы должны в увидите этот файл, так как он является обязательным для создания приложения на ОС Android.
пример использования ключа приложения Api в приложении Android (Java и XML)
использование в коде java
использование в xml-коде
пример использования системных свойств, установленных в build.gradle, прочитайте из приложения Java (следуя из вопроса в комментариях):
в основном, с помощью test задачи build.gradle , С методом тестового задания systemProperty установка системного свойства, переданного во время выполнения:
и вот остальная часть примера кода (который вы, вероятно, могли бы вывести, но включен здесь в любом случае): он получает системное свойство MY-VAR1 , ожидается, что во время выполнения будет установлено значение VALUE-TEST :
Run (Примечание: тест проходит):
я обнаружил, что сложная часть на самом деле получает результат от gradle. Таким образом, ведение журнала настроено здесь (slf4j+logback), и файл журнала показывает результаты (альтернативно, run gradle --info cleanTest test ; есть также свойства, которые получают stdout на консоль, но, вы знаете, почему):
если вы прокомментируете из " systemProperty. " (который, кстати, работает только в test задач), затем:
для полноты, вот конфигурация logback ( src/test/resources/logback-test.xml ):
- build.gradle
- src/main/java/example/HelloWorld.java
- src/test/java/example/HelloWorldTest.java
- src/test/resources/logback-test.xml
вы можете создать поле конфигурации сборки, переопределяемое через системные переменные среды во время сборки:
резерв используется при разработке, но вы можете переопределить переменную при запуске сборки на Jenkins или другом инструменте.
в приложении построить.Gradle в:
переменная будет доступна как BuildConfig.SERVER_URL .
ответ rciovati полностью правильный я просто хотел добавить еще один лакомый кусочек, который вы также можете создавать переменные для каждого типа сборки в части конфигурации по умолчанию вашей сборки.градля. Это будет выглядеть так:
Это позволит вам иметь доступ к through
просто хотел отметить этот сценарий, а если вы хотите общую конфигурацию.
Информационная часть содержит статические и динамические элементы страницы и реализуется в виде Web-форм. Статические элементы представляют собой типичные элементы языка HTML, динамические же компонуются программным кодом приложения во время его выполнения (например, запросы к базе данных).
Программный код реализует логику, определенную в процедурах обработки данных, которые определяют реакцию приложения на запросы пользователя. Программный код исполняется сервером и взаимодействует с динамическими элементами информационной части для формирования отклика приложения.
Сведения о конфигурации представляют собой файлы, содержащие параметры, определяющие способ исполнения приложения на сервере, параметры безопасности, реакцию приложения на возникающие ошибки и т. д.
Основным элементом Web-приложения является Web-форма (или Web-страница), которая, с одной стороны, похожа на Windows-форму, т. к. позволяет размещать внутри себя различные элементы управления, способные отображать данные и реагировать на действия пользователя, а с другой — представляет собой HTML-страницу, т. к. содержит все ее атрибуты. Описания элементов управления, упомянутых ранее, представляются в коде HTML-страницы в виде специальных тегов.
На рис. 1.4 представлен пример простейшей страницы Web-приложения, содержащего всего лишь один элемент — кнопку. Как видно из рисунка, основой страницы является тело стандартного HTML-документа, внутри которого находится элемент form, а также кнопка button. Кроме того, в начале документа здесь присутствуют некоторые дополнительные элементы, которые будут рассмотрены позднее.
При запуске приложения данная страница отображается в окне браузера и выглядит следующим образом ( рис. 1.5).
В свою очередь, с кнопкой связан программный код, который выполняется при нажатии на нее. Этот код располагается в отдельном файле, окно которого в момент разработки выглядит как на рис. 1.6.
Читайте также: