Khi nào ADT đặt BuildConfig.DEBUG thành false?


110

Trong phiên bản mới nhất của ADT (r17), một hằng số được tạo đã được thêm vào BuildConfig.DEBUGđược đặt theo kiểu xây dựng. Vấn đề tôi gặp phải là nó không bao giờ được đặt thành false, tôi đã mong đợi nó thay đổi khi thực hiện "Công cụ Android -> Xuất gói ứng dụng đã ký" nhưng nó không dành cho tôi.

Vậy làm cách nào để thay đổi kiểu xây dựng?

Đã thêm một tính năng cho phép bạn chạy một số mã chỉ trong chế độ gỡ lỗi. Giờ đây, các bản dựng tạo ra một lớp có tên BuildConfig chứa hằng số GỠ LỖI được đặt tự động theo kiểu xây dựng của bạn. Bạn có thể kiểm tra hằng số (BuildConfig.DEBUG) trong mã của mình để chạy các chức năng chỉ gỡ lỗi


2
BuildConfig.java được tạo tự động bởi các công cụ xây dựng của Android và được đặt vào thư mục gen. APK đã ký phải có BuildConfig.DEBUG = false. Nó không phải là một vấn đề cho bạn. Bạn không cần phải bằng tay chạm vào tập tin đó ...
IgorGanapolsky

1
Nếu bạn sử dụng gradle để phát hành cờ này là đáng tin cậy 100%. Vì vậy, khi bạn thực hiện ./gradlew assemblyDebug là true và khi thực hiện assemblyRelease là false.
slott 26/1213

Câu trả lời:


56

Hiện tại, bạn có thể có được hành vi chính xác bằng cách tắt "Xây dựng tự động", dọn dẹp dự án và sau đó xuất qua "Công cụ Android -> Xuất gói ứng dụng đã ký". Khi bạn chạy ứng dụng BuildConfig.DEBUGsẽ sai.


cũng bị hỏng. Điều này có hậu quả là hiển thị tất cả các thông báo Log.d mà cờ này sẽ bỏ qua. ps. nộp báo cáo lỗi ở đâu?
tomi

tôi luôn luôn là sai, thậm chí khi gỡ lỗi
behelit

39

Với Eclipse , tôi luôn tắt tùy chọn "Xây dựng tự động" trước khi Xuất ứng dụng trong bản phát hành. Sau đó, tôi làm sạch dự án và xuất khẩu. Nếu không, nó sẽ bắt đầu biên dịch ở chế độ gỡ lỗi và khi đó giá trị của BuildConfig.DEBUG có thể bị sai.

Với Android Studio , tôi chỉ cần thêm biến tùy chỉnh của riêng mình vào build.gradle:

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

Khi tôi xây dựng dự án, BuildConfig.java được tạo như sau:

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

Sau đó, trong mã của tôi, tôi có thể sử dụng:

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

Tôi đề nghị làm sạch sau khi chuyển đổi bản dựng gỡ lỗi / phát hành.


1
Giải pháp này là tốt nhất nếu bạn sử dụng proguard vì nó sẽ tạo ra một hằng số có giá trị theo nghĩa đen, vì vậy mã gỡ lỗi của bạn sẽ bị xóa hoàn toàn khỏi tệp nhị phân trong chế độ phát hành.
Victor Laerte

33

Nó không hoạt động bình thường:

Phát hành 27.940 : BuildConfig.DEBUG là "true" cho gói ứng dụng xuất khẩu

Thật đáng thất vọng khi họ đôi khi phát hành các tính năng lỗi.


9
Vui lòng truy cập liên kết đến vấn đề được đề cập ở trên và 'gắn dấu sao' cho vấn đề nếu bạn muốn vấn đề này được khắc phục.
Guy,

11

Nó hoạt động, nhưng lưu ý rằng tệp mã không bao giờ thay đổi, ngay cả khi xuất tệp đã ký. Quá trình xuất thay đổi giá trị của biến này thành false, điều này có thể khiến bạn có ấn tượng sai rằng biến này không hoạt động. Tôi đã thử nghiệm điều này với các câu lệnh ghi nhật ký như

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

Khi kiểm tra, các câu lệnh Nhật ký của tôi không còn tạo ra bất kỳ đầu ra nào nữa.


1
Chính xác thì bạn đã làm gì?
pbhowmick

2
Tôi đã thay đổi các phiên bản của BuildConfig.DEBUG thành com.mypackage.BuildConfig.DEBUG, sau đó reran ứng dụng ... và nó vẫn trả về true mọi lúc. Có lẽ tôi đã hiểu sai đề nghị của bạn.
Chris Rae

1
Những gì tôi đang nói là mã sẽ KHÔNG thay đổi. Tuy nhiên, com.mypackage.BuildConfig.DEBUG sẽ được đặt thành Biên dịch bài đăng sai. Hãy thử một câu lệnh ghi nhật ký thử nghiệm như trên (chọn một chuỗi tùy ý để ghi nhật ký), thực hiện việc xuất và sau đó chạy nó. Xem liệu adb có hiển thị câu lệnh ghi nhật ký không. Tôi sẽ đặt cược rằng adb sẽ không báo cáo câu lệnh ghi nhật ký đó, có nghĩa là DEUBUG đã được đặt thành false.
pbhowmick

1
Tôi không chắc mình biết ý bạn về "mã" ... tuy nhiên, tôi sẽ nói rằng việc làm sạch trước khi xuất APK (như được đề xuất trong câu trả lời được chấp nhận) đã làm cho cả BuildConfig.DEBUG và com.mypackage.BuildConfig .DEBUG báo cáo sai như mong đợi.
Chris Rae

Bạn đã hiểu. Đó là hành vi được mong đợi.
pbhowmick

10

Kiểm tra xem imports, đôi khi BuildConfig được nhập từ bất kỳ lớp thư viện nào không chủ ý. Ví dụ:

import io.fabric.sdk.android.BuildConfig;

Trong trường hợp này BuildConfig.DEBUG sẽ luôn trả về false ;

import com.yourpackagename.BuildConfig;

Trong trường hợp này BuildConfig.DEBUG sẽ trả về biến thể bản dựng thực của bạn .

ps Tôi chỉ sao chép cái này từ câu trả lời của tôi ở đây: BuildConfig.DEBUG luôn sai khi xây dựng các dự án thư viện với gradle


1
Vâng, đối với tôi, nó vô tình được nhập từ android.support.compat. Tôi đoán đó là một lý do khác để xác định lĩnh vực của riêng bạn bằng một tên khác.
arekolek

5

Từ khi chuẩn bị phát hành :

Tắt ghi nhật ký và gỡ lỗi

Đảm bảo rằng bạn hủy kích hoạt ghi nhật ký và tắt tùy chọn gỡ lỗi trước khi bạn xây dựng ứng dụng của mình để phát hành. Bạn có thể hủy kích hoạt ghi nhật ký bằng cách xóa các lệnh gọi đến các phương thức Ghi nhật ký trong tệp nguồn của mình. Bạn có thể tắt gỡ lỗi bằng cách xóa thuộc tính android: debuggable khỏi thẻ trong tệp kê khai của mình hoặc bằng cách đặt thuộc tính android: debuggable thành false trong tệp kê khai của bạn. Ngoài ra, hãy xóa mọi tệp nhật ký hoặc tệp kiểm tra tĩnh đã được tạo trong dự án của bạn.

Ngoài ra, bạn nên xóa tất cả các lệnh gọi theo dõi Gỡ lỗi mà bạn đã thêm vào mã của mình, chẳng hạn như lệnh gọi phương thức startMethodTracing () và stopMethodTracing ().

Thông tin thêm đang theo liên kết.


1
Tôi nghĩ rằng quá trình này hiện xảy ra tự động tại thời điểm xây dựng: developer.android.com/tools/sdk/tools-notes.html
IgorGanapolsky

Gây ra lỗi thời gian biên dịch: «Tránh mã hóa cứng chế độ gỡ lỗi; rời nó ra cho phép gỡ lỗi và phát hành xây dựng một cách tự động assign »
Nikita Bosik

5

Giải pháp cho tôi:

  1. Dự án -> Xây dựng tự động
  2. Dự án -> Sạch sẽ
  3. Dự án -> Xây dựng
  4. Ứng dụng Android Project Export

Nó hoạt động trong r20


1
Điều này đã làm việc cho tôi ngay bây giờ (sử dụng ADT mới nhất mà tôi đoán). Có thể việc vệ sinh đã sửa nó, chưa chắc.
Jonny

3

Tôi muốn đề xuất một giải pháp đơn giản nếu bạn sử dụng proguard trong quá trình xuất APK.

Proguard cung cấp một cách để loại bỏ các cuộc gọi đến các chức năng cụ thể trong chế độ phát hành. Mọi lệnh gọi cho nhật ký gỡ lỗi đều có thể bị xóa với cài đặt sau trong proguard-project.txt.

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

Và cài đặt tối ưu hóa trong project.properties.

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

Với điều này, bạn không cần phải quan tâm đến bất kỳ phép tính chuỗi không cần thiết nào chuyển tới nhật ký gỡ lỗi mà @Jeremyfa đã trỏ tới. Các tính toán chỉ bị loại bỏ trong bản phát hành.

Vì vậy, giải pháp cho BuildConfig.DEBUG sử dụng cùng một tính năng của proguard như sau.

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

Và sau khi cài đặt trong proguard-project.txt.

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

Tôi muốn sử dụng Build Automaticallytùy chọn này để tắt tùy chọn, bởi vì điều này không phụ thuộc vào cài đặt IDE cá nhân của người xây dựng nhưng được duy trì dưới dạng tệp cam kết được chia sẻ giữa các nhà phát triển.


1

Không hoạt động đúng như tôi hiểu ( vấn đề Android 22241 )

Tôi đã gặp một số sự cố trong một dự án (làm việc với Eclipse), hằng số đó không được đặt thành true khi xuất APK đã ký của dự án của tôi :(

Rất thích nghe nó hoạt động mặc dù


1
Nó đáng lẽ đã được sửa trong r17, nó được đánh dấu như vậy trong trình theo dõi lỗi.
smith324,

1
Trên thực tế, libs không được biên dịch ở chế độ phát hành trong ADT khi xuất (hoạt động trong Ant). Tôi đã cập nhật code.google.com/p/android/issues/detail?id=27940
Xavier Ducrohet

1
@Xav cảm ơn bạn đã xem xét nó, tôi sẽ ngừng gửi thư rác cho bạn ngay bây giờ hứa. Nó thực sự là dự án chính mà tôi đang gặp vấn đề (không nhìn vào thư viện phụ thuộc). Nếu tôi có thể tạo một trường hợp thử nghiệm cụ thể, tôi sẽ đăng nó lên trình theo dõi lỗi trong cùng một vấn đề.
smith324

1

một cách tốt là tạo lớp học của riêng bạn:

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
Vấn đề với phương pháp này là, sự kiện khi DEBUG là false, java sẽ vẫn tính toán từng Chuỗi để chuyển nó vào lớp tùy chỉnh của bạn. If (DEBUG) Log.d (...) kém thanh lịch hơn nhưng hiệu quả hơn.
Jeremyfa

0

Tôi đã thấy một số hành vi kỳ lạ liên quan đến khi các giá trị trong BuildConfig được đặt thành giá trị cuối cùng của chúng. Điều này có thể liên quan đến vấn đề của bạn.

Giải thích đơn giản là các giá trị mặc định được đặt ban đầu trước khi chạy Proguard, sau đó sau khi Proguard chạy, tệp BuildConfig được tạo lại với các giá trị thích hợp. Tuy nhiên, đến thời điểm này Proguard đã tối ưu hóa mã của bạn và bạn có vấn đề.

Đây là một lỗi tôi đã tạo ra chống lại Gradle. https://code.google.com/p/android/issues/detail?id=182449

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.