Я пытаюсь выяснить, что значит "компилировать ресурсы".
Что я сделал, чтобы понять эту проблему:
Я прочитал много статей на эту тему, но не нашел простого ответа. Лучшее, что я прочитал, было: Как работает сопоставление ресурсов Android и идентификатора ресурсов? ,
Как я это понимаю
Насколько я понимаю, когда мы компилируем наш проект с помощью ANT (Eclipse) или Gradle (AS). Мы используем инструмент под названием aapt - Android Asset Packaging Tool, который: используется для генерации уникальных идентификаторов для каждого из наших ресурсов, таких как макеты, стили и т.д., И для сохранения их в справочной таблице. Затем он сохраняет эту таблицу поиска, генерируя два файла:
- Он генерирует файл R.java с этими уникальными идентификаторами, чтобы мы могли использовать наши ресурсы из нашего кода Java во время компиляции.
- Он генерирует файл resources.arsc, который можно найти в файле resources *.ap_. Этот файл resources.arsc будет позже упакован с помощью apktool в apk.
Этот формат файла arsc - это формат, который будет легко отображаться и анализироваться устройством во время выполнения.
Пример:
Итак, чтобы сделать это просто: допустим, у меня есть это в моем activity_main.xml:
<TextView android:id="@+id/my_textView"
android:text="@string/hello_world"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
И я звоню из моего onCreate, используя:
findViewById(R.id.my_textView)
В моем файле R.java я увижу:
public static final int my_textView=0x7f08003f;
Использование: aapt dump ресурсов на сгенерированном apk. Я вижу, что он содержит две строки с my_textView: ec resource 0x7f08003f com.example.lizi.liortest2: id/my_textView: flags = 0x00000000 resource 0x7f08003f com.example.lizi.liortest2: id/my_textView: t = 0x12 d = 0x00000000 (s = 0x0008 r = 0x00)
Что я не понимаю
Я бы подумал, что этот файл resources.arsc будет содержать не только идентификатор ресурса, но и все свойства, которые я определил для представления, например, android: layout_width = "wrap_content".
Так что теперь во время выполнения, когда виртуальная машина пытается запустить findViewById(R.id.my_textView)
Как он узнает, какое представление получить/свои свойства создать?
Я просто не могу понять, как это работает... Разве эта таблица поиска не должна содержать также данные свойств? И что это за номер 0x7f08003f? (Должно ли оно представлять значение, которое впоследствии будет сопоставлено с физической памятью, в которой будет храниться объект?)