Защищенные идентификаторы Android в R.java

Для тех, кто провел какое-то время в исходном коде Android, не новость, что идентификаторы, сгенерированные в классе android.R, не отражают 1:1 фактические ресурсы, найденные в каталогах res/ предоставленного JAR. Многие из рисунков/стилей/макетов не являются «общедоступными» и доступны для приложений по ссылке android.R.xxx.

Мой вопрос: кто-нибудь знает механизм, с помощью которого Android может генерировать класс R.java, который отличается от фактического графа ресурсов? Во-вторых, это механизм (с использованием правил сборки и т. д.), который мы, как разработчики, могли бы использовать для частичной защиты идентификаторов, которые становятся общедоступными в приложениях, используемых в качестве библиотек?

Заранее спасибо!


person devunwired    schedule 15.02.2012    source источник


Ответы (1)


Android упаковывает ресурсы с помощью aapt и создает файл R с помощью этого инструмента в процессе сборки. На этом этапе файлы XML компилируются в двоичные файлы, а другие ресурсы просто упаковываются как есть. Вы можете открыть файл .apk в виде zip-архива и получить доступ ко всем файлам ресурсов как есть. Проекты библиотеки просто содержат исходные файлы и ресурсы, которые добавляются в проект во время компиляции, поэтому они каким-то образом существуют в файле .apk. Вероятно, макеты не 1:1, потому что XML уже скомпилирован для проекта библиотеки. Вероятно, вы могли бы использовать aapt для удаления файлов из проекта библиотеки из включения во время сборки, но тогда они не будут доступны в вашем проекте. Также может быть способ запутать имена ваших ресурсов во время компиляции с помощью aapt и ant, но тогда это не мешает им получить к ним доступ.

Я не уверен, почему вы хотите, чтобы класс R.java отличался от фактического графа ресурсов. Либо не включайте эти ресурсы во время сборки, либо они будут в apk. Ваши макеты сжаты в виде двоичных файлов на выходе, поэтому я не уверен, насколько легко их декомпилировать или повторно использовать в другом проекте.

Какой тут эндшпиль? Если это для защиты ваших ресурсов, это будет сложно. Android крайне небезопасен, если у кого-то есть возможность рутировать свой телефон. Если вы хотите защитить свою интеллектуальную собственность, что, как я предполагаю, является конечным результатом, я бы попытался скомпилировать свой проект в apk и посмотреть, смогу ли я декомпилировать или извлечь критические ресурсы из apk. Может быть, попробовать запутать, но опять же, я недостаточно знаю о скомпилированных XML-файлах, чтобы знать, достаточно ли они запутаны, чтобы их было сложно декомпилировать.

Кто-то может поправить меня, если я ошибаюсь, но это всего лишь мои 2 цента.

person onit    schedule 15.02.2012
comment
Основная цель вопроса - просто узнать, как сборка R.java для Android ROM может исключать ресурсы. У вас есть интересный момент о том, что макеты могут быть скомпилированы в два этапа, хотя эта логика не будет работать для исключенных рисунков, поэтому должен быть другой метод. Что касается второго вопроса, то проблема не столько в безопасности, сколько в очистке итогового файла R.java с библиотечными проектами, поскольку все идентификаторы в конечном итоге объединяются в единую ссылку на класс R в основном пакете, часто приводящие к перекрытиям. - person devunwired; 16.02.2012
comment
@Devunwired Вы используете proguard или инструмент запутывания? Когда я просматриваю свои файлы apk, все мои рисунки (например, изображения .png) просто находятся в папке res в соответствующем месте. Опять же, как я уже сказал, файл R.java создается на этапе aapt фазы компиляции, поэтому, если что-то похожее на то, что вы хотите, возможно, это будет до или во время этого шага. - person onit; 16.02.2012
comment
Это именно то, что я хочу сказать, но сделайте это упражнение с android.jar вместо своего собственного приложения. Вы заметите, что в каталоге res/ гораздо больше рисунков, чем вы сможете сослаться, вызвав android.R.drawable.xxx в своем коде. - person devunwired; 16.02.2012
comment
@Devunwired Хорошо, я не знал об этом факте. Тем не менее, мой последний вопрос к вам: почему вы хотите иметь файлы в папках res, но не иметь доступа к ним из кода? Я столкнулся с проблемой наличия нежелательных ресурсов в моих папках res между разными сборками, но в итоге я создал простой скрипт, который управляет этим, просто удаляя нежелательные ресурсы перед сборкой, а затем добавляя их обратно после. - person onit; 16.02.2012
comment
Ну, часто ресурсы в библиотечном проекте важны только для библиотеки, а не для приложения, которое ее использует. Было бы неплохо, если бы эти идентификаторы ресурсов не загромождали проект с использованием приложений. - person devunwired; 16.02.2012