2012-09-17 53 views
7

Trong C++, tôi thường thiết lập 2 bản dựng - gỡ lỗi và giải phóng với mỗi lần có DEBUGRELEASE được xác định trước tương ứng. Sau đó, tôi sẽ sử dụng các định nghĩa này để xác định các giá trị không đổi, như ghi nhật ký đã bật/tắt, URL máy chủ và v.v.Bản phát hành gỡ lỗi phát hành cho ứng dụng Android

Ngay bây giờ, trong Java/Android tôi nhận xét một số nội dung trước khi phát hành. Đó không phải là cách tốt, tôi có thể nói. Tôi có thể quên điều gì đó.

Thực tiễn phổ biến để đảm bảo không có gì bị lãng quên khi xây dựng một phiên bản phát hành (đã ký) hoặc phiên bản gỡ lỗi (chưa ký)?

Trả lời

8

Không có (theo mặc định) bất kỳ tiền xử lý cho Java, vì vậy không có thứ #ifdef tại thời gian biên dịch. Nhưng nếu bạn không nhớ để lại debug code trong ứng dụng của bạn, sau đó bạn có thể kiểm tra nếu ứng dụng được phát hành hoặc gỡ lỗi khi chạy với mã này:

Boolean release = (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE); 

mà kiểm tra debuggable giá trị cờ. Và ô được cho là tự động được đặt thành false cho các bản dựng bản phát hành và true để gỡ lỗi các bản dựng.

Nếu bạn muốn loại bỏ một số mã gỡ lỗi, bạn có thể thử sử dụng ProGuard để loại bỏ một số lớp hoặc phương pháp nhất định. Và theo mặc định ProGuard chỉ tham gia vào quá trình xây dựng để phát hành bản dựng.

+3

Tôi khuyên bạn nên sử dụng BuildConfig.DEBUG vì điều này xảy ra trong thời gian biên dịch, giải pháp của bạn hoạt động trong thời gian chạy. Mã đăng nhập sẽ nằm trong gói. Vào thời gian biên dịch, trình biên dịch java sẽ không lấy mã bên trong if-statement vào tài khoản. –

+0

Vui lòng kiểm tra câu trả lời cập nhật của tôi. Điều này sẽ làm rõ rằng đó là sự thật =) –

+0

Bạn cũng có thể muốn xem xét việc xác định toàn bộ 'public static final boolean boolean DEBUG = false;' để kiểm soát tốt hơn kết quả ... (đã có sự cố trong đó 'BuildConfig.DEBUG 'không thực sự phản ánh trạng thái của hệ thống). –

14

Nếu bạn đang chạy ứng dụng từ Eclipse, nó sẽ luôn là một bản sửa lỗi.

Khi bạn xuất các ứng dụng (Android Tools -> Export (un) đã ký Application Package)

Nếu bạn muốn biết động nếu phát hành hoặc gỡ lỗi của nó, bạn có thể sử dụng BuildConfig.DEBUG (nằm của nó trong gen thư mục, tôi không biết nếu điều này được hỗ trợ bởi tất cả các cấp độ API)

giống như như sau:

if (BuildConfig.DEBUG) { 
    Log.d(TAG, "Text"); 
} 

Nếu bạn nhìn vào bytecode tạo ra bạn sẽ thấy như sau (Trong chế độ debug):

public class Sample{ 

    private static final boolean LOG_ENABLED = true; 

    public static void main(String args[]){ 
     if (BuildConfig.DEBUG){ 
      System.out.println("Hello World"); 
     } 
    } 
} 

Tạo các bytecode sau:

public class Sample extends java.lang.Object{ 
    public Sample(); 
     Code: 
     0: aload_0 
     1: invokespecial #1; //Method java/lang/Object."<init>":()V 
     4: return 

    public static void main(java.lang.String[]); 
     Code: 
     0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 
     3: ldC#3; //String Hello World 
     5: invokevirtual #4; //Method Java/io/PrintStream.println(Ljava/lang/String;)V 
     8: return 

} 

Và nếu BuildConfig.DEBUG là sai

public class Sample extends java.lang.Object{ 
    public Sample(); 
     Code: 
     0: aload_0 
     1: invokespecial #1; //Method java/lang/Object."<init>":()V 
     4: return 

    public static void main(java.lang.String[]); 
     Code: 
     0: return 
} 
0

Tôi thường tạo ra một lớp bản ghi riêng biệt, nơi tôi đặt một biến DEBUG tĩnh. Bây giờ tất cả tôi cần phải đi trước khi nhận được một xây dựng sản xuất là để thiết lập rằng biến DEBUG sai.

public class Log { 
    public final static String LOGTAG = "APP NAME"; 

     public static final boolean DEBUG = true; 

     public static void v(String msg) { 
     android.util.Log.v(LOGTAG, msg); 
     } 

     public static void e(String msg) { 
     android.util.Log.e(LOGTAG, msg); 
     } 

     public static void d(String msg) { 
      android.util.Log.d(LOGTAG, msg); 
     } 
} 

Đối với khai thác gỗ -

if(Log.DEBUG) Log.v("In some function x. Doing y."); 
+0

Tôi có 6 hằng số ghi nhật ký trong đối tượng ghi nhật ký của mình. Tôi đặt 2 trong số đó thành false khi tạo bản phát hành. – Pijusn

0

Tôi đã gặp phải vấn đề tương tự như mọi khi tôi đang chạy dự án dưới dạng ứng dụng Android mà nó đã sử dụng để mở trong chế độ trình gỡ lỗi nhưng sau đó sự cố đã được giải quyết.

-Nếu bạn đang làm việc trong nhật thực, bạn phải sử dụng phối cảnh Java EE -Đặt chỉ cần chọn phối cảnh Java.

-Clean ứng dụng của bạn. -uninstall ứng dụng từ thiết bị. -Khởi động lại thiết bị của bạn (Chỉ cần như vậy để không có bộ nhớ cache nào được lưu trữ) -Run ứng dụng của bạn.

Chế độ trình gỡ lỗi sẽ không hiển thị thời gian này. Sao chép apk được tạo ra trong thư mục bin của bạn và thử nó ra trên các thiết bị khác cũng

0

Tôi tìm thấy một cách để decently thi đua một chỉ thị tiền xử lý:

Trong Gradle tôi buildTypes tôi xác định:

release { 
    buildConfigField "boolean", "isDebug", "false" 
    ... 
} 

debug { 
    buildConfigField "boolean", "isDebug", "true" 
    ... 
} 

sau đó, trong mã của tôi, tôi làm như sau:

if (BuildConfig.isDebug) { 
    ... do debug stuff ... 
} 

và nếu cần thiết, tất nhiên:

012.
else { 
    ... do release stuff ... 
} 

Cả hai khối có mặt trong debug apk, nhưng khi xây dựng một phiên bản release, Proguard là đủ thông minh để xác định rằng khối debug thể được gỡ bỏ vì nó phụ thuộc của một if (false) (mà cũng được lấy ra từ mã kết quả).

bạn nên gọi một số lớp debug-cụ thể từ các khối debug và chỉ từ đó, họ sẽ được tước ra từ kết quả APK khi họ được coi là chưa sử dụng, và điều này cũng là một điểm thú vị: mã của bạn không thể được tôi luyện theo cách nó sẽ sử dụng mã đó.

Tôi có thể xác định tất cả điều đó bằng cách kiểm tra các tệp đầu ra dump, mappingusage Proguard của mình.

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