2010-01-15 36 views
35

Tôi đã đọc tài liệu xuất bản của Android và họ đã nói để xóa tất cả các cuộc gọi Đăng nhập khỏi mã của tôi. Tôi có một số cuộc gọi đến e.printStackTrace() trong mã của tôi có thể được in như một phần của hoạt động bình thường của chương trình của tôi (ví dụ: nếu một tệp chưa tồn tại).Tôi có nên xóa e.printStackTrace() khỏi mã của tôi trước khi xuất bản

Tôi cũng nên xóa các cuộc gọi này?

Trả lời

43

Bạn không nên sử dụng e.printStackTrace() trực tiếp nào — làm như vậy sẽ gửi các thông tin cho log Android mà không hiển thị những ứng dụng (log thẻ) nó đến từ đâu.

Như những người khác đã đề cập, tiếp tục nắm bắt số Exception được đề cập, nhưng sử dụng một trong các phương pháp android.util.Log để ghi nhật ký. Bạn có thể đăng nhập chỉ được thông báo, nhưng không phải là vết đống, hoặc sử dụng tiết đăng nhập cho stack trace:

try { 
    Object foo = null; 
    foo.toString(); 
} catch (NullPointerException ex) { 
    Log.w(LOG_TAG, "Foo didn't work: "+ ex.getMessage()); 
    Log.d(LOG_TAG, Util.stackTraceWriter(ex)); 
} 

Bạn nên dải DEBUG hoặc VERBOSE thông điệp đăng nhập từ sản xuất của bạn được xây dựng. Cách dễ nhất là use ProGuard to remove Log.[dv] calls từ mã của bạn.

+11

có vẻ như 'Util.stackTraceWriter' không còn ở đó nữa. Dù sao có ['Log.getStackTraceString'] này (http://developer.android.com/reference/android/util/Log.html#getStackTraceString%28java.lang.Throwable%29) – superjos

+0

Bạn không được phép sử dụng Nhật ký khi bạn muốn xuất bản ứng dụng! –

+0

@SoheilSetayeshi Điều gì khiến bạn nghĩ vậy? Kiểm tra nhật ký điện thoại của bạn; bạn sẽ thấy nhiều nhật ký từ các ứng dụng đã cài đặt. –

0

theo ý kiến ​​khiêm tốn của tôi (tôi không phải là một nhà phát triển Android)

Nó sẽ được tốt đẹp. Tôi không biết các tùy chọn đăng nhập cho Android nhưng tôi chắc chắn rằng bạn có một số điều cấu hình để xuất (hoặc không) dấu vết của bạn.

Và nếu bạn không làm printStackTrace() Android sẽ không thực hiện công việc dơ bẩn khi bỏ qua nó.

:)

Nó chỉ là một cảm giác tốt (kiểu).

+0

Tôi đã hiểu rằng Android bỏ qua nó ... có đúng không? – helios

3

Nếu bạn cho phép ngoại lệ truyền bá lên hệ điều hành thì HĐH sẽ ghi nhật ký và cũng bật lên cửa sổ Đóng lực, tiêu diệt ứng dụng của bạn. Nếu bạn bắt được nó, thì bạn có thể ngăn không cho ứng dụng của bạn bị đóng.

Nếu bạn muốn người dùng của bạn có khả năng gửi cho bạn lỗi mà họ đang nhận được, sau đó tôi sẽ đăng nhập theo dõi ngăn xếp. Sau đó, họ có thể gửi cho bạn nhật ký qua một ứng dụng như Log Collector.

Nếu bạn muốn tránh khả năng hiển thị thông tin theo dõi ngăn xếp của mình cho người dùng, hãy nắm bắt ngoại lệ và không đăng nhập.

2

Tôi sẽ sử dụng lớp Đăng nhập để đặt thông báo. Đối với nhật ký mà bạn nghĩ là quan trọng để ở lại trong ứng dụng - hãy sử dụng Log.i để cảnh báo lỗi - Log.e Log.w Để bạn gỡ lỗi Log.d - và bạn có thể tắt dựa trên ứng dụng của bạn đang gỡ lỗi chế độ.

http://developer.android.com/reference/android/util/DebugUtils.html

1

Vâng printStackTrace() sẽ đăng nhập vào hệ điều hành, gây andorid (hoặc máy tính) ứng dụng của bạn để chấm dứt (bắt buộc đóng), thay vào đó, làm một cái gì đó như thế này:

public void nullPointerExceptionCauser() 
{ 
     try 
     { 
      Object example = null; 
      example.toString(); 
     } 
     catch (Exception e) 
     { 
      Logger.log(Level.SEVERE, "Caught Exception: {0}", e.getStackTrace()); 
     } 
} 
-1

Sử dụng này để loại bỏ các bản ghi từ bản phát hành apk

if (BuildConfig.DEBUG) Log.d(TAG, "your meseage"); 
0

Nếu bạn muốn bảo mật tức làkhông cho phép bất cứ ai rình mò để đọc các bản ghi ngoại lệ bạn có thể làm một cái gì đó giống như

private void hideExceptionsInReleaseMode() 
{ 
    final Thread.UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler(); 

    if(!BuildConfig.DEBUG) 
    { 
     Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() 
      { 
       @Override 
       public void uncaughtException(Thread thread, Throwable ex) 
       { 
        defaultHandler.uncaughtException(thread, new RuntimeException("Something went wrong :p")); 
       } 
      }); 
    } 
} 
0

Để sử dụng printStackTrace một cách an toàn hơn Tôi sẽ sử dụng StringWritePrintWriter:

... 
catch (final Exception e) 
{ 
    final StringWriter sw = new StringWriter(); 
    final PrintWriter pw = new PrintWriter(sw); 
    e.printStackTrace(pw); 
    Log.e("TAG", sw.toString()); 
} 

Hoặc cách khác:

catch (final Exception e) 
{ 
    Log.e(TAG, Log.getStackTraceString(e)); 
} 
Các vấn đề liên quan