2012-03-22 28 views
18

Tôi có một ứng dụng Android được tải xuống chủ yếu từ Android Market (hiện tại, Google Play). Chúng tôi đã thực hiện một vài chỉnh sửa đối với nguồn và cũng đã gửi tới Amazon App Store để xem loại lực hấp dẫn nào nhận được. Tôi hiện đang tìm kiếm một cách bền vững để phát triển từ một cơ sở mã phổ biến và chưa xây dựng để tôi có thể gửi cho cả hai/cả hai.Quản lý mã/bản dựng cho các cửa hàng ứng dụng Android (Google/Amazon/etc)?

Cửa hàng của Amazon có một số hạn chế về các API khả dụng và do đó tôi muốn xóa/sửa đổi các tính năng từ phiên bản đó. Vì Java không hỗ trợ việc biên dịch có điều kiện truyền thống, và có điều kiện bao gồm các tệp trong Eclipse không có vẻ tầm thường (thậm chí có thể không?), Tôi muốn hỏi những gì người khác đang làm để giải quyết vấn đề này.

Phải thừa nhận rằng, tôi không phải là chuyên gia Eclipse/Java nên tôi có thể thoải mái đi học với tôi.

Những gì tôi đang tìm kiếm trong một giải pháp:

  • Xây dựng/gỡ lỗi sử dụng Eclipse.
  • Tệp mã tĩnh, với môi trường/cài đặt chuyển sang kiểm soát nội dung cần tạo.
  • Không có mã trùng lặp hoặc logic có điều kiện trong mã để chọn dòng mã trong thời gian chạy

là cái gì đó bạn đã giải quyết cho các ứng dụng Android cụ thể, hoặc cho các dự án dựa trên Java/Eclipse khác? Đề xuất cho nơi để bắt đầu?

+1

Plugin Eclipse ADT có IMO vòng đời xây dựng không linh hoạt, không cung cấp nhiều tùy chọn cấu hình. Xem xét việc áp dụng một số công cụ xây dựng dòng lệnh như Ant và Maven, nơi bạn có thể có nhiều điều khiển vi mô hơn trong mỗi bước trong quá trình xây dựng (biên soạn, dexing, đóng gói và v.v.) – yorkw

Trả lời

0

Tôi chưa thực sự thử điều này, nhưng đó là điều tôi đã nghĩ đến.

Làm thế nào về việc sử dụng khả năng của Eclipse để liên kết đến các tệp từ thư mục bên ngoài vùng làm việc của bạn?

Bắt đầu với một dự án Eclipse: vì lợi ích của đối số, cho biết đó là phiên bản Google Play.

Bây giờ, hãy tạo một dự án thứ hai, bắt đầu bằng cách yêu cầu Eclipse liên kết (không sao chép) các tệp nguồn từ dự án đầu tiên của bạn.

Để phát triển dự án thứ hai, hãy thêm các lớp phân lớp dự án từ dự án gốc để nhận ra các sửa đổi của bạn. Đối với tài nguyên, bạn có thể sử dụng một số kết hợp bao gồm, ghi đè thuộc tính và bộ chọn.

Trường hợp không thể phân lớp hoặc mở rộng, thì rõ ràng bạn sẽ phải chỉ sao chép tệp nguồn gốc và hack vào tệp đó. Nếu bạn thực sự OCD về nó, bạn có thể chỉ cần duy trì một bản vá được thiết lập chứ không phải là một tập hợp toàn bộ các tập tin dư thừa.

Bạn nghĩ điều gì sẽ hoạt động?

+0

Duy trì các tệp trùng lặp, nhưng ngay cả khi đó là khắc phục không có bất cứ điều gì ở đây giúp với điều kiện cho phép/vô hiệu hóa các tính năng trong một trong hai hương vị của dự án (ngoại trừ thời gian chạy, mà không phải là một giải pháp tốt). Đó là một trong ba kịch bản chính mà tôi đang tìm cách giải quyết, và tôi không nghĩ rằng giải pháp này sẽ giúp. – psychotik

-1

Bạn có thể tạo hai dự án theo cách thủ công trong Eclipse trỏ đến cùng thư mục nguồn nhưng với bộ lọc bao gồm/loại trừ khác nhau và các thư mục đích khác nhau.

Sau đó, hai mục tiêu Ant sử dụng thuộc tính để chuyển các tệp bị loại trừ khỏi tệp javac đủ để tạo tệp jar tương ứng.

Mục đích là để có được một ứng dụng sạch cho mỗi mục tiêu, mà không cần bất kỳ mã nào từ một mục tiêu khác.

Với các tính năng được liệt kê là hành vi có thể cắm được trong tệp thuộc tính hoặc cấu hình XML, thời gian chạy của bạn sẽ tự điều chỉnh với việc bổ sung các mục nhập trình đơn.

+0

Có thể biết lý do bỏ phiếu xuống để tôi có thể cải thiện câu trả lời của mình không? –

+0

Tôi đã không downvote vì vậy tôi chỉ có thể suy đoán. Tôi không biết "các tính năng được liệt kê là hành vi có thể cắm được trong tệp thuộc tính hoặc cấu hình XML" có nghĩa là gì và tôi cũng không biết liệu các ứng dụng Android có phải là các ứng dụng Android không, nhưng tôi đoán điều đó không liên quan). Như OP mặc dù, tôi không có đầu mối làm thế nào để thực sự làm những gì bạn đang đề xuất (Eclipse mới làm quen ở đây) vì vậy tôi không thể đánh dấu điều này là câu trả lời hoặc. – psychotik

10

Đó là khá dễ dàng để làm trong các phiên bản mới nhất của ADT (phiên bản 17), mặc dù tôi không tìm thấy nó làm cho biên soạn còn một chút:

  1. Tạo một dự án Android mới (Proj-A)
  2. tới dự án-> Properties, chọn Android, và kiểm tra "là thư viện"
  3. Move tất cả các mã thông thường của bạn để Proj-A, nhập khẩu tất cả các thư viện cần thiết
  4. Tạo một dự án Android mới f hoặc Google Play (Proj-B)
  5. Tới dự án-> Properties, chọn Android, và thêm Proj-A cho Thư viện
  6. Lặp lại # 4 & 5 cho phiên bản Amazon

Nếu bạn có một số biến cần được đặt khác nhau cho từng dự án phụ (ví dụ: boolean GOOGLE_PLAY_VERSION để bật các chức năng cụ thể của Google Play), bạn phải tạo một dự án khác để chứa các giá trị này vì bạn không thể có dự án tham chiếu lẫn nhau theo cách thông tư. Bạn có thể giải quyết điều này bằng cách thêm các bước sau:

  1. Kéo tất cả các tiểu dự án biến cụ thể của bạn vào một hoặc nhiều lớp mà chỉ đóng vai trò như container (s) cho các biến
  2. Tạo một "dummy" Java dự án (giả)
  3. Config Proj-A để thêm một liên kết Nguồn mới vào thư mục bin của giả
  4. Thêm Lớp config trong mỗi tiểu dự án với những thay đổi dự án cụ thể
  5. Lợi nhuận!

Lưu ý rằng các biến trong giả nên không được thiết lập như là cuối cùng, nếu không nó sẽ ghi đè thiết lập của tiểu dự án.

Điều này có vẻ giống như một chút công việc phía trước, nhưng đã làm việc khá tốt cho tôi như xa như kiểm soát phiên bản đi.

Edit: Bây giờ với động thái của Google Android Studio & Gradle, nó có thể là tốt hơn để di chuyển đến rằng nếu bạn đang bắt đầu một dự án mới nếu bạn muốn hỗ trợ nhiều gói ứng dụng, xem dev Android trang web của Building Your Project with Gradle#Work with build variants. Nó chắc chắn không làm tổn thương để đánh giá tùy chọn đó trước khi quyết định.

+0

Điều này hoạt động tốt nhưng bạn phải duy trì các bản sao riêng biệt của tệp kê khai và nội dung được nhúng và sử dụng các tên gói khác nhau cho từng ứng dụng. – Twisted

+0

Đối với tệp kê khai, nó không phải là xấu vì nó không nên thay đổi rất thường xuyên khi ứng dụng của bạn được ổn định. Đối với các tên gói khác nhau, những gì tôi làm là: 1. Tạo lớp bao bọc cho mỗi Hoạt động/Dịch vụ tồn tại trong tệp kê khai bằng cách đơn giản mở rộng lớp Hoạt động ban đầu, 2. Tạo lớp ClassProvider chỉ đơn giản cung cấp phiên bản Lớp đúng. – Kai

+0

Ví dụ: nếu tên gói "cơ sở" của tôi là com.test với Hoạt động được gọi là 'com.test.MainActivity' và tôi có phiên bản có tên gói là' com.test.version_one', thì tôi sẽ tạo ' com.test.version_one.MainActivity' chỉ đơn giản là kéo dài 'com.test.MainActivity'. Và tất cả tôi sẽ tạo một lớp gọi là 'com.test.version_one.ClassProvider' bằng phương thức' public Class getMainActivity() 'với mã' return com.test.version_one.MainActivity.class'. Cuối cùng cho tất cả các trường hợp mà tôi cần MainActivity.class, tôi gọi 'com.test.version_one.ClassProvider.getMainActivity()' – Kai

1

Thật không may, đó là một quy ước trong Android để thay đổi dòng chảy trong thời gian chạy dựa trên những gì sẽ có trong C/C++ - biên soạn điều kiện đất.

Ứng dụng của chúng tôi phải duy trì hành vi khác nhau cho các cấp API khác nhau, vì vậy chúng tôi đã tạo một số hằng số cấp ứng dụng được khởi tạo tĩnh dựa trên thông tin cấp API có sẵn cho chúng tôi và được sử dụng trong suốt mã. Đây là cách Google thực hiện mọi thứ trong ví dụ của họ (ví dụ: xem thư viện tương thích ActionBarCompat và đặc biệt là phương pháp nhà máy được sử dụng here).

Bạn có thể tạo một CustomBuild giao diện, và thực hiện nó trong AmazonBuild và GooglePlayBuild, sau đó sử dụng một getBuild tĩnh() phương pháp để chuyển đổi chức năng khi cần thiết:

if(getBuild().shouldEnableFeatureX()){ 
    doStuff(); 
} else { 
    doDifferentStuff(); 
} 

Sau đó, tất cả các bạn phải lo lắng về việc chuyển giữa các bản dựng là một dòng hoặc hai mã trong nhà máy cùng với việc duy trì những thứ bạn muốn được bật trong phiên bản nào. Hoặc bạn có thể bao gồm một phiên bản khác của lớp tĩnh CustomBuild cho mỗi bản dựng.

Tôi sắp xếp lại đề xuất của những người khác ở trên: chuyển sang thứ gì đó như Maven để xây dựng; nó sẽ làm cho cuộc sống của bạn dễ dàng hơn nhiều khi bạn đã thiết lập nó. Tôi cũng sẽ nói rằng bạn nên đặt cốt lõi của ứng dụng thành thư viện như được đề xuất ở trên và có hai mô-đun khác nhau (một cho amazon, một cho cửa hàng chơi) phụ thuộc vào thư viện nhưng mỗi chỉ chứa một tập tin nhà máy tùy chỉnh (hoặc chỉ là một lớp tĩnh cho mỗi loại xây dựng có chứa cùng một "tôi nên làm điều này?" phương pháp ... một khi bạn có cơ sở hạ tầng nó chỉ là một vấn đề ưu tiên).

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