最近我正在开发一个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脚本有什么问题?或者还有其他方法可以达到我的要求吗?谢谢!
答案 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中的buildConfigField
和manifestPlaceholders
在构建时将自定义值注入清单或BuildConfig.java类。
提示:如果使用Android Studio,找到build variants
选项(窗口的左下角),当您切换它们时,您可以看到当前选择了哪个源集。< / p>