2011-06-02 63 views
9

我最近開始在Google Android Market上銷售我的Android應用程序,並實施了他們的應用程序授權計劃,以防止未經授權使用我的應用程序。我現在正計劃將其發佈給亞馬遜Android App Store,並且希望知道維護我的應用程序的兩個版本的最佳方式:一個實現Android許可,另一個不支持。如何爲多個Android商店支持我的Android應用程序?

雖然我目前的解決方案有效,但它並不是最優的,我正試圖找出其他人處理此問題的方法。現在,我爲我的應用程序SplashGoogle.java和SplashAmazon.java實現了兩個啓動屏幕。我有兩個對應的Manifest文件,GoogleManifest.xml和AmazonManifest.xml。每個清單都定義了與啓動器意圖不同的閃屏。

當我想要發佈我的應用程序的一個版本時,我將其中一個清單文件重命名爲AndroidManifest.xml,導出應用程序,然後對其他清單執行相同的操作。這是我的解決方案,因爲這是我能想到的最好的方法,並且不知道其他方法可以做到這一點。這是有效的,因爲我的應用程序的亞馬遜和谷歌市場版本之間的唯一區別是相應的飛濺類,一個用於檢查許可,另一個不用。我可能想要實施其他更改(或合併爲只有一個啓動畫面),並且正在尋找一種更持久的方式來管理同一應用程序中的細微變化。

我想像過類似的問題,當開發人員創建精簡版,免費或廣告支持的付費應用程序版本時就會出現這種情況。

其他注意事項:

  1. 對於使用谷歌的Android授權的版本,我要求在AndroidManifet.xml文件CHECK_LICENSE許可,而在亞馬遜的版本,這是沒有必要的。

我不確定這是否應該被視爲社區wiki,但如果是這樣,請將其標記爲反對結束該問題。我相信這對於很多開發者來說都是有用的。

回答

3

我首先將現有的代碼重構爲Android庫項目。這很容易做到。 Be sure to read this.該文檔相當稀少,但我能夠使它與它一起工作。請仔細按照「聲明清單文件中的庫組件」一節。

因此,重構爲一個庫,你基本上將現有項目標記爲庫項目。您只需在項目設置中勾選一個框(請參閱鏈接)。

現在去圖書館,我們想把包名改成不同的東西。因此,例如,如果您發佈的版本包是com.mywebsite.myappname.android_market,那麼我會將其重命名爲com.mywebsite.myappname.common_code

您可以右鍵單擊該項目並選擇Android工具 - >重命名應用程序包。這一半爲我工作。我還必須手動將代碼中的所有引用手動重命名爲我的R類。你可以只用一個全局搜索替換雖然從com.mywebsite.myappname.android_market.R重命名爲com.mywebsite.myappname.common_code.R

現在你的庫已經準備好

現在的時間,使實際項目,你會建立。

使用com.mywebsite.myappname.android_market等安卓市場的軟件包名稱創建一個新的android項目和名稱。按照鏈接上的說明將新的公共庫添加爲該軟件包使用的庫。

Android Library Projects的一個限制是庫的清單不會合併到頂級項目的清單中。你需要手工粘貼在那裏。另外(請參閱鏈接),您需要確保清單中的所有內容都使用完全限定的軟件包名稱。所以,如果你以前有活動名稱,如android:name =「。SplashScreenActivity」,請將其更改爲android:name =「com.mywebsite.myappname.common_code.SplashScreenActivity」

所以再次需要手動合併所有內容,包括權限,意圖,活動等。

現在只需構建最頂級的項目,而且你很棒。 爲每個要構建的變體創建一個包裝。

您也可以讓這些新的頂級項目實現您的不同版本之間不同的任何內容。所以你的Android Market封裝器可以實現一個啓動畫面,而你的亞馬遜版本則可以實現不同的啓動畫面。或者你可以在你的公共項目中使用一個枚舉來驅動它,同時保持兩個啓動畫面。

另一個不錯的功能是,如果提供頂級項目中的資源,它們將覆蓋資源庫中的資源。因此,如果您希望在自己的飛濺上擁有基於版本更改的亞馬遜版徽標和Android Market徽標,只需使用與公用版相同的圖像名稱,並在兩個版本中添加不同的副本即可。

+0

聽起來不錯!唯一阻礙我實現它的原因是它需要重複的AndroidManifest.xml文件以及其他文件 - 我首先想避免的主要問題。但是,如果我創建免費/付費版本的應用程序,我一定會這樣做,並且要感謝您的解釋。 – finiteloop

+0

有沒有辦法在頂級項目中定義一個類來覆蓋通用代碼中的內容? – finiteloop

+0

我想這樣做是因爲我希望我的庫項目能夠無錯地編譯,但爲每個項目設置了變量 – finiteloop

1

儘管與您的問題沒有直接關係,但在創建應用程序的免費和付費版本時遇到了類似的障礙。 Android允許您將任何應用程序導出爲庫。您可以在Eclipse的項目屬性中找到此選項。因此,通過將整個應用程序導出爲一個庫,您可以將它整合到其他應用程序中。一旦你的圖書館已經出口,你可以創建一個亞馬遜和谷歌應用程序庫作爲基地。這將防止您必須重命名XML文件才能使每個應用程序進入可用狀態。

圖書館很好,因爲你也可以打包資源。您甚至可以在客戶端應用程序中添加包含相同名稱的資源,這些資源將覆蓋該庫的版本。所以你可以根據你的應用程序所在的市場有不同的啓動畫面。圖書館唯一缺少的地方就是包含資產。不幸的是,原始未處理的資產將不會包含在庫中的客戶端應用程序中。

+0

這聽起來也是可行的。所以你說我的應用程序的核心功能被保存爲一個庫項目,然後創建兩個使用這個庫的「包裝」項目? – finiteloop

+0

我也使用它來控制我的應用程序版本。我有與多個許可相同的應用程序,如免費,安卓市場和基於亞馬遜市場。我只是在主庫項目中使用枚舉來選擇使用哪種許可方法。然後我爲每個發佈項目打包一個包裝。每個包裝器項目都有自己的版本和包名稱。所以我可以通過選擇適當的枚舉並構建相應的包裝器項目來發布。 –

+0

@metalideath這聽起來像是一個很好的解決方案 - 可能會保證它自己的答案發布。我會非常感興趣的看到你的解決方案更詳細的解釋。 – finiteloop

1

我會研究使用版本控制,如git並有三個分支。一個分支不會有清單,這個核心分支將擁有所有可以更新一次的通用代碼。其他兩個分支將是亞馬遜,谷歌,還有其他的產品。這些分支會有特定於應用程序的代碼,清單,啓動畫面等。當您在覈心分支中完成工作並想要推送更新時,可以將核心的臨時分支稱爲googleRelease(或其他)併合並您的Google分支。

這是一個相對通用的例子,git功能強大,你可以用各種方式來處理它。

+0

這聽起來可行。我已經有我的代碼下svn,有沒有類似的機制svn?我唯一擔心的是,這聽起來像是在發佈之間需要很多工作。 – finiteloop

+0

我不能幫你與svn,不是很親。就git和work而言,它就像git checkout核心一樣簡單。 git分支版本Google。 git checkout releaseGoogle。 git合併谷歌。那就是它。 – sgarman

相關問題