2013-03-29 8 views
9

Gần đây tôi đã bắt đầu tìm hiểu về phát triển ứng dụng Android. Đây cũng là kinh nghiệm đầu tiên của tôi với ngôn ngữ Java.Phân biệt gỡ lỗi và xây dựng sản phẩm của ứng dụng Android

Có một số công cụ gỡ lỗi mà tôi muốn kết hợp vào phát triển ứng dụng của mình dưới dạng phụ thuộc gói Java. Vì những lý do hiển nhiên, tôi muốn bao gồm nó chỉ để gỡ lỗi xây dựng.

Trong iOS, chúng tôi có thể sử dụng cấu hình xây dựng để liên kết với các thư viện gỡ lỗi chỉ để gỡ lỗi xây dựng và sử dụng macro để xóa các phần mã liên quan đến gỡ lỗi. Điều này làm cho nó thực sự dễ dàng để chuyển đổi giữa gỡ lỗi và xây dựng sản xuất. Dù sao để đạt được như vậy cho Android? Cho đến nay, gần nhất tôi nhận được là sử dụng hồ sơ Maven để ghi đè lên các tập tin thuộc tính, được tải bởi ứng dụng, nhưng điều này đòi hỏi rằng các thư viện gỡ lỗi vẫn được nhập khẩu.


Để làm rõ câu hỏi của tôi, đây là những gì tôi muốn làm: tôi đã xây dựng một thư viện mà sẽ cho phép bạn duyệt qua cơ sở dữ liệu SQLite trên trình duyệt của bạn. Nó thực sự hữu ích cho mục đích gỡ lỗi, nhưng tôi không muốn gửi ứng dụng của tôi với thư viện.

Mục đích khác là sử dụng HockeyApp. HockeyApp cung cấp hai tính năng: Cập nhật thông báo và báo cáo sự cố. Tôi cần ba khác nhau được xây dựng để làm việc này:

  • sản xuất: Crash báo cáo On, Cập nhật thông báo Tắt
  • Beta: Cả On
  • gỡ lỗi: Cả Tắt

Trả lời

1

Ngoài Maven, một cách là sử dụng bộ phun phụ thuộc như Dagger

Bằng cách xây dựng chú thích javax.inject tiêu chuẩn (JSR-330), mỗi clas s là dễ dàng để kiểm tra. Bạn không cần một loạt các boilerplate chỉ để trao đổi RpcCreditCardService ra cho một FakeCreditCardService.

Tiêm phụ thuộc không chỉ để thử nghiệm. Nó cũng làm cho nó dễ dàng để tạo ra các mô-đun có thể tái sử dụng, hoán đổi cho nhau. Bạn có thể chia sẻ cùng một AuthenticationModule trên tất cả các ứng dụng của mình. Và bạn có thể chạy DevLoggingModule trong quá trình phát triển và ProdLoggingModule trong sản xuất để có được hành vi đúng trong từng tình huống.

+0

Điều đó hữu ích để thử nghiệm nhưng tôi hỏi về ứng dụng thực tế. Tôi muốn xây dựng nhà phát triển, xây dựng thử nghiệm QA và xây dựng sản phẩm. –

+0

Tôi đã cập nhật câu trả lời của mình. Nó chủ yếu là một bộ tạo mã. Với nó, bạn có thể tạo một bản dựng cho các nhà phát triển, một để gỡ lỗi, một cho QA, một cho sản xuất, v.v. –

+0

@StephanBranczyk chính xác như thế nào? Nó tạo ra mã để tiêm phụ thuộc nhưng tôi không thấy làm thế nào bạn có thể nói nó để sử dụng phụ thuộc khác nhau trong môi trường xây dựng khác nhau. Bạn có thể xây dựng một chút không? – dcow

4

Trong tệp kê khai <application>, bạn có thể đặt thuộc tính debuggable. Eclipse thực hiện điều này cho bạn tự động nếu bạn bỏ qua thuộc tính. Các bản dựng gỡ lỗi có debuggable=true, các bản dựng được xuất khẩu tốt có debuggable=false.

này ảnh hưởng đến Log.d, và bạn có điều kiện có thể kiểm tra trong mã sử dụng như sau:

boolean isDebuggable = (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE)); 
0

Bạn đã sử dụng BuildConfig.DEBUG, điều này được tạo ra bởi công cụ adt android

/gen/BuildConfig

+0

Đây có lẽ là câu trả lời gần nhất. Tôi chỉ muốn nó linh hoạt hơn. –

+0

Một người khác đề cập đến proguard, loại bỏ các lớp không sử dụng. Sự kết hợp của 'BuildConfig' và proguard có thể loại bỏ các lớp gỡ rối chỉ, nhưng tôi không thích sự không chắc chắn. –

1

Một cách để giải quyết vấn đề này là kiểm tra giá trị trả lại của PackageManager#getInstallerPackageName. Nó trả về null nếu gói ứng dụng được cài đặt thủ công thông qua adb, thông qua trang web hoặc thông qua dịch vụ như HockeyApp.Trong thực tế, gần đây tôi đã thêm một kiểm tra tương tự cho sdk của chúng tôi, xem this commit.

Lưu ý rằng giải pháp này chỉ đáng tin cậy nếu bạn chỉ phân phối ứng dụng (có trả tiền) của mình mặc dù Google Play. Lần cuối cùng tôi kiểm tra, các cửa hàng thay thế như Amazon App Store hoặc AndroidPIT không đặt nguồn cài đặt (có thể đặt nó từ cấp API 11, xem PackageManager#setInstallerPackageName).

Tùy chọn khác là kiểm tra tên gói khi chạy. Đối với bản dựng beta của bạn, bạn sẽ thêm ".beta" vào tên gói và sau đó kiểm tra hậu tố này để bật cập nhật trong ứng dụng hoặc công cụ gỡ lỗi. Bạn có thể làm điều này bằng cách di chuyển cơ sở mã của bạn thành một dự án thư viện và thiết lập hai dự án ứng dụng tham chiếu dự án thư viện này: một dự án cho ứng dụng cửa hàng, một cho ứng dụng beta. Sử dụng aapt của chúng tôi với tùy chọn --rename-manifest-package để thay đổi tên gói của bản dựng beta (xem chi tiết here).