安卓工作室在清单</compatible-screens>中使用带有<compatible-screens>的风格

时间:2015-01-04 15:37:08

标签: android

我有1个应用程序,但我想制作2个apks(2个Android ID)并分发给手机和平板电脑。 为此,(以及其他方面)我正在使用Android Studio的flavors“功能”。

同时我需要使用this来设置每个apk的屏幕大小。根据{{​​1}}方法,需要在两个不同的文件夹中创建相同的项目两次(这是一种非常简单的方式,我知道),但是这个案例,我应该只复制{{1在两个地方都设置flavor标签内的正确内容,或者如何处理这个问题? 我猜它会起作用,但我想知道最佳做法是什么。如果有人知道或曾经尝试过,请告诉我。

2 个答案:

答案 0 :(得分:2)

我可以看到你自己找到了一个解决方案,但它似乎是一个非常糟糕的解决方案,可以追溯到2013年3月,所以让我介绍一下当前的标准方法。此方法使用Google团队实施的清单合并。

来源 - &gt;主要 - &gt;的AndroidManifest.xml

不要做任何特别的事情,不要添加任何与屏幕相关的东西。

来源 - &gt;电话 - &gt;的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest
   package="your.package.name"
   xmlns:android="http://schemas.android.com/apk/res/android">

   <supports-screens
      android:smallScreens="true"
      android:normalScreens="true"
      android:largeScreens="false"
      android:xlargeScreens="false"/>

</manifest>

然后来源 - &gt;平板电脑 - &gt;的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest
   package="your.package.name"
   xmlns:android="http://schemas.android.com/apk/res/android">

   <supports-screens
      android:smallScreens="false"
      android:normalScreens="false"
      android:largeScreens="true"
      android:xlargeScreens="true"/>

</manifest>

以上是完整的文件,仅support-screens,仅此而已。它们会合并到您的 main - &gt;构建系统的ANdroidManifest.xml

此外,如果您需要(您需要使用Google Play)为每个版本号添加不同的版本号,build.gradle部分内的android {内包含:

   productFlavors {
        phone {
            versionCode 200001
        }
        tablet {
            versionCode 300001
        }
    }

答案 1 :(得分:0)

没关系我自己弄清楚了。我在build.gradle为应用

设置了此代码
//============================
//   Custom manifest merging:
//============================
android.applicationVariants.all { variant ->
    variant.processManifest.doLast {

        def propertyList = variant.productFlavors*.name
        propertyList.add(variant.buildType.name)

        def variantProperties = new Properties()
        propertyList.reverse().each { property ->
            def propFile = "src/${property}/manifest.properties"
            try {
                file(propFile).withReader { reader ->
                    def tmpProps = new Properties()
                    tmpProps.load(reader)
                    variantProperties.putAll(tmpProps)
                }
            } catch (e) {
                println "[${variant.name}] Failed to load ${propFile}"
            }
        }
        println "[${variant.name}] manifest properties: ${variantProperties}"

        copy {
            from("${buildDir}/intermediates/manifests/full") {
                include "${variant.dirName}/AndroidManifest.xml"
            }
            into("${buildDir}/filtered_manifests")
            filter { String line -> line.replaceAll("<compatible-screens(.*)/>", variantProperties.get("compatible-screens", "")) }
            filter { String line -> line.replaceAll("<supports-screens(.*)/>", variantProperties.get("supports-screens", "")) }
        }
    }
    variant.processResources.manifestFile = file("build/filtered_manifests/${variant.dirName}/AndroidManifest.xml")
}

然后我在这些路径下创建了两个文件:src/phone/manifest.propertiessrc/tablet/manifest.properties,其中包含下一个内容:

compatible-screens=<compatible-screens>\
        <screen android:screenSize="small" android:screenDensity="ldpi" />\
        <screen android:screenSize="small" android:screenDensity="mdpi" />\
        <screen android:screenSize="small" android:screenDensity="hdpi" />\
        <screen android:screenSize="small" android:screenDensity="xhdpi" />\
        <screen android:screenSize="normal" android:screenDensity="ldpi" />\
        <screen android:screenSize="normal" android:screenDensity="mdpi" />\
        <screen android:screenSize="normal" android:screenDensity="hdpi" />\
        <screen android:screenSize="normal" android:screenDensity="xhdpi" />\
        </compatible-screens>

supports-screens=<supports-screens \
    android:smallScreens="false" \
    android:normalScreens="false" \
    android:largeScreens="true" \
    android:xlargeScreens="true" \
    android:requiresSmallestWidthDp="600" />

AndroidManifest.xml未定src/main/我放置了两个空标记<supports-screens /><compatible-screens />

那就是它!

所有内容都来自此链接:https://groups.google.com/forum/#!msg/adt-dev/8igxEyihIlc/gk4b8K6ZxNYJ,只需对构建路径文件夹进行少量更改。我在${buildDir}/intermediates/manifests/full下。