ADT, BuildConfig.DEBUG'ı ne zaman false olarak ayarlar?


110

ADT'nin (r17) en yeni sürümünde BuildConfig.DEBUG, inşa türüne göre ayarlanan üretilen bir sabit eklendi . Karşılaştığım sorun, hiçbir zaman yanlış olarak ayarlanmaması, "Android Araçları -> İmzalı Uygulama Paketini Dışa Aktar" yaparken değişmesini bekliyordum ama benim için değil.

Peki yapı türünü nasıl değiştiririm?

Bazı kodları yalnızca hata ayıklama modunda çalıştırmanıza izin veren bir özellik eklendi. Derlemeler artık derleme türünüze göre otomatik olarak ayarlanan bir DEBUG sabitini içeren BuildConfig adlı bir sınıf oluşturur. Yalnızca hata ayıklama işlevlerini çalıştırmak için kodunuzdaki (BuildConfig.DEBUG) sabitini kontrol edebilirsiniz.


2
BuildConfig.java, Android derleme araçları tarafından otomatik olarak oluşturulur ve gen klasörüne yerleştirilir. İmzalanmış APK, BuildConfig.DEBUG = false değerine sahip olmalıdır. Senin için sorun olmamalı. O dosyaya elle dokunmanız
gerekmemeli

1
Bu bayrağı serbest bırakmak için gradle kullanırsanız% 100 güvenilirdir. Yani bir ./gradlew assembleDebug yaptığınızda, bunun doğru olduğunu ve assembleRelease işleminin yanlış olduğunu görürsünüz.
slott

Yanıtlar:


56

Şu anda "Otomatik Olarak Oluştur" u devre dışı bırakarak, projeyi temizleyerek ve ardından "Android Araçları -> İmzalı Uygulama Paketini Dışa Aktar" yoluyla dışa aktararak doğru davranışı elde edebilirsiniz. Uygulamayı çalıştırdığınızda BuildConfig.DEBUGyanlış olmalıdır.


çok kırılmış. Bu, bu bayrakla atlanması gereken tüm Log.d mesajlarının görüntülenmesi sonucuna sahiptir. ps. hata raporu nereye kaydedilir?
tomi

benimki her zaman yanlıştır, hata ayıklarken bile
2016 3

39

İle Eclipse , açıklamasında uygulamayı İhracat önce hep devre dışı "Yapı Otomatik" seçeneği. Daha sonra projeyi temizleyip ihraç ediyorum. Aksi takdirde, hata ayıklama modunda derlemeye başlar ve ardından BuildConfig.DEBUG değeri yanlış olabilir.

Android Studio ile build.gradle'a kendi özel değişkenimi eklemem yeterli:

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

Projeyi oluşturduğumda, BuildConfig.java aşağıdaki gibi oluşturulur:

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

Sonra kodumda şunları kullanabilirim:

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

Hata ayıklama / sürüm yapısını değiştirdikten sonra temizlemeyi tavsiye ederim.


1
Proguard kullanıyorsanız bu çözüm en iyisidir çünkü değişmez bir değere sahip bir sabit oluşturacaktır, böylece hata ayıklama kodunuz yayın modunda ikiliden tamamen kaldırılacaktır.
Victor Laerte

33

Düzgün çalışmıyor:

Sorun 27940 : BuildConfig.DEBUG, dışa aktarılan uygulama paketi için "true" dur

Bazen buggy özelliklerini yayınlamaları hayal kırıklığı yaratıyor.


9
Lütfen yukarıda bahsedilen sorunun bağlantısına gidin ve düzeltilmesini istiyorsanız ona 'yıldız' ekleyin.
Guy

11

Çalışır, ancak imzalı dosyayı dışa aktarırken bile kod dosyasının asla değişmediğini unutmayın. Dışa aktarma işlemi , bu değişkenin değerini yanlış olarak değiştirir ve bu da size çalışmadığı yönünde yanlış bir izlenim verebilir. Bunu günlük kaydı ifadeleriyle test ettim.

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

Test ederken, Log ifadelerim artık herhangi bir çıktı üretmiyor.


1
Tam olarak ne yaptın
pbhowmick

2
BuildConfig.DEBUG örneklerini com.mypackage.BuildConfig.DEBUG olarak değiştirdim, ardından uygulamayı yeniden çalıştırdım ... ve yine de her zaman true döndürdü. Belki önerinizi yanlış anladım.
Chris Rae

1
Demek istediğim, kodun DEĞİŞMEYECEĞİ. Ancak com.mypackage.BuildConfig.DEBUG, False post compilation olarak ayarlanacaktır. Yukarıdaki gibi bir test günlüğü deyimi deneyin (günlüğe girmek için rastgele bir dize seçin), dışa aktarımı yapın ve ardından çalıştırın. Adb'nin günlük ifadesini gösterip göstermediğine bakın. ADB'nin, DEUBUG'ın yanlış olarak ayarlandığını göstererek bu kayıt ifadesini rapor etmeyeceğine dair bir iddiaya gireceğim.
pbhowmick

1
"Kod" hakkında ne demek istediğini anladığımdan emin değilim ... ancak, APK'yi dışa aktarmadan önce temizlemenin (kabul edilen cevapta önerildiği gibi) hem BuildConfig.DEBUG hem de com.mypackage.BuildConfig yaptığını söyleyeceğim .DEBUG beklendiği gibi yanlış bildirir.
Chris Rae

Anladın. Beklenen davranış budur.
pbhowmick

10

importsBazen BuildConfig'in herhangi bir kitaplık sınıfından istemeden içe aktarıldığını kontrol edin . Örneğin:

import io.fabric.sdk.android.BuildConfig;

