Взгляните на следующие два изображения из Анализ APK в Android Studio.
minifyEnabled = false
, иminifyEnabled = true
(конечно, после декодирования с помощью mapp.txt)minifyEnabled = false
. BuildConfig
есть.
minifyEnabled = true
(расшифровано с помощью mapping.txt). BuildConfig
нет.
Я могу найти BuildConfig
в classes.dex
до минимизации, но не после минимизации. Я не могу найти никаких документов/обсуждений по этому поводу, но есть ли какое-то правило, чтобы отделить BuildConfig
от classes.dex
после минификации с помощью Прогард? В таком случае означает ли это, что размещать конфиденциальную информацию в BuildConfig
относительно безопасно? Или, возможно, он просто спрятан в каком-то другом месте?
Моя версия ProGuard — 4.7, если это имеет значение.
Если вы используете какие-то переменные в BuildConfig, proguard не удалит их. согласно их руководство:
The shrinking step detects and removes unused classes, fields, methods, and attributes. The optimization step analyzes and optimizes the bytecode of the methods. The obfuscation step renames the remaining classes, fields, and methods using short meaningless names.
Кроме того, я использовал эти параметры и никогда не сталкивался с тем, что proguard удаляет мою информацию о BuildConfig
.
shrinkResources true
minifyEnabled true
Я отвечаю на ваш вопрос, относительно безопасно ли размещать конфиденциальную информацию в BuildConfig
. Но из того, что говорит proguard, он переименовывает поля и методы классов, используя короткие бессмысленные имена, наверное также был переименован BuildConfig
и его переменные. Я также не могу найти свой BuildConfig
в своей сборке proguarded на class.dex.
Прохладный! По крайней мере, я рад, что я не сумасшедший :) Подожду день и отмечу ваш ответ как лучший, если не найду лучшего.
«Я предполагаю, что BuildConfig также был переименован и его переменные». Однако для этой части загрузка mapping.txt должна вернуть осмысленные имена, верно? По крайней мере, для других моих классов.
Теперь мне тоже любопытно, ха-ха. Что я нашел в моем map.txt, так это то, что даже моих собственных объявленных статических переменных там нет. Хотя я нашел одну переменную, которая имеет отображение из BuildConfig
, переменной boolean DEBUG
.
Привет @TentenPonce и @barley: (1) что, если наш BuildConfig переименован, но все еще содержит конфиденциальные данные. (2) Из приведенного выше обсуждения я не смог определить окончательный вердикт. Безопасно ли хранить конфиденциальную информацию, такую как учетные данные для подключения к сети, в файле build.gradle
, а затем использовать их в нашем приложении production
. Просьба подтвердить.
согласно первому комментарию @barley: «Я не говорю, что теряю доступ к BuildConfig в своей сборке. Моя сборка прекрасно использует информацию, которая хранится в BuildConfig». Несмотря на то, что он отсутствовал после включения minifyEnabled
, информация все еще существует. Принятый ответ также объяснил, почему отсутствует BuildConfig.
Дополнительной функцией этапа минимизации является встраивание констант. Это объясняет, почему BuildConfig исчезает, а значения по-прежнему существуют там, где это необходимо. Как только значения будут встроены, ссылок на класс BuildConfig больше не будет, и минификатор может полностью удалить его.
Привет, @David Liu. Значит ли это, что мы можем помещать конфиденциальные данные, такие как учетные данные сетевого подключения, в build.graldle
. Будет ли он на 100% защищен от реверс-инжиниринга. Не могли бы вы уточнить ответ выше.
@SVK Нет. Конфиденциальные данные все еще будут там, просто встроены непосредственно в код, а не ссылаются на BuildConfig. Эти конфиденциальные данные все еще можно увидеть, просто просканировав приложение на наличие строк.
Спасибо за ответ. Это имеет большой смысл. И я не говорю, что теряю
BuildConfig
доступ к своей сборке. Моя сборка прекрасно использует информацию, хранящуюся вBuildConfig
. Я просто не могу найтиBuildConfig
в анализаторе APK, где я могу найти его с настройкамиminifyEnabled false
. Вы хотите сказать, что тоже не сталкивались с такой ситуацией? (Возможно, вы уже это говорите, но просто перепроверьте)