Kapan ADT menyetel BuildConfig.DEBUG ke false?

110

Di versi terbaru ADT (r17), konstanta yang dihasilkan ditambahkan BuildConfig.DEBUGyang disetel sesuai dengan tipe build. Masalah yang saya hadapi adalah bahwa ini tidak pernah disetel ke false, saya mengharapkannya berubah saat melakukan "Alat Android -> Ekspor Paket Aplikasi yang Ditandatangani" tetapi tidak untuk saya.

Jadi, bagaimana cara mengubah jenis build?

Menambahkan fitur yang memungkinkan Anda menjalankan beberapa kode hanya dalam mode debug. Build sekarang menghasilkan kelas yang disebut BuildConfig yang berisi konstanta DEBUG yang secara otomatis disetel sesuai dengan jenis build Anda. Anda dapat memeriksa konstanta (BuildConfig.DEBUG) dalam kode Anda untuk menjalankan fungsi khusus debug

smith324.dll
sumber
2
BuildConfig.java dibuat secara otomatis oleh alat build Android, dan ditempatkan ke dalam folder gen. APK yang ditandatangani harus memiliki BuildConfig.DEBUG = false. Ini seharusnya tidak menjadi masalah bagi Anda. Anda tidak perlu menyentuh file itu secara manual ...
IgorGanapolsky
1
Jika Anda menggunakan gradle untuk merilis, bendera ini 100% dapat diandalkan. Jadi ketika Anda melakukan ./gradlew assembleDebug itu benar dan ketika melakukan assembleRelease yang salah.
slott

Jawaban:

56

Saat ini Anda bisa mendapatkan perilaku yang benar dengan menonaktifkan "Bangun Secara Otomatis", membersihkan proyek dan kemudian mengekspor melalui "Alat Android -> Ekspor Paket Aplikasi yang Ditandatangani". Saat Anda menjalankan aplikasiBuildConfig.DEBUG harus salah.

smith324.dll
sumber
rusak juga. Yang memiliki konsekuensi menampilkan semua pesan Log.d yang harus dihilangkan oleh flag ini. ps. ke mana harus mengajukan laporan bug?
tomi
milik saya selalu salah, bahkan saat debugging
behelit
39

Dengan Eclipse , saya selalu menonaktifkan opsi "Bangun Secara Otomatis" sebelum Mengekspor aplikasi dalam rilis. Kemudian saya membersihkan proyek dan mengekspor. Jika tidak, ia mulai menyusun dalam mode debug, dan kemudian nilai BuildConfig.DEBUG mungkin salah.

Dengan Android Studio , saya cukup menambahkan variabel khusus saya sendiri di build.gradle:

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

Ketika saya membangun proyek, BuildConfig.java dibuat sebagai berikut:

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

Kemudian dalam kode saya, saya dapat menggunakan:

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

Saya merekomendasikan untuk membersihkan setelah beralih debug / rilis build.

Arnaud SmartFun
sumber
1
Solusi ini adalah yang terbaik jika Anda menggunakan proguard karena akan menghasilkan konstanta dengan nilai literal, sehingga kode debug Anda akan sepenuhnya dihapus dari biner dalam mode rilis.
Victor Laerte
33

Itu tidak berfungsi dengan baik:

Masalah 27940 : BuildConfig.DEBUG adalah "benar" untuk paket aplikasi yang diekspor

Sangat mengecewakan bahwa terkadang mereka merilis fitur buggy.

Randy Sugianto 'Yuku'
sumber
9
Silakan buka tautan ke masalah yang disebutkan di atas dan 'beri bintang' jika Anda ingin masalah ini diperbaiki.
Guy
11

Itu berfungsi, tetapi perhatikan bahwa file kode tidak pernah berubah, bahkan saat mengekspor file yang ditandatangani. Ekspor proses mengubah nilai variabel ini ke false, yang mungkin memberikan kesan palsu bahwa itu tidak bekerja. Saya menguji ini dengan pernyataan logging seperti

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

Saat menguji, pernyataan Log saya tidak lagi menghasilkan keluaran apa pun.

pbhowmick
sumber
1
Apa sebenarnya yang kamu lakukan?
pbhowmick
2
Saya mengubah contoh BuildConfig.DEBUG menjadi com.mypackage.BuildConfig.DEBUG, lalu menjalankan ulang aplikasi ... dan masih mengembalikan true sepanjang waktu. Mungkin saya salah memahami saran Anda.
Chris Rae
1
Apa yang saya katakan adalah bahwa kode TIDAK akan berubah. Namun, com.mypackage.BuildConfig.DEBUG akan disetel ke kompilasi posting False. Coba pernyataan pengujian logging seperti di atas (pilih string arbitrer untuk dicatat), lakukan ekspor, lalu jalankan. Lihat apakah adb menampilkan pernyataan logging. Saya akan bertaruh bahwa adb tidak akan melaporkan pernyataan logging itu, menandakan bahwa DEUBUG telah disetel ke false.
pbhowmick
1
Saya tidak yakin saya tahu apa yang Anda maksud tentang "kode" ... namun, saya akan mengatakan bahwa melakukan pembersihan sebelum mengekspor APK (seperti yang disarankan dalam jawaban yang diterima) membuat BuildConfig.DEBUG dan com.mypackage.BuildConfig .DEBUG melaporkan salah seperti yang diharapkan.
Chris Rae
Anda mengerti. Itulah perilaku yang diharapkan.
pbhowmick
10

Periksa imports, terkadang BuildConfig diimpor dari kelas pustaka mana pun secara tidak sengaja. Sebagai contoh:

import io.fabric.sdk.android.BuildConfig;

Dalam hal ini, BuildConfig.DEBUG akan selalu mengembalikan false ;

import com.yourpackagename.BuildConfig;

Dalam hal ini, BuildConfig.DEBUG akan mengembalikan varian build Anda yang sebenarnya .

ps Saya baru saja menyalin yang ini dari jawaban saya di sini: BuildConfig.DEBUG selalu salah saat membangun proyek perpustakaan dengan gradle

Gent Berani
sumber
1
Ya, bagi saya itu tidak sengaja diimpor dari android.support.compat. Saya rasa itu alasan lain untuk mendefinisikan bidang Anda sendiri dengan nama yang berbeda.
arekolek
5

Dari Mempersiapkan untuk Rilis :

Matikan logging dan debugging

Pastikan Anda menonaktifkan logging dan opsi debugging sebelum Anda membangun aplikasi untuk rilis. Anda dapat menonaktifkan logging dengan menghapus panggilan ke metode Log di file sumber Anda. Anda bisa menonaktifkan debugging dengan menghapus atribut android: debuggable dari tag di file manifes Anda, atau dengan menyetel atribut android: debuggable ke false di file manifes Anda. Selain itu, hapus file log atau file pengujian statis apa pun yang dibuat dalam project Anda.

Selain itu, Anda harus menghapus semua panggilan pelacakan Debug yang ditambahkan ke kode Anda, seperti panggilan metode startMethodTracing () dan stopMethodTracing ().

Informasi lebih lanjut mengikuti tautan.

peter
sumber
1
Saya pikir proses ini sekarang terjadi secara otomatis pada waktu pembuatan: developer.android.com/tools/sdk/tools-notes.html
IgorGanapolsky
Menyebabkan kesalahan waktu kompilasi: «Hindari hardcoding mode debug; membiarkannya keluar memungkinkan debug dan rilis build untuk menetapkannya secara otomatis »
Nikita Bosik
5

Solusi untuk saya:

  1. Proyek -> Bangun Secara Otomatis
  2. Proyek -> Bersihkan
  3. Proyek -> Bangun
  4. Proyek Ekspor aplikasi Android

Ini bekerja di r20

e. shishkin
sumber
1
Ini bekerja untuk saya sekarang (saya kira menggunakan ADT terbaru). Mungkin pembersihan itu memperbaikinya, tidak yakin.
Jonny
3

Saya ingin mengusulkan solusi sederhana jika Anda menggunakan proguard selama ekspor APK.

Proguard menyediakan cara untuk menghapus panggilan ke fungsi tertentu dalam mode rilis. Semua panggilan untuk log debugging dapat dihapus dengan pengaturan berikut di proguard-project.txt.

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

Dan pengaturan optimasi di project.properties.

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

Dengan ini, Anda tidak perlu mengkhawatirkan komputasi String yang tidak perlu yang meneruskan ke log debug yang ditunjuk oleh @Jeremyfa. Perhitungan baru saja dihapus dalam rilis build.

Jadi solusi untuk BuildConfig.DEBUG menggunakan fitur proguard yang sama seperti berikut.

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;
    }
}

Dan mengikuti pengaturan di proguard-project.txt.

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

Saya lebih suka menggunakan ini untuk menonaktifkan Build Automaticallyopsi, karena ini tidak tergantung pada pengaturan IDE individu pembuat tetapi dipertahankan sebagai file yang berkomitmen yang dibagikan di antara pengembang.

neo.kim
sumber
1

Tidak berfungsi dengan baik sejauh yang saya mengerti ( Masalah Android 22241 )

Saya mengalami masalah pada sebuah proyek (bekerja dengan Eclipse), konstanta itu tidak disetel ke true saat mengekspor APK yang ditandatangani dari proyek saya :(

Akan sangat senang mendengarnya berhasil

Vincent Mimoun-Prat
sumber
1
Seharusnya sudah diperbaiki di r17, ditandai seperti itu di pelacak bug.
smith324
1
Sebenarnya libs tidak dikompilasi dalam mode rilis di ADT saat mengekspor (bekerja di Ant). Saya memperbarui code.google.com/p/android/issues/detail?id=27940
Xavier Ducrohet
1
@Xav terima kasih telah memeriksanya, saya akan berhenti mengirim spam sekarang. Sebenarnya itu adalah proyek utama yang bermasalah (tidak melihat perpustakaan dependen). Jika saya dapat membuat kasus uji konkret, saya akan mempostingnya ke pelacak bug di bawah masalah yang sama.
smith324
1

cara yang baik adalah membuat kelas Anda sendiri:

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
        );
}

}
Bouchehboun Saad
sumber
12
Masalah dengan metode ini adalah, saat DEBUG salah, java masih akan menghitung setiap String untuk meneruskannya ke kelas kustom Anda. If (DEBUG) Log.d (...) kurang elegan tetapi lebih efisien.
Jeremyfa
0

Saya telah melihat beberapa perilaku aneh yang berkaitan dengan saat nilai di BuildConfig disetel ke nilai akhirnya. Ini mungkin ada hubungannya dengan masalah Anda.

Penjelasan sederhananya adalah bahwa nilai default ditetapkan pada awalnya sebelum Proguard dijalankan, kemudian setelah Proguard dijalankan, file BuildConfig dibuat ulang dengan nilai yang sesuai. Namun, Proguard telah mengoptimalkan kode Anda pada saat ini dan Anda mengalami masalah.

Berikut adalah bug yang saya buat terhadap Gradle. https://code.google.com/p/android/issues/detail?id=182449

KISAH
sumber