Tôi có một ứng dụng sử dụng nhiều lệnh Log.d()
hoặc Log.e()
để gỡ lỗi. Bây giờ tôi muốn tạo gói cuối cùng để phát hành. Tính năng Xuất của Android từ Eclipse đề cập đến việc xóa cờ "Debuggable"
trong tệp kê khai mà tôi đã thực hiện. Tôi có nên bình luận tất cả các cuộc gọi Log
để cải thiện hiệu suất của ứng dụng của tôi hoặc các cuộc gọi này sẽ không làm gì trong gói phiên bản cuối cùng không thể gỡ lỗi?Tôi có nên nhận xét các cuộc gọi đăng nhập khi tạo gói cuối cùng của mình không?
Trả lời
Tôi đã phân lớp lớp Log thành một lớp có tên Trace, phản ánh các phương thức trên Nhật ký. Vì vậy, tôi làm Trace.d (TAG, "blah") và sau đó trong phương thức Trace.d mã chỉ thực thi dựa trên biến lớp cuối cùng tĩnh gọi là LOGGING_LEVEL, có mức 1-5 (không, chỉ lỗi, lỗi & cảnh báo , lỗi & cảnh báo & thông tin và mọi thứ bao gồm gỡ lỗi). Khi sản xuất APK sản xuất, Proguard sẽ xóa tất cả mã không được sử dụng trong ứng dụng, vì vậy nó sẽ làm cho tôi.
Đối với tôi, việc ghi nhật ký quá quan trọng để xóa khỏi nguồn, nhưng nó phải bị xóa khỏi ứng dụng sản xuất, vì lý do hiệu suất, an toàn và sở hữu trí tuệ.
Cấu trúc này cho phép tôi để thêm ghi THÊM rất nhiều đến các ứng dụng, mà làm cho vấn đề gỡ lỗi dễ dàng hơn nhiều, nhưng không có tác động nào đến việc sản xuất APK
public class Trace
{
public static final int NONE = 0;
public static final int ERRORS_ONLY = 1;
public static final int ERRORS_WARNINGS = 2;
public static final int ERRORS_WARNINGS_INFO = 3;
public static final int ERRORS_WARNINGS_INFO_DEBUG = 4;
private static final int LOGGING_LEVEL = ERRORS_ONLY; // Errors + warnings + info + debug (default)
public static void e(String tag, String msg)
{
if (LOGGING_LEVEL >=1) Log.e(tag,msg);
}
public static void e(String tag, String msg, Exception e)
{
if (LOGGING_LEVEL >=1) Log.e(tag,msg,e);
}
public static void w(String tag, String msg)
{
if (LOGGING_LEVEL >=2) Log.w(tag, msg);
}
public static void i(String tag, String msg)
{
if (LOGGING_LEVEL >=3) Log.i(tag,msg);
}
public static void d(String tag, String msg)
{
if (LOGGING_LEVEL >=4) Log.d(tag, msg);
}
}
Từ developer.android.com:
Tắt khai thác gỗ và gỡ lỗi và dọn dẹp dữ liệu/file Đối với phát hành, bạn nên chắc chắn rằng cơ sở vật chất debug được tắt và sửa lỗi đó và khác không cần thiết dữ liệu/tệp được xóa khỏi dự án ứng dụng của bạn.
Xóa thuộc tính android: debuggable = "true" từ yếu tố của tệp kê khai. Xóa nhật ký tệp, tệp sao lưu và các tệp không cần thiết khác từ ứng dụng . Kiểm tra riêng tư hoặc dữ liệu độc quyền và xóa dữ liệu đó là cần thiết. Tắt mọi cuộc gọi tới các phương thức Log trong mã nguồn.
Tôi sẽ không quá nghiêm ngặt để loại bỏ tất cả đăng nhập, nhưng gỡ lỗi đăng nhập chắc chắn. –
Tôi đã thấy thông tin đó trên trang web android dev nhưng không rõ ràng với tôi nếu có một cơ chế để "Tắt ghi nhật ký" ngoài việc nhận xét mọi thứ. Ngoài ra, khi họ nói "Hủy kích hoạt bất kỳ cuộc gọi nào để đăng nhập các phương pháp trong mã nguồn" nó không phải là rõ ràng nếu họ có nghĩa là "bình luận" hoặc nếu có một cách khác. – jmbouffard
Tôi tự hỏi những gì hypocrite đã viết điều đó? nhật ký Android đầy 98% tin nhắn từ các ứng dụng và dịch vụ Android gốc. có lẽ những gì họ có nghĩa là "vô hiệu hóa tất cả các bạn đăng nhập để nó sẽ không lộn xộn các bản ghi khi chúng tôi muốn tìm thông điệp tường trình của chúng tôi." –
Điều này làm tôi kiểm tra giả thuyết của tôi rằng log.d
dòng trong mã sẽ bằng cách nào đó không xuất hiện trên một gói ứng dụng phát hành ký kết mà không có cờ debuggable đặt trong manifest, tôi đã sai, họ vẫn xuất hiện.
Một tìm kiếm nhanh trên SO dẫn tôi đến câu trả lời chấp nhận cho câu hỏi này: Remove all debug logging calls before publishing: are there tools to do this?
Nó hoạt động rất tốt và bạn không cần phải thay đổi bất kỳ mã.
Dường như là một giải pháp tốt nhưng tôi không chắc chắn nếu tôi muốn sử dụng Proguard. – jmbouffard
@jmbouffard: Nếu bạn đã sử dụng Ant để xây dựng gói phát hành, thì việc thêm Proguard là khá đơn giản, vì đã có một mục tiêu trong tệp main_rules.xml của SDK. Nếu bạn không quen thuộc với Ant, thì tôi đồng ý, nó có thể hơi đau. – NickT
tôi sẽ loại bỏ các mã đăng nhập như sau:
-assumenosideeffects class android.util.Log {
public static boolean isLoggable(java.lang.String, int);
public static int v(...);
public static int i(...);
public static int w(...);
public static int d(...);
public static int e(...);
public static java.lang.String getStackTraceString(java.lang.Throwable);
}
-assumenosideeffects class java.lang.Exception {
public void printStackTrace();
}
-assumenosideeffects class * implements org.slf4j.Logger {
public void trace(...);
public void debug(...);
public void info(...);
public void warn(...);
public void error(...);
public boolean isTraceEnabled(...);
public boolean isDebugEnabled(...);
public boolean isInfoEnabled(...);
public boolean isWarnEnabled(...);
public boolean isErrorEnabled(...);
}
Nếu được yêu cầu, lỗi và danh mục cảnh báo có thể được giữ lại.Nhưng hãy chắc chắn rằng tối ưu hóa và thu hẹp được kích hoạt cho việc xây dựng chỉ sau đó việc loại bỏ mã có hiệu lực
- 1. Tôi có nên khôi phục các cuộc gọi RPC của mình qua HTTP không?
- 2. Trong Subversion, tôi có thể là người dùng không phải tên đăng nhập của mình không?
- 3. Khi viết gói R của riêng tôi, tôi dường như không thể nhận các gói khác để nhập chính xác
- 4. Lớp học của tôi có nên đăng ký các sự kiện công khai của riêng mình không?
- 5. Tôi có nên sử dụng cùng tên gói trong cả ứng dụng iOS và Android của mình không?
- 6. Tôi có nên gọi các cuộc gọi đến Debugger.Log() trong #if (DEBUG) không?
- 7. Tôi có thể buộc ngắn mạch của riêng mình trong một cuộc gọi phương thức không?
- 8. Khi nào tôi nên sử dụng Gói-Nhập khẩu và khi nào tôi nên sử dụng Yêu cầu-Gói?
- 9. Khi nào tôi nên sử dụng cuối cùng-block trong Java try-catch-cuối cùng
- 10. Bạn thích nhận xét của mình như thế nào?
- 11. Tôi có nên tạo từng lớp trong tệp .py của riêng mình không?
- 12. Với mã delphi nào tôi nên thay thế các cuộc gọi của mình sang phương thức TThread không được chấp nhận Tạm ngưng?
- 13. Tôi có cần gọi các cuộc gọi MessageBox không?
- 14. Các lớp học cuối cùng trong Java không nên là cuối cùng hoặc ngược lại?
- 15. Tôi nên định dạng dữ liệu của mình cho gói mlog như thế nào?
- 16. Tôi có nên luôn làm cho phương pháp của mình tĩnh khi có thể không?
- 17. Tôi có nên sử dụng số nhận dạng khối ("kết thúc;") trong mã của mình không?
- 18. Tôi có nên xem xét PTX để tối ưu hóa hạt nhân của mình không? Nếu vậy, làm thế nào?
- 19. Facebook og: loại thẻ meta - tôi có nên tạo trang của riêng mình không?
- 20. Tôi có nên lưu trữ dịch vụ WCF của mình trong IIS không?
- 21. Quay lại Url cuối cùng được nhập sau khi đăng nhập thành công vào YII
- 22. Tại sao tôi nên ký các tệp JAR của mình?
- 23. Tôi có nên gộp các thư viện C bằng ứng dụng Python của mình không?
- 24. Tôi có nên sử dụng công cụ sửa đổi "cuối cùng" khi tạo đối tượng Ngày không?
- 25. Các lớp API nội bộ của tôi có nên là tất cả trong một gói không?
- 26. Tôi có nên trộn lẫn mã an toàn với mã không an toàn của mình không?
- 27. Làm cách nào để loại bỏ các cuộc gọi ghi nhật ký bằng Python mà không nhận xét chúng?
- 28. Rails 3 cách tốt nhất để tạo hệ thống nhận xét cho các bài đăng
- 29. Tôi nên đặt mocks của mình ở đâu?
- 30. Tôi làm cách nào để kết nối các cuộc gọi phương thức của mình?
Tôi nghĩ rằng điều này đã được bao gồm trong lớp Đăng nhập của Android. Tại sao chúng ta không thể làm Log.setLogLevel (Log.ERROR)? Nếu không giải pháp của bạn có vẻ thực sự tốt. – jmbouffard
"không ảnh hưởng đến APK sản xuất" ... sai. đây là một mô hình chống nổi tiếng. vấn đề là đối số msg luôn luôn được đánh giá có hay không bạn thực sự đăng nhập tin nhắn. ví dụ Trace.e ("blah", "error was:" + error.getCode() + ", ruh roh!"). cho dù bạn có đăng nhập hay không, có ba chuỗi ký tự tạm thời được tạo và hai cuộc gọi phương thức thừa. –
@jmbouffard Không có phương pháp nào trên Nhật ký gọi là setLogLevel() –