2012-10-18 79 views
4

演示和完整版應用程序 - 它的結構(自iPhone推出)這樣一個常量定義無論是演示或完整版本。創建基於我在與Eclipse一個項目開發一個Android應用一個代碼庫/項目

現在我有一個每次我要創建的演示版本,我需要改變常數也需要使該項目的副本有不同的軟件包名稱的問題。

在原有完整版顯然改變的代碼需要被複制到演示或我將不得不重做演示程序,每次我提出我的應用程序的創建。

我看到三種可能的途徑:

1. 雖然我已經看過成庫項目,目前還不清楚對我如何真正提供在這種情況下,一個很好的解決方案。

例如,如果我有完整版本的活動結構:

A1 
A2 
A3 

使用實用工具類U1,U2

當然,U1和U2可以在庫項目,兩個項目引用 - 但活動的strings.xml,圖形,佈局需要被複制(或有另一種方式,我不明白嗎?)這似乎並不成爲了一種很好的方式,不幸的是沒有在這個類似的問題進行了說明當這種方法被提出時,

2. 另一種方式是根據不同的構建設置(類似於iPhone)創建不同的包名稱,但是,這在Eclipse中似乎不可行,而不是通過使用一些外部腳本(它 - 誠實地 - 我寧願避免,因爲它似乎相當容易出錯),同時編譯必須在Eclipse外部調用

3. 可能最直接的方法(也是目前最小的努力)是手動複製項目,改變一個常量,重命名包並在我每次提交時編譯/導出。然而,這似乎是相當「基本」的,並且看起來並不專業(與iPhone/xCode構建設置/目標解決方案相比)

什麼是最佳方法(需要最小量的變化並仍然穩定和易於使用)?

非常感謝!

編輯

大家誰試圖蒂姆的解決方案 - 它工作得很好,但是我遇到了自定義屬性的問題。

檢查:How to solve Android Libraries custom attributes and package name remapping during build? 將解決圖書館

回答

8

我現在在eclipse中這樣做,並不難。

  1. 將現有源代碼轉換爲庫項目。

  2. 創建兩個新項目,免費和付費。

  3. 將庫項目包含在免費和付費項目中。

在免費/付費項目中沒有必要擁有單個活動或資源。所有你需要的是一個清單,每個引用來自你的圖書館的活動。我的免費和完整項目目前沒有任何類型的java,資源或佈局文件,它只是一個引用庫中活動的清單。

我用這兩個項目完全相同的代碼,我說區分他們:

if(getApplicationContext().getPackageName().equals("full version package name")) { 
    //do full stuff 
} else { 
    //do free stuff 
} 

的一些陷阱我已經打了,特別是如果你已經發布你的應用程序在市場上:

  • 如果您更改任何活動的全名/路徑,它將從主屏幕中消失。因此,如果您的圖書館的軟件包名稱與現有版本不同,則會丟失任何主屏幕圖標。它們可以由用戶替換,但並不理想。
  • 與appwidgets類似,如果您更改其接收者名稱,它們將在升級時消失。
  • 您不得在任何情況下更改已發佈應用程序的軟件包名稱。

如果您已經發布了一個免費版和專業版,它有點不幸,因爲活動路徑需要改變到公共庫的路徑,你不能重命名發佈的包相匹配的庫路徑。所以有人將不得不失去他們現有的圖標。

在我的情況下,我只是在分割它們之前發佈了一個免費版本,並且我能夠以相同的軟件包名稱作爲免費版本命名庫。我懷疑你會被允許包含一個與包裝包相同包名的庫,但顯然可以這樣做(對我來說工作很好)。

所以在我的情況我有三個項目:

  • 核心庫:包名稱:com.myname.myapp
  • 免費版本:包的名字:com.myname.myapp
  • 臨版本:包的名字:com.myname.myapp.Pro

和自由和完整版的清單添加其命名爲com.myname.myapp.ActivityAcom.myname.myapp.ActivityB活動,只存在於庫p roject。

+0

非常感謝您的補充澄清 - 我會在接下來的幾天嘗試這一點(到目前爲止,我還沒有在GooglePlay上發佈任何兩個 - 幸運的是,據我的理解,您的評論:-) – user387184

+0

我喜歡這個。下次必須注意。 – DeeV

+0

我試過這種方法。這裏主要的問題是你必須複製代碼,最終你會得到三個項目!更好的方法實際上是使用口味。這是一個很好的教程,幫助我:https://www.youtube.com/watch?v=7JDEK4wkN5I –

2

的ISSE我看到的最簡單的方法是將有三個項目:

  1. 演示

演示和完整的項目將分別有他們自己的唯一包名在其各自的清單文件中定義。他們的活動僅僅是將信息捆綁發送到圖書館項目中主要活動的端口。庫項目中的Activity將讀取傳入的Bundle中的必要參數,以確定它是由演示Activity還是完整的Activity啓動。然後它會相應地進行。

所以邏輯是這樣的:

用戶啓動演示活動 - >演示活動將創建一個Bundle與說,這是演示活動的信息 - >演示活動啓動庫活動,然後執行演示模式下的其他程序。

OR

用戶推出的全活動 - >完整的活動創建一個包與說它是完整的活動信息 - >全活動啓動庫活動,然後在充分執行該程序的其餘部分模式。

+1

if (BuildConfig.FLAVOR == "lite") { // add some ads or restrict functionallity } 

對於運行和設備使用試驗,「構建變種」 Android Studio中選項卡版本之間切換,不需要將包裝活動傳遞捆綁到庫中。您可以將庫活動直接存入發佈包清單。看到我的答案更詳細。 – Tim

1

在Android Studio中使用build.gradle非常簡單。閱讀關於productFlavors。這是一個非常有用的功能。只需簡單地添加以下行的build.gradle:

productFlavors { 
    lite { 
     packageName = 'com.project.test.app' 
     versionCode 1 
     versionName '1.0.0' 
    } 
    pro { 
     packageName = 'com.project.testpro.app' 
     versionCode 1 
     versionName '1.0.0' 
    } 
} 

在這個例子中,我添加兩個產品口味:首先爲精簡版的版本和第二的完整版本。每個版本都有自己的versionCode和versionName(適用於Google Play發佈)。

在代碼中只檢查BuildConfig.FLAVOR:雖然可以這樣做 enter image description here

相關問題