2011-06-02 44 views
9

Gần đây tôi đã bắt đầu bán ứng dụng Android của mình trên Google Android Market và triển khai chương trình cấp phép ứng dụng của họ để ngăn chặn việc sử dụng trái phép ứng dụng của tôi. Tôi hiện đang lên kế hoạch phát hành nó cho Amazon Android App Store, và muốn biết cách tốt nhất để duy trì hai phiên bản ứng dụng của tôi: một ứng dụng thực hiện Cấp phép Android và một ứng dụng khác không thực hiện.Tôi làm cách nào để có thể hỗ trợ ứng dụng Android của mình cho nhiều cửa hàng Android?

Mặc dù giải pháp hiện tại của tôi hoạt động, nó không phải là tối ưu và tôi đang cố gắng tìm ra cách thức mà những người khác đã giải quyết vấn đề này. Ngay bây giờ, tôi đã triển khai hai màn hình giật gân cho ứng dụng của mình, SplashGoogle.java và SplashAmazon.java. Tôi có hai tệp kê khai tương ứng, GoogleManifest.xml và AmazonManifest.xml. Mỗi tệp kê khai xác định một giật gân khác nhau như ý định của trình khởi chạy.

Khi tôi muốn phát hành phiên bản ứng dụng của mình, tôi đổi tên một trong các tệp kê khai này thành AndroidManifest.xml, xuất ứng dụng và sau đó thực hiện tương tự cho Tệp kê khai khác. Đây là giải pháp của tôi bởi vì nó là tốt nhất tôi có thể đến với, và không biết cách khác để đi về việc này. Nó hoạt động vì sự khác biệt duy nhất giữa Amazon và các phiên bản thị trường Google của ứng dụng của tôi, là các lớp splash tương ứng, một lớp kiểm tra cấp phép và lớp còn lại thì không.

Xuống đường, tôi có thể muốn thực hiện các thay đổi bổ sung (hoặc hợp nhất để chỉ có một màn hình giật gân) và đang tìm kiếm một phương tiện quản lý lâu dài hơn trong cùng một ứng dụng.

Tôi tưởng tượng rằng các sự cố tương tự sẽ xảy ra khi nhà phát triển tạo các phiên bản ứng dụng trả tiền miễn phí, miễn phí hoặc được quảng cáo hỗ trợ.

Ghi chú thêm:

  1. Đối với phiên bản sử dụng Licensing Android của Google, tôi yêu cầu sự cho phép CHECK_LICENSE trong file AndroidManifet.xml, trong khi ở phiên bản Amazon, điều này là không cần thiết.

Tôi không chắc liệu điều này có nên được coi là một wiki cộng đồng hay không, nhưng nếu có, vui lòng đánh dấu nó như trái ngược với việc đóng câu hỏi. Tôi tin rằng điều này sẽ hữu ích cho rất nhiều nhà phát triển ở đó.

Trả lời

3

Tôi sẽ bắt đầu bằng cách tái cấu trúc mã nguồn hiện tại của bạn thành Dự án thư viện Android. Điều này là khá dễ dàng để làm. Be sure to read this. Tài liệu khá thưa thớt nhưng tôi có thể làm cho nó hoạt động với nó. Hãy cẩn thận để làm theo phần "Khai báo các thành phần thư viện trong tệp kê khai" chính xác.

Vì vậy, để cấu trúc lại vào thư viện, bạn về cơ bản đánh dấu dự án hiện tại là dự án thư viện. Bạn chỉ cần đánh dấu vào ô trong cài đặt dự án (xem liên kết).

Bây giờ hãy chuyển đến thư viện và chúng tôi muốn thay đổi tên gói thành tên khác. Vì vậy, ví dụ nếu gói phiên bản phát hành của bạn là com.mywebsite.myappname.android_market thì tôi sẽ đổi tên thành com.mywebsite.myappname.common_code

Bạn có thể nhấp chuột phải vào Dự án và chọn Công cụ Android-> Đổi tên gói ứng dụng. Nửa này làm việc cho tôi. Tôi cũng đã phải đổi tên thủ công tất cả các tham chiếu trong mã thành manaully lớp R của tôi. Bạn chỉ có thể sử dụng một tìm kiếm toàn cầu thay thế mặc dù để đổi tên từ com.mywebsite.myappname.android_market.R để com.mywebsite.myappname.common_code.R

Bây giờ thư viện của bạn đã sẵn sàng

Bây giờ là lúc để làm cho thực tế dự án mà bạn sẽ xây dựng.

Tạo dự án và tên Android mới với tên gói cho thị trường Android như com.mywebsite.myappname.android_market. Làm theo hướng dẫn trên liên kết để thêm thư viện commons mới của bạn làm thư viện mà gói này sử dụng.

Một hạn chế với Dự án Thư viện Android là tệp kê khai của thư viện sẽ KHÔNG được hợp nhất vào tệp kê khai của dự án cấp cao nhất của bạn. Bạn cần dán nó vào đó bằng tay. Ngoài ra (xem liên kết), bạn cần đảm bảo mọi thứ trong tệp kê khai của mình sử dụng tên gói đủ điều kiện. Vì vậy, nếu bạn đã từng có tên hoạt động như android: name = ". SplashScreenActivity", hãy đổi tên thành android: name = "com.mywebsite.myappname.common_code.SplashScreenActivity"

Vì vậy, một lần nữa bạn cần hợp nhất mọi thứ bằng tay, bao gồm quyền, ý định, hoạt động, v.v.

Bây giờ, chỉ cần xây dựng dự án hàng đầu và bạn tốt. Tạo trình bao bọc cho mỗi biến thể bạn muốn tạo.

Bạn cũng có thể có các dự án cấp cao nhất này triển khai mọi thứ khác nhau giữa các phiên bản khác nhau của bạn. Vì vậy, trình bao bọc Android Market của bạn có thể triển khai một màn hình giật gân và phiên bản Amazon của bạn là một màn hình giật gân khác. Hoặc bạn chỉ có thể sử dụng một enum trong dự án chung của bạn để lái nó giữ một màn hình giật gân trong đó.

Một tính năng thú vị khác là tài nguyên trong dự án hàng đầu sẽ ghi đè tài nguyên trong thư viện nếu chúng được cung cấp. Vì vậy, nếu bạn muốn ví dụ trên splash của bạn có một Amazon Version Logo và một logo Android Market thay đổi dựa trên phiên bản chỉ sử dụng tên hình ảnh giống như trong commons và đặt một bản sao khác nhau trong hai phiên bản.

+0

Điều này thật tuyệt vời! Điều duy nhất ngăn tôi thực hiện nó cho tình huống cụ thể của tôi là nó đòi hỏi các tệp AndroidManifest.xml trùng lặp, trong số các tệp khác - các vấn đề chính mà tôi đang cố gắng tránh ngay từ đầu. Tuy nhiên, tôi chắc chắn sẽ làm điều này nếu tôi đã từng tạo các phiên bản ứng dụng miễn phí/trả tiền và muốn cảm ơn bạn đã giải thích. – finiteloop

+0

Có cách nào để có một lớp được định nghĩa trong một dự án hàng đầu để ghi đè lên những gì có trong mã phổ biến? – finiteloop

+0

Tôi muốn thực hiện điều này vì tôi muốn dự án thư viện của mình biên dịch mà không có lỗi, nhưng có các biến được đặt cho từng dự án – finiteloop

1

Mặc dù không liên quan trực tiếp đến câu hỏi của bạn nhưng tôi gặp phải một rào cản tương tự trong việc tạo cả phiên bản ứng dụng miễn phí và trả phí của mình. Android cho phép bạn xuất bất kỳ ứng dụng nào dưới dạng thư viện. Bạn có thể tìm thấy tùy chọn này trong các thuộc tính của dự án trong Eclipse. Vì vậy, bằng cách xuất toàn bộ ứng dụng của bạn dưới dạng thư viện, bạn có thể kết hợp nó vào các ứng dụng khác. Khi thư viện của bạn đã được xuất, bạn có thể tạo ứng dụng Amazon và Google bằng thư viện làm cơ sở. Điều này sẽ ngăn không cho bạn phải đổi tên các tệp XML để đưa từng ứng dụng vào trạng thái có thể sử dụng được.

Thư viện rất hay vì bạn cũng có thể đóng gói tài nguyên với chúng. Bạn thậm chí có thể thêm các tài nguyên có chứa cùng tên trong các ứng dụng máy khách và chúng sẽ ghi đè lên phiên bản của thư viện. Vì vậy, bạn có thể có màn hình giật gân khác nhau dựa trên thị trường ứng dụng của bạn đang ở. Thư viện nơi duy nhất đã giảm ngắn cho tôi đã bao gồm tài sản. Rất tiếc, các tài sản thô, chưa qua chế biến sẽ không được đưa vào ứng dụng khách từ thư viện.

+0

Điều này cũng có vẻ khả thi. Vì vậy, bạn đang nói rằng các chức năng cốt lõi của ứng dụng của tôi được lưu như một dự án thư viện, và sau đó tạo ra hai "wrapper" dự án sử dụng thư viện này? – finiteloop

+0

Tôi cũng sử dụng tính năng này để kiểm soát việc phát hành ứng dụng của mình. Tôi có cùng một ứng dụng với nhiều cấp phép như thị trường android, miễn phí và amazon. Tôi chỉ sử dụng một enum trong dự án thư viện chính để chọn phương thức cấp phép sử dụng. Sau đó, tôi bọc thư viện với một wrapper cho mỗi dự án phát hành. Mỗi dự án bao bọc có phiên bản và tên gói riêng của nó. Vì vậy, tôi có thể làm cho một bản phát hành bằng cách chọn enum thích hợp và xây dựng các dự án wrapper tương ứng. –

+0

@metalideath này nghe có vẻ giống như một giải pháp tuyệt vời - một giải pháp có thể đảm bảo việc đăng câu trả lời của chính nó. Tôi rất muốn xem giải pháp của bạn được giải thích chi tiết hơn một chút. – finiteloop

1

Tôi sẽ xem xét sử dụng kiểm soát phiên bản như git và có ba nhánh. Một chi nhánh sẽ không có tệp kê khai, nhánh chính này sẽ có tất cả mã phổ biến mà bạn có thể cập nhật một lần. Hai nhánh còn lại sẽ là Amazon, Google và những thứ khác sẽ xuất hiện.Khi bạn hoàn thành công việc trong nhánh cốt lõi của mình và muốn cập nhật, bạn có thể tạo một nhánh nhánh tạm thời gọi là googleRelease (hoặc thứ gì đó) và hợp nhất nhánh google của bạn.

Đây là một ví dụ tương đối chung, git là mạnh mẽ và bạn có thể tiếp cận nó theo nhiều cách khác nhau.

+0

Điều này nghe có vẻ khả thi. Tôi đã có mã của tôi theo svn, là có một cơ chế tương tự cho svn? Mối quan tâm duy nhất của tôi là có vẻ như nó đòi hỏi rất nhiều công việc ở giữa các bản phát hành. – finiteloop

+0

Tôi không thể giúp bạn với svn, không phải là rất familier với nó. Theo như git và công việc liên quan đến nó đơn giản như: git checkout Core. git branch releaseGoogle. git checkout releaseGoogle. git hợp nhất google. Và đó là nó. – sgarman

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