Коли ADT встановлює BuildConfig.DEBUG на значення false?


110

У новітній версії ADT (r17) додається створена константа, BuildConfig.DEBUGяка встановлюється відповідно до типу збірки. Проблема в тому, що вона ніколи не встановлена ​​на помилку, я очікував, що вона зміниться, виконуючи "Інструменти Android -> Експортний підписаний пакет програм", але це не для мене.

Тож як я можу змінити тип збірки?

Додана функція, яка дозволяє запускати деякий код лише в режимі налагодження. Тепер збірки генерують клас під назвою BuildConfig, що містить константу DEBUG, яка автоматично встановлюється відповідно до типу складання. Ви можете перевірити константу (BuildConfig.DEBUG) у своєму коді для запуску функцій лише для налагодження


2
BuildConfig.java генерується автоматично інструментами побудови Android та розміщується в папці gen. Підписаний APK повинен мати BuildConfig.DEBUG = false. Це не повинно бути для вас проблемою. Вам не потрібно було вручну торкатися цього файлу ...
IgorGanapolsky

1
Якщо ви використовуєте gradle для випуску цього прапора, це 100% надійність. Тож, коли ви робите ./gradlew assembleDebug його істинне, а коли збираєте, випустіть його false.
слот

Відповіді:


56

В даний час ви можете отримати правильну поведінку, відключивши функцію "Будувати автоматично", очистити проект і потім експортувати через "Інструменти Android -> Експортувати підписаний пакет програм". При запуску програма BuildConfig.DEBUGповинна бути помилковою.


зламаний теж. Це спричиняє показ усіх повідомлень Log.d, які повинні бути опущені цим прапором. пс. куди подати звіт про помилку?
tomi

моє завжди хибне, навіть при налагодженні
behelit

39

З програмою Eclipse я завжди відключаю опцію "Створювати автоматично" перед експортом програми у випуску. Потім я прибираю проект і експортую. Інакше він починає компілювати в режимі налагодження, і тоді значення BuildConfig.DEBUG може бути неправильним.

За допомогою Android Studio я просто додаю власну власну змінну у build.gradle:

buildTypes {
    debug {
        buildConfigField "Boolean", "DEBUG_MODE", "true"
    }
    release {
        buildConfigField "Boolean", "DEBUG_MODE", "false"
    }
}

Коли я будую проект, BuildConfig.java формується наступним чином:

public final class BuildConfig {
  // Fields from build type: debug
  public static final Boolean DEBUG_MODE = true;
}

Тоді у своєму коді я можу використовувати:

if (BuildConfig.DEBUG_MODE) {
    // do something
}

Рекомендую очистити після переключення збірки налагодження / випуску.


1
Це рішення найкраще, якщо ви використовуєте proguard, оскільки він буде генерувати константу з буквальним значенням, тому ваш код налагодження буде повністю видалений з двійкового у режимі випуску.
Віктор Лаерте

33

Не працює належним чином:

Випуск 27940 : BuildConfig.DEBUG "true" для експортованого пакету додатків

Розчаровує те, що вони іноді випускають функції баггі.


9
Перейдіть за посиланням на вищезазначене питання та позначте його зірочкою, якщо ви хочете це виправити.
Хлопець

11

Це працює, але зауважте, що файл коду ніколи не змінюється, навіть при експорті підписаного файлу. Експортний процес змінює значення цієї змінної в БРЕХНЯ, що може дати вам помилкове враження , що він не працює. Я перевірив це за допомогою операторів реєстрації на зразок

if (com.mypackage.BuildConfig.DEBUG)
            Log.d(TAG, location.getProvider() + " location changed");

Під час тестування мої записи журналів більше не дають результатів.


1
Що саме ти зробив?
pbhowmick

2
Я змінив екземпляри BuildConfig.DEBUG на com.mypackage.BuildConfig.DEBUG, потім повторно застосував додаток ... і він все ще повертався правдою весь час. Можливо, я неправильно зрозумів вашу пропозицію.
Кріс Рай

1
Я говорю, що код НЕ зміниться. Однак com.mypackage.BuildConfig.DEBUG буде встановлено на компіляцію помилкових публікацій. Спробуйте оператор тестового журналу, як описано вище (виберіть довільну рядок для входу в журнал), виконайте експорт та запустіть його. Подивіться, чи adb відображає оператор журналу. Я буду робити ставку на те, що adb не повідомить про це протокол реєстрації, що означає, що DEUBUG було встановлено на хибне.
pbhowmick

1
Я не впевнений, що знаю, що ви маєте на увазі під "кодом" ... однак я скажу, що чистка перед експортом APK (як це запропоновано у прийнятій відповіді) зробила BuildConfig.DEBUG і com.mypackage.BuildConfig .DEBUG повідомляє помилковий, як очікувалося.
Chris Rae

Ти маєш це. Така очікувана поведінка.
pbhowmick

10

Перевірте imports, інколи BuildConfig ненавмисно імпортується з будь-якого класу бібліотеки. Наприклад:

import io.fabric.sdk.android.BuildConfig;

У цьому випадку BuildConfig.DEBUG завжди поверне помилкове значення ;

import com.yourpackagename.BuildConfig;

