2010-04-27 39 views
30

Tôi đang lập trình các ứng dụng Android và cách tốt nhất ở đây có thể hoặc có thể không giống với Java nói chung. Tôi chỉ đơn giản muốn có thể thiết lập một cờ gỡ lỗi sẽ chỉ thực hiện một số phần mã nhất định khi nó được đặt thành true –– equiv để C++ thiết lập một bộ tiền xử lý #define DEBUG và sử dụng #ifdef DEBUG.Cách tốt nhất để bao gồm mã gỡ lỗi là gì?

Có cách nào được chấp nhận hoặc tốt nhất để thực hiện điều này trong Java không?

Ngay bây giờ tôi chỉ cần đặt một biến trong đối tượng Ứng dụng của tôi, nhưng tôi không tưởng tượng đây là cách tốt nhất.

+2

Kiểm tra câu trả lời này: http://stackoverflow.com/questions/1344270/java-preprocessor – zmbush

Trả lời

23

Đó là cách tôi làm điều đó:

// in some.class.with.Constants 
public static final boolean DEV_MODE = true; 

// in some other class 
import static some.class.with.Constants.DEV_MODE; 

if(DEV_MODE){ 
    Log.d('sometag', 'somemessage'); 
} 
+3

Nice! Tôi không biết bạn có thể nhập tất cả các con đường xuống một hằng số duy nhất! Tôi đang tìm cách tránh gõ X. X.CONST mỗi lần. Điều này, kết hợp với câu trả lời được tham chiếu trong phần bình luận về câu hỏi của tôi (http://stackoverflow.com/questions/1344270/java-preprocessor), cho thấy câu lệnh 'if' có hằng số sai trong điều kiện của nó bị loại ra khỏi biên dịch, chính xác là những gì tôi đang tìm kiếm. Cảm ơn! – stormin986

+0

Bằng các thí nghiệm của tôi (kiểm tra mã byte), cách tiếp cận này sẽ chỉ loại trừ mã từ lớp mà hằng số được định nghĩa .. các lớp khác sẽ vẫn có mã trong chúng (nó sẽ không thực thi). Liệu tôi có sai? – Vlad

+0

nhập tĩnh về cơ bản chỉ là một cái tên – Vlad

6
if (Debug.isDebuggerConnected()) { 
    // debug stuff 
} 
+0

Tôi thích điều này, và tôi tưởng tượng tôi sẽ tìm thấy nó khá hữu ích ở lần, nhưng tôi thích cách tiếp cận khác bỏ qua toàn bộ khối từ trình biên dịch với hằng số sai trong 'if' tuyên bố. – stormin986

+1

Tôi sử dụng cả hai phương pháp và nhận xét điều kiện. Mỗi vị trí của nó, mặc dù một bộ tiền xử lý thực sự sẽ là tốt nhất. – drawnonward

+0

Vấn đề với điều này là, trình gỡ rối không phải lúc nào cũng được kết nối, khi ứng dụng của tôi gặp sự cố. Tôi đang thu thập dấu vết ngăn xếp trong ngoại lệ và lưu trong một tệp. Nhưng tôi PHẢI làm điều đó trong debug xây dựng mà thôi. – anishsane

51

Thay vì sử dụng lá cờ của riêng bạn, bạn có thể sử dụng cờ thiết lập tự động bằng ADT, như thế này:

final static int appFlags = context.getApplicationInfo().flags; 
final static boolean isDebug = (appFlags & ApplicationInfo.FLAG_DEBUGGABLE) != 0 

Các FLAG_DEBUGGABLE bit được tự động đặt thành true hoặc false, tùy thuộc vào thuộc tính "có thể gỡ lỗi" của ứng dụng (được đặt trong AndroidManifest.xml). Phiên bản mới nhất của ADT (phiên bản 8) tự động đặt thuộc tính này cho bạn khi không xuất gói đã ký.

Vì vậy, bạn không phải nhớ đặt/đặt lại cờ tùy chỉnh của riêng mình.

Bạn có thể đọc thêm trong this thread.

1

Tôi nghĩ rằng các bài kiểm tra viết sẽ thay thế tốt hơn việc thêm mã DEBUG.

Điểm của tôi là khi bạn viết kiểm tra cho một số thành phần/phương pháp/lớp bạn không gây ô nhiễm mã nguồn ban đầu của bạn với một số mã gỡ lỗi dự phòng.

24

Revision 17 của công cụ SDK (tháng 3 năm 2012) đã giới thiệu một cách để bắt chước C #ifdef DEBUG

Từ General Notes:

gia tăng tính năng cho phép bạn chạy một số mã chỉ trong chế độ gỡ lỗi . Các bản dựng bây giờ tạo ra một lớp gọi là BuildConfig chứa hằng số DEBUG được tự động thiết lập 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 bạn để chạy các hàm chỉ gỡ rối.

+0

Luôn trả về false cho thư viện của tôi rằng ứng dụng của tôi đang sử dụng –

10

Điều này làm việc cho tôi bằng mã if (BuildConfig.DEBUG), sử dụng lớp BuildConfig. Đây là một mã an toàn và dễ thực hiện. Hãy cẩn thận khi sử dụng kiểu mã này. Không sử dụng nó sao cho có 2 nhánh mã riêng biệt khác nhau, giữa các phiên bản Phát hành và Gỡ lỗi. Nếu bạn làm như vậy, nó có thể làm mất hiệu lực kiểm tra ứng dụng cho phiên bản Release. Đối với tôi, tôi đã sử dụng nó chỉ để bỏ qua việc nhắn tin Log.

Thêm chi tiết về lớp học này BuildConfig @Build System Concepts.

+0

Hầu như không sử dụng CPU. Hoàn hảo. – romulof

+0

@OrB, tôi rất vui vì bạn và tôi nghĩ đó là lựa chọn tốt nhất cho Android Studio hiện đại. Tôi sẽ chỉnh sửa bài đăng của tôi kể từ bây giờ nó nên được sử dụng như là mã dễ nhất để làm. Cảm ơn vì đã chú ý và cho tôi một lời nhắc nhở. –

9

tôi đề nghị sử dụng inbuilt android API BuildConfig

if (BuildConfig.DEBUG) { 
    // do something for a debug build 
} 
Các vấn đề liên quan