2010-11-16 17 views
8

Tôi có rất nhiều Log.i Log.d Log.e trong mã của tôi cho một ứng dụng gần đây tôi đã thực hiện. Tôi sắp xuất bản ứng dụng này và tôi không thực sự muốn mọi người nhìn thấy nó khi họ cắm điện thoại vào adb, nhưng tôi muốn nó ở đó để gỡ lỗi của riêng tôi.android.util.Log khi xuất bản - tôi có thể làm gì/không làm

Tôi muốn mở rộng android.util.log và chỉ cần chuyển đổi boolean trong đó để tôi có thể tắt nhật ký khi xuất bản và bật lên khi phát triển nhưng lớp này là cuối cùng, tôi có thiếu mẹo không ?

Tôi không thực sự muốn đi qua mã của tôi một loại bỏ tất cả, đúng nếu tồi tệ nhất đến tồi tệ nhất tôi có thể làm một ctrl + h toàn cầu thay thế Log for // Log nhưng điều đó không hút như một câu trả lời.

Tôi cũng nhận ra rằng Log.d bị loại bỏ trong thời gian chạy nhưng nó vẫn chạy (mất một hiệu suất nhỏ) vì vậy không chạy này sẽ là một tiền thưởng thêm. Vâng, về cơ bản, tôi đang tìm cách chuyển đổi và gỡ lỗi theo chương trình, điều này cũng có thể cho phép tôi sau này biến nó thành sở thích hoặc thứ gì đó nếu mọi người muốn xem hoặc trợ giúp và gửi nó lên .

Các bạn thực hiện điều gì cho điều này?

Cảm ơn

Trả lời

16

Vì Octavian chỉ ra việc chèn hằng số ghi nhật ký sẽ là cách tốt nhất để thực hiện việc này. Viết một lớp mới cho điều này gọi các phương thức ghi nhật ký ban đầu nếu việc gỡ lỗi được kích hoạt không phải là một ý tưởng hay.

Thói quen tốt:

if (C.D) { Log.d(C.T, "your log text here " + foo + bar); } 

dở:

YourLog.d("your log text here " + foo + bar); 

// and in YourLog.java's d() method: 
... { if (debugging) Log.d(tag, text); } 

Các giải pháp đầu tiên là rất nhanh nếu D liên tục của lớp C là sai. Nếu bạn có các hoạt động chuỗi phức tạp để tạo chuỗi ghi nhật ký của bạn, chúng sẽ không được thực thi nếu việc gỡ lỗi được hủy kích hoạt. Trình biên dịch thậm chí có thể loại bỏ các hoạt động này tại thời gian biên dịch nếu D là sai, điều này có thể dẫn đến chi phí thời gian chạy bằng không. Giải pháp thứ hai (xấu) sẽ luôn xây dựng toàn bộ chuỗi và gọi một phương thức, đó là chi phí mà bạn không cần.

Nói chung giải pháp đầu tiên sẽ là tốt nhất. Và có, tôi thực sự gọi lớp và các thành viên C, D và T (Hằng số/Gỡ lỗi/Thẻ) - vì lý do hiệu suất trong khi gõ. ;-)

+1

Ah vâng, tôi đã có một nhập khẩu tĩnh ở đầu lớp của tôi, và sẽ làm gì nếu (D) Log.d .... Cảm ơn xâm nhập tối thiểu và chuyển đổi tốt đẹp! – Blundell

+4

Tôi đã bình chọn câu trả lời này nhưng cũng đáng nói rằng với Proguard được tích hợp độc đáo trong quá trình xây dựng Eclipse của Eclipse trong những ngày này, "thực hành xấu" khi sử dụng 'YourLog.d()' có thể tốt: chỉ cần thêm 'YourLog.d() 'vào danh sách những thứ bị Proguard tước đi. – ahcox

+1

Cũng đáng để chỉ ra rằng khi bạn xây dựng, một lớp BuildConfig được tạo ra với cờ DEBUG được đặt thành false cho các bản phát hành (ví dụ, được xây dựng với "ant release" Đó có thể là CD trong trường hợp này – frenziedherring

2

xáo trộn sử dụng Proguard như Proguard có lệnh sử dụng để lọc nó ra khi bạn viết file..nice Proguard cấu hình của bạn và đơn giản và nó hoạt động

+1

Tôi muốn làm điều này, chỉ cần không bao giờ nhìn vào proguard với android nghe nó khá dính, là của eclipse plugin :-p Plus điều này sẽ không cho phép tôi bật tắt và tắt, nếu nói người dùng đã tìm thấy lỗi. – Blundell

2

Nói chung đây là một thói quen tốt để không bao gồm chúng trong mã phân phối của bạn theo bất kỳ cách nào vì chúng sẽ cần phải được xử lý chỉ dẫn đến việc xả pin không cần thiết.

Bạn có thể đặt boolean trong ứng dụng của mình ở đâu đó để chỉ ra việc phát triển hoặc phát hành phiên bản mã của bạn và có rất nhiều khối kiểm tra cờ và thực thi mã đăng nhập của bạn hay không.

Bạn nên loại bỏ chúng sau khi bạn không còn cần đến chúng nữa.

Các vấn đề liên quan