У цьому випадку BuildConfig.DEBUG поверне ваш реальний варіант збірки .

ps Я просто копіюю це з моєї відповіді тут: BuildConfig.DEBUG завжди помилковий, коли створює бібліотечні проекти з gradle


1
Так, для мене це було випадково імпортовано з android.support.compat. Я думаю, це ще одна причина просто визначити своє власне поле з іншою назвою.
ареколек

5

З підготовки до випуску :

Вимкніть журнал та налагодження

Переконайтеся, що ви відключили ведення журналу та відключили параметр налагодження перед тим, як створити програму для випуску. Ви можете відключити ведення журналу, видаливши дзвінки до методів журналу у вихідних файлах. Ви можете відключити налагодження, видаливши атрибут android: debuggable з тегу у вашому файлі маніфесту, або встановивши атрибут android: debuggable на значення false у вашому файлі маніфесту. Також видаліть будь-які файли журналу або статичні тестові файли, створені у вашому проекті.

Також слід видалити всі виклики відстеження налагодження, які ви додали до свого коду, такі як виклики методу startMethodTracing () та stopMethodTracing ().

Більше інформації - за посиланням.


1
Я думав, що цей процес зараз відбувається автоматично під час збирання: developer.android.com/tools/sdk/tools-notes.html
IgorGanapolsky

Викликає помилку часу компіляції: «Уникайте жорсткого кодування режиму налагодження; вихід із нього дозволяє налагоджувати та випускати версії для автоматичного призначення одного »
Микита Босик

5

Рішення для мене:

  1. Проект -> Будувати автоматично
  2. Проект -> Очистити
  3. Проект -> Побудувати
  4. Експорт програми Android

Це робота в r20


1
Це працювало для мене саме зараз (я думаю, використовуючи останній ADT). Можливо, чистка виправила це, не впевнений.
Джонні

3

Я хотів би запропонувати просте вирішення, якщо ви використовуєте proguard під час експорту APK.

Proguard забезпечує спосіб видалення дзвінків до певних функцій у режимі випуску. Будь-які виклики для налагодження журналів можна видалити, виконавши наступне налаштування в proguard-project.txt.

# Remove debug logs
-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
}

І налаштування оптимізації в project.properties.

proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt

З цим вам не потрібно стосуватися жодних непотрібних обчислень String, що переходять до журналу налагодження, на який @Jeremyfa вказував. Обчислення просто видаляються при складанні випусків.

Таким чином, вирішення для BuildConfig.DEBUG використовує таку ж функцію proguard, як наступна.

public class DebugConfig {

    private static boolean debug = false;

    static {
        setDebug(); // This line will be removed by proguard in release.
    }

    private static void setDebug() {
        debug = true;
    }

    public static boolean isDebug() {
        return debug;
    }
}

І після налаштування в proguard-project.txt.

-assumenosideeffects class com.neofect.rapael.client.DebugConfig {
    private static *** setDebug();
}

Я вважаю за краще використовувати це для відключення цієї Build Automaticallyопції, оскільки це не залежить від індивідуального налаштування IDE розробника, але зберігається як закріплений файл, який спільним для розробників.


1

Не працює належним чином, наскільки я зрозумів ( випуск Android 22241 )

У мене виникли проблеми з проектом (робота з Eclipse), що ця константа не була встановлена ​​на істину під час експорту підписаного APK мого проекту :(

Хочеться почути, що це працює, хоча


1
Це слід було виправити в r17, його позначили як таке в трекері помилок.
smith324

1
Фактично libs не компілюються в режимі випуску в ADT при експорті (працює в Ant). Я оновив code.google.com/p/android/isissue/detail?id=27940
Xavier Ducrohet

1
@Xav дякую, що заглянув у нього, я перестану спам, який ти зараз обіцяєш. Це був насправді головний проект, з яким у мене виникли проблеми (не дивився на залежну бібліотеку). Якщо я можу створити конкретний тестовий випадок, я відправлю його в трекер помилок під тим же питанням.
smith324

1

хороший спосіб - це створити власний клас:

public class Log {

public static void d(String message) {
    if (BuildConfig.DEBUG)
        android.util.Log.d(
            "[" + (new Exception().getStackTrace()[1].getClassName()) + "]",
            "{" + (new Exception().getStackTrace()[1].getMethodName()) + "} "
            + message
        );
}

}

12
Проблема цього методу полягає в тому, що у випадку, коли DEBUG помилковий, java все одно обчислить кожну рядок, щоб передати її у ваш власний клас. Якщо (DEBUG) Log.d (...) менш елегантний, але ефективніший.
Джереміфа

0

Я бачив якусь дивну поведінку, пов'язану з тим, коли значення в BuildConfig встановлюються на їх кінцеві значення. Це може мати щось спільне з вашою проблемою.

Просте пояснення полягає в тому, що значення за замовчуванням встановлюються спочатку перед запуском Proguard, потім після запуску Proguard файл BuildConfig відновлюється з відповідними значеннями. Однак Proguard вже оптимізував ваш код до цього моменту, і у вас є проблеми.

Ось помилка, яку я створив проти Gradle. https://code.google.com/p/android/isissue/detail?id=182449

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.