Bu durumda, BuildConfig.DEBUG her zaman yanlış döndürür ;

import com.yourpackagename.BuildConfig;

Bu durumda BuildConfig.DEBUG gerçek yapı varyantınızı döndürür .

ps Bunu cevabımdan burada kopyaladım : Gradle ile kütüphane projeleri oluştururken BuildConfig.DEBUG her zaman yanlış


1
Evet, benim için yanlışlıkla ithal edildi android.support.compat. Sanırım bu, kendi alanınızı farklı bir adla tanımlamanın başka bir nedeni.
arekolek

5

Gönderen Release için hazırlanıyor :

Günlüğe kaydetmeyi ve hata ayıklamayı kapatın

Uygulamanızı yayınlamak üzere oluşturmadan önce günlük kaydını devre dışı bıraktığınızdan ve hata ayıklama seçeneğini devre dışı bıraktığınızdan emin olun. Kaynak dosyalarınızdaki Günlük yöntemlerine yapılan çağrıları kaldırarak günlük kaydını devre dışı bırakabilirsiniz. Manifest dosyanızdaki etiketten android: debuggable özniteliğini kaldırarak veya manifest dosyanızda android: debuggable özniteliğini false olarak ayarlayarak hata ayıklamayı devre dışı bırakabilirsiniz. Ayrıca, projenizde oluşturulmuş tüm günlük dosyalarını veya statik test dosyalarını kaldırın.

Ayrıca startMethodTracing () ve stopMethodTracing () yöntemi çağrıları gibi kodunuza eklediğiniz tüm Debug izleme çağrılarını kaldırmanız gerekir.

Daha fazla bilgi bağlantıyı takip ediyor.


1
Bu işlemin artık derleme zamanında otomatik olarak gerçekleştiğini düşündüm: developer.android.com/tools/sdk/tools-notes.html
IgorGanapolsky

Derleme zamanı hatasına neden olur: «Hata ayıklama kipini kodlamaktan kaçının; bunu dışarıda bırakmak, hata ayıklama ve sürüm yapılarının otomatik olarak bir tane atamasına izin verir »
Nikita Bosik

5

Benim için çözüm:

  1. Proje -> Otomatik Olarak Oluştur
  2. Proje -> Temizle
  3. Proje -> İnşa Et
  4. Project Export Android uygulaması

R20'de çalışıyor


1
Bu benim için şu anda çalıştı (sanırım en son ADT'yi kullanarak). Belki temizlik sorunu çözdü, emin değilim.
Jonny

3

APK dışa aktarımı sırasında proguard kullanırsanız basit bir geçici çözüm önermek isterim.

Proguard, serbest bırakma modunda belirli işlevlere çağrıları kaldırmak için bir yol sağlar. Hata ayıklama günlüklerine yönelik herhangi bir çağrı, aşağıdaki ayar ile kaldırılabilir proguard-project.txt.

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

Ve optimizasyon ayarı project.properties.

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

Bununla, @ Jeremyfa'nın işaret ettiği hata ayıklama günlüğüne geçen gereksiz String hesaplamalarını endişelendirmenize gerek kalmaz. Hesaplamalar, sürüm yapısında kaldırılır.

Dolayısıyla, BuildConfig.DEBUG için geçici çözüm, aşağıdaki gibi proguard'ın aynı özelliğini kullanır.

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

Ve içeri girdikten sonra proguard-project.txt.

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

Build AutomaticallySeçeneği devre dışı bırakmak için bunu kullanmayı tercih ederim , çünkü bu, oluşturucunun bireysel IDE ayarına bağlı değildir, ancak geliştiriciler arasında paylaşılan kaydedilmiş dosya olarak tutulur.


1

Anladığım kadarıyla düzgün çalışmıyor ( Android sorunu 22241 )

Bir projede (Eclipse ile çalışırken) bazı sorunlar yaşadım, projemin imzalı bir APK'sini dışa aktarırken bu sabit doğru olarak ayarlanmadı :(

Yine de işe yaradığını duymak isterim


1
Hata izleyicide olduğu gibi işaretlenmiş olan r17'de düzeltilmesi gerekirdi.
smith324

1
Aslında kütüphaneler, dışa aktarılırken ADT'de yayın modunda derlenmez (Ant'ta çalışır). Güncellenmiş code.google.com/p/android/issues/detail?id=27940
Xavier Ducrohet

1
@Xav, araştırdığınız için teşekkürler, artık söz veriyorum size spam göndermeyi bırakacağım. Aslında sorun yaşadığım ana projeydi (bağımlı kitaplığa bakmadım). Somut bir test senaryosu oluşturabilirsem, bunu aynı sorun altındaki hata izleyiciye gönderirim.
smith324

1

iyi bir yol kendi sınıfınızı oluşturmaktır:

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
Bu yöntemle ilgili sorun, DEBUG yanlış olduğunda, java'nın yine de her String'i hesaplayarak özel sınıfınıza iletmesidir. İf (DEBUG) Log.d (...) daha az zarif ama daha etkilidir.
Jeremyfa

0

BuildConfig'teki değerler nihai değerlerine ayarlandığında bununla ilgili bazı garip davranışlar gördüm. Bunun sorununuzla bir ilgisi olabilir.

Basit açıklama, varsayılan değerlerin başlangıçta Proguard çalıştırılmadan önce ayarlanması, ardından Proguard çalıştırıldıktan sonra BuildConfig dosyasının uygun değerlerle yeniden oluşturulmasıdır. Ancak Proguard, kodunuzu bu noktaya kadar zaten optimize etti ve sorunlarınız var.

İşte Gradle'a karşı oluşturduğum bir hata. https://code.google.com/p/android/issues/detail?id=182449

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.