How to replace strings resources with Android Gradle

前端 未结 4 943
感动是毒
感动是毒 2020-12-07 23:45

I made a new app with gradle in Android Studio, and now I need to make about 10 versions with different package names and values in resources. I made custom flavors as in ex

4条回答
  •  一生所求
    2020-12-08 00:03

    I was trying to get similar functionality as Maven resource filtering. This is what I came up with. My solution could use some changes to be more robust (i.e. pulling from a properties file, etc).

    My example just shows how to replace a single value, which is all that I needed. The variables follow the ${some.property} convention. This solution also works with product flavors that have their own resource files.

    import org.apache.tools.ant.filters.*
    ...
    android.applicationVariants.all{ variant ->
        // Perform resource filtering
        variant.mergeResources.doLast {
            filterResources(variant)
        }
    }
    
    def filterResources(buildVariant) {
    
        //Setup temp directory to filter the resources
        File resFiltered = file("${buildDir}/res/all/filtered/${buildVariant.dirName}")
        if(resFiltered.exists()){
            resFiltered.delete()
        }
    
        //Copy and filter the resources.
        copy {
            from(buildVariant.processResources.resDir) {
                include '**/*.xml'
    
                //Could be improved upon to pull from a properties file, etc.
                ant.properties['app.version'] = project.version
    
                filter(ExpandProperties, project: ant.project)
    
            }
            from(buildVariant.processResources.resDir) {
                exclude '**/*.xml'
            }
    
            into resFiltered
    
        }
    
        //Delete all the original resource files
        file(buildVariant.processResources.resDir).deleteDir()
        //Replace with the filtered ones.
        resFiltered.renameTo(file(buildVariant.processResources.resDir))
        //Delete the original 'filtered' directory
        file( "${buildDir}/res/all/filtered").deleteDir()
    }
    

    Example in strings.xml

     ...
     ${app.version}
     ...
    

提交回复
热议问题