26

私のプロジェクトには 2 つのフレーバーがあります。

flavor1 -> packagename: com.example.flavor1 
flavor2 -> packagename: com.example.flavor2

今度は、フレーバー 1 とフレーバー 2 のビルドバリアントをビルドしたいと思います。buildvariant の唯一の違いは、別のパッケージ名です。

私のプロジェクトは MapFragments を使用し、マニフェストは 1 つしかないため、それぞれのフレーバーの文字列リソース ファイルに MAPS_RECEIVE のアクセス許可名を入れました。

問題は、buildvariant の文字列リソースをどのように置き換えることができるかということです。

次のアプローチを試しました(この投稿で説明されています):

buildTypes{
    flavor1Rev{
        packageName 'com.example.rev.flavor1'
        filter(org.apache.tools.ant.filters.ReplaceTokens, tokens: ['package_permission' : 'com.example.rev.flavor1.permission.MAPS_RECEIVE'])
    }
}

しかし、これを使用すると、次のエラーが発生しました。

引数のメソッド filter() が見つかりませんでした [{tokens={package_permission=com.example.rev.flavor1.permission.MAPS_RECEIVE}}, BuildTypeDsl_D ecorated{name=ReplaceTokens, debuggable=false, jniDebugBuild=false, renderscript DebugBuild=false, renderscriptOptimLevel=3、packageNameSuffix=null、versionNameS uffix=null、runProguard=false、zipAlign=true、signingConfig=null}] BuildTypeD sl_Decorated{name=buderusFinal、debuggable=false、jniDebugBuild=false、renderscr iptDebugBuild=false、renderscriptOptimLevel=3 で、packageNameSuffix=null、versionNameSuffix=null、runProguard=false、zipAlign=true、signingConfig=null}。

フィルター メソッド用に独自のタスクを定義する必要がありますか?

編集 [2013_07_09]:

src/flavor1/res の文字列:

<string name="package_permission">package_permission</string>

文字列を置き換える build.gradle のコード:

buildTypes{
    flavor1Rev{
        copy{
            from('src/res/'){
                include '**/*.xml'
                 filter{String line -> line.replaceAll(package_permission, 'com.example.rev.flavor1.permission.MAPS_RECEIVE')}
            }
            into '$buildDir/res'
        }
    }
} 
4

4 に答える 4

39

私は自分で問題を解決したので、ここに「ステップバイステップ」の解決策があります-おそらく、他の初心者がグラドルするのに役立つでしょう:)

  • 一般的なタスクのコピー:

    copy{
        from("pathToMyFolder"){
            include "my.file"
        }
        // you have to use a new path for youre modified file
        into("pathToFolderWhereToCopyMyNewFile")
    }
    
  • 一般的な行を置き換えます。

    copy {
       ...
       filter{
           String line -> line.replaceAll("<complete line of regular expression>",
                                          "<complete line of modified expression>")
       }
    }
    
  • これを動的に作成する必要があったため、最大の問題は正しいパスを取得することだったと思います (このリンクは私にとって非常に役立ちました)。文字列ファイルではなく、マニフェストの特別な行を置き換えることで問題を解決しました。

  • 次の例は、マニフェストの "meta-data" タグを置き換えて、youre google-maps-api-key を使用する方法を示しています (私の場合、異なるキーを使用するさまざまなフレーバーがあります)。

    android.applicationVariants.each{ variant -> 
        variant.processManifest.doLast{ 
            copy{
                from("${buildDir}/manifests"){
                    include "${variant.dirName}/AndroidManifest.xml"
                }
                into("${buildDir}/manifests/$variant.name")
    
                // define a variable for your key:
                def gmaps_key = "<your-key>"
    
                filter{
                    String line -> line.replaceAll("<meta-data android:name=\"com.google.android.maps.v2.API_KEY\" android:value=\"\"/>",
                                                   "<meta-data android:name=\"com.google.android.maps.v2.API_KEY\" android:value=\"" + gmaps_key + "\"/>")
                }
    
                // set the path to the modified Manifest:
                variant.processResources.manifestFile = file("${buildDir}/manifests/${variant.name}/${variant.dirName}/AndroidManifest.xml")
            }    
       }
    }
    
于 2013-07-10T14:00:11.233 に答える
4

回答はかなり古くなっています。アーカイブするためのより良い方法があります。build.gradle で次のコマンドを使用できます。

manifestPlaceholders = [
            myPlaceholder: "placeholder",
    ]

そしてあなたのマニフェストで:

android:someManifestAttribute="${myPlaceholder}"

詳細については、 https ://developer.android.com/studio/build/manifest-merge.html をご覧ください。

于 2016-10-05T01:07:10.420 に答える
0

現在の Android Gradle DSL では、ApplicationVariantクラスが変更されたため、Saad のアプローチを次のように書き直す必要があります。

applicationVariants.all { variant ->
    variant.outputs.each { output ->
        output.processManifest.doLast {
            replaceInManifest(output,
                    'GMAPS_KEY',
                    getGmapsKey(buildType))

            }
        }
    }

def replaceInManifest(output, fromString, toString) {
    def updatedContent = output.processManifest.manifestOutputFile.getText('UTF-8')
        .replaceAll(fromString, toString)
    output.processManifest.manifestOutputFile.write(updatedContent, 'UTF-8')
}

新しい DSL は、マニフェスト ファイルに直接アクセスするためのよりクリーンなアプローチも提供します。

于 2015-12-04T07:14:25.557 に答える