如何使用gradle

时间:2016-08-08 21:31:14

标签: java android android-studio gradle

最近我正在开发一个Android项目,其中有一组资源如src,res,assets等。现在我需要使用这些资源生成多个apks。我需要为每个apk的每个源文件更改一点。例如,构建apk一个。在最初的AndroidManifest.xml中有一个包名称字段" com.hello.app",我需要将其替换为" com.hello.app.one"。并且在原始的java代码中,如" HelloApp.java"有" com.hello.app"之类的东西,我需要将其重命名为" HelloAppOne.java"并替换" com.hello.app" to" com.hello.app.one"。类似的情况发生在apk二

我提出的解决方案是首先使用Gradle复制任务将所有原始代码和Manifest.xml复制到每个apk的一个位置。然后重命名并替换文件名和标记。这部分有效。

但接下来当我尝试使用我生成的不同代码集来构建apks时,事实证明出现了问题。

这是我出来的gradle脚本。

android{
    productFlavors {
        One{
            def appFolders = 'build/cache/AppOne';
            applicationId = 'com.hello.app.one'
            sourceSets{
                main{                
                    manifest.srcFile appFolders + File.separator + 'AndroidManifest.xml'
                    java.srcDirs = [appFolders+'/src']
                    res.srcDirs = [appFolders+'/res']
                    assets.srcDirs = [appFolders+'/assets']
                }
            } 
        }        
        Two{
            def appFolders = 'build/cache/AppTwo';
            applicationId = 'com.hello.app.two'
            sourceSets{
                main{                
                    manifest.srcFile appFolders + File.separator + 'AndroidManifest.xml'
                    java.srcDirs = [appFolders+'/src']
                    res.srcDirs = [appFolders+'/res']
                    assets.srcDirs = [appFolders+'/assets']
                }
            } 
        }  

    }
}

目录布局就像

build.gradle
AndroidManifest.xml
src/
   com.hello.app/
res/
assets/
build/cache/
   AppOne/
      src/
         codes for apk one
      res/
      assets/
      AndroidManifest.xml (modified for apk one) 
   AppTwo/
      src/
         codes for apk two
      res/
      assets/
      AndroidManifest.xml (modified for apk two)    

AppOne和AppTwo文件夹中的文件由Gradle复制任务生成。

当我构建时,我可以获得每个产品风格的APK。当我在设备上安装apk和apk两个时,我发现这两个是完全一样的。 APK一个具有完全相同的名称,提供者与APK两个。

有人能帮助我吗?我的gradle脚本有什么问题?或者还有其他方法可以达到我的要求吗?谢谢!

2 个答案:

答案 0 :(得分:0)

我没有使用此功能的经验,但看起来你的'manifest.srcfile'行缺少一个=。 应该是:  manifest.srcFile = appFolders + File.separator +'AndroidManifest.xml'

HTH, 吉姆

答案 1 :(得分:0)

使你的结构像这样:

build.gradle
src/
   main/
       java/com.hello.app
       assets
       res
       AndroidManifest.xml
   One/
       java/com.hello.app
       assets
       res
   Two/
       java/com.hello.app
       assets
       res

所以,我们的想法是将您的源集命名为产品风格,这样当您使用assembleOne构建应用时(例如),您将从中获取代码主要一个来源设置。对于需要共享的代码,请使用;对于flavor唯一代码,请使用一个两个。您也可以省略 main 中的清单,并在每个风味源集中放置一个唯一的清单,如果需要的话。

此外,您可以直接使用build.gradle中的buildConfigFieldmanifestPlaceholders在构建时将自定义值注入清单或BuildConfig.java类。

提示:如果使用Android Studio,找到build variants选项(窗口的左下角),当您切换它们时,您可以看到当前选择了哪个源集。< / p>