2013-10-10 13 views
17

私は、アンドロイドプロジェクトを2つの異なるアプリケーションに有料で無料でビルドする前に、アンドロイドでgradleを作成し、各製品のフレーバーを文字列に置き換えてください

昨日、値と文字列を変更して大きなミスを犯しました。

私はgradleを使ってアプリケーションを構築する方法を学んでいます。

私のアプリはいくつかの違いがあります。

  1. アプリ名(ちょうどサフィックスを追加する '-Free') - 私*の.javaファイル

// signingConfigsで>値/ string.xmlを

  • 変更フラグがommitedされます。

    productFlavors{ 
        free{ 
         packageName "my.app.free" 
         versionCode 20 
         signingConfig signingConfigs.freeConfing 
    
         copy{ 
          from('/res'){ 
           include '**/*.xml' 
          } 
          into 'build/res/' 
    
          filter{ 
           String line -> line.replaceAll("android:label=\"@string/app_name\"", "android:label=\"@string/app_name_free\"") 
          } 
         } 
         copy{ 
          from('/src'){ 
           include '**/*.java' 
          } 
          into 'build/src/' 
    
          filter{ 
           String line -> line.replaceAll("public static final Boolean IS_FULL_VER = true;", "public static final Boolean IS_FULL_VER = false;") 
          } 
         } 
        } 
        paid{ 
         packageName "my.app.paid" 
         versionCode 20 
         signingConfig signingConfigs.paidConfing 
        } 
    } 
    

    しかし、ビルドされたアプリは全く変更されていません。

    私は逃したのですか?

  • 答えて

    52

    product flavors上のドキュメントを参照してください:この例では、使用しています

    productFlavors { 
        free { 
         packageName "com.company.appfree" 
         buildConfig "public final static com.company.common.MonetizationType monetizationType = com.company.common.MonetizationType.FREE;" 
        } 
    
        paid { 
         packageName "com.company.apppaid" 
         buildConfig "public final static com.company.common.MonetizationType monetizationType = com.company.common.MonetizationType.PAID;" 
        } 
    } 
    

    :各味で、あなたのBuildConfig.javaファイルに生成されるようにフラグを定義することができ、あなたのbuild.gradle

    http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Product-flavors

    をenum(javaコードのどこかで定義する必要があります):

    public enum MonetizationType { 
        PAID, FREE 
    } 
    

    あなたは次のようにどこにでもこれを使用することができます:

    使用次の構造

    を:

    if (BuildConfig.monetizationType == MonetizationType.FREE) { ... } 
    

    リソースを上書きするためには、それぞれの味のソースフォルダに別のリソースファイルを作成することができます

    app/build.gradle 
    app/ [.. some other files...] 
    app/src/main/ 
    app/src/main/java 
    app/src/main/res 
    app/src/main/assets 
    app/src/main/AndroidManifest.xml 
    
    
    app/src/free/res/values/apptitle.xml 
    app/src/paid/res/values/apptitle.xml 
    

    apptitle.xmlは文字列リソースファイル(strings.xmlと同じ)ですが、o nly 1つの文字列:味に応じて異なるものにしたいもの。 (main/resディレクトリにapptitle.xmlは必要ありません)。

    <?xml version="1.0" encoding="utf-8"?> 
    <resources xmlns:tools="http://schemas.android.com/tools"> 
        <string name="app_title">App Title (or whatever you want)</string> 
    </resources> 
    

    あなたはさまざまな方法で文字列を上書きすることができるかもしれませんが、私は、明確にするために残りの部分から分離オーバーライドされた文字列を維持したいです。

    +0

    ありがとう: あなたは同じ結果を得るためにbuildConfigFieldbuildConfigを交換する必要があります!今、私は別のmonetizationTypeでビルドすることができます。しかし、私は自分のアプリ名を変更することはできません。私のプロジェクト構造はそれと同じではありません。私のプロジェクトでは、**/src/my/app/**/*。java、/res/values/string.xml**。それはプロジェクト構造ですか?プロジェクトの構造を変更する必要がありますか? –

    +0

    私のプロジェクト構造は、新しいAndroid Studio/Gradleプロジェクト構造です。ドキュメントhttp://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Product-flavorsを参照してください。それはすべてを説明する必要があります。はい、あなたのフォルダを変更する必要があるかもしれませんが、実際にそうするのは難しいことではありません。 android studio用の新しいサンプルプロジェクトを作成し、そのbuild.gradleファイルとディレクトリの設定方法を見てください。次に、その構造を反映するようにプロジェクトを変更します。 – treesAreEverywhere

    +0

    AndroidManifest.xmlでapp_titleを参照するにはどうすればよいですか?私は@ apptitle/app_titleを試しましたが、解決できません。 – dannyroa

    1

    treesAreEverywhereの回答(ユーザー名と同様に)が正しいです。しかし、Android Studioがビルドフレーバーや属性固有のリソースファイルを作成するプロセスを大幅に簡素化することも知っておくと非常に価値があります。

    ASプロジェクトウィンドウで、res/valuesフォルダを右クリックし、新規>値リソースファイルを選択します。次に、名前(「文字列」など)を指定し、デフォルトでない場合はソースセットを選択し、必要な修飾語を選択します(例:、スクリーン幅= 800)。これは、コンパイラが必要とするリソースをオーバーライドしているかどうかを確認する最も簡単な方法です。

    0

    これは私のプロジェクトでのやり方です。私はフレーバーの代わりに複数のビルドタイプを作成しました。このソリューションでは、組み立てようとしているビルドタイプに基づいて、パッケージ名に接頭辞を追加します。例えば、devの場合、パッケージ名はcom.sample.myapp.devになり、同様にベータ版のパッケージ名はcom.sample.myapp.releaseに変更されます。あなたは自由と有料のプレフィックスを得るためにそれを微調整することができます。それが助けてくれることを願って。

    buildTypes { 
        release { 
         minifyEnabled false 
         proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
         signingConfig signingConfigs.production 
         applicationIdSuffix '.release' 
         versionNameSuffix '-RELEASE' 
        } 
    
        dev { 
         signingConfig signingConfigs.debug 
         applicationIdSuffix '.dev' 
         versionNameSuffix '-DEV' 
        } 
    
        beta { 
         signingConfig signingConfigs.debug 
         applicationIdSuffix '.beta' 
         versionNameSuffix '-BETA' 
        } 
    
        debug { 
         signingConfig signingConfigs.debug 
         applicationIdSuffix '.debug' 
         versionNameSuffix '-DEBUG' 
         debuggable true 
        } 
    } 
    
    4

    新しいバージョンのGradleでは受け入れられた回答が機能しません。

    productFlavors { 
    free { 
        packageName "com.company.appfree" 
        buildConfigField "com.company.common.MonetizationType", "MONETIZATION_TYPE", "company.common.MonetizationType.FREE" 
    } 
    
    paid { 
        packageName "com.company.apppaid" 
        buildConfigField "com.company.common.MonetizationType", "MONETIZATION_TYPE", "company.common.MonetizationType.PAID" 
    } 
    

    }

    関連する問題