Android 清单中的条件?

fan*_*tly 1 ant android android-manifest

Android Manifest 中是否有可能有条件?我知道它可能不是直接开箱即用的,因为它依赖于 R.java 等。我希望的是一些插件可以替换清单的某些部分(也注释/取消注释)到简化我的部署过程。

基本上,我们有一些我们想要完全锁定的设备,所以我将它们设置为category.HOME等等。但我们还有一些个人设备仍然用于测试。因此,确保我不会使用新的启动器来打击个人设备是非常乏味的。

我知道这很琐碎,但在以前的语言中我会使用ifdef等,但 Java 不是这样工作的。

我设法找到了这个:http : //www.ibm.com/developerworks/rational/library/09/eclipsecustomanttasks/ - 给我一些时间我可能会一起捏造一些东西,但我必须承认,我不真的知道从哪里开始,或者即使这可能吗?

希望之前有人想到过这个并有一个神奇的解决方案!:)

干杯。

Com*_*are 5

您可以拥有一个布尔资源——is_this_for_realz在此处调用它——设置为true用于生产和false其他。然后你可以设置一个<activity-alias>有你的HOME <intent-filter>,那里<activity-alias>android:enabled="@bool/is_this_for_realz"。然后,是否使用该HOME过滤器取决于该布尔资源的状态。您需要安排在设置is_this_for_realz为的资源文件中让您的生产版本交换true,而您的正常调试版本则是false.

正如 Machinarius 所指出的,使用 Gradle for Android会变得更简单。您可以使用布尔资源方法,但调试/发布版本is_this_for_realz由 Gradle 构建类型驱动。或者,如果您遇到<activity-alias>技术问题,您可以使用不同的清单进行调试和发布。


Dro*_*ris 5

回答有点晚了,但这就是我所做的。

首先在 Gradle 中创建清单变量,如下所示:

buildTypes {

    debug {
       
        manifestPlaceholders = [    applicationLabel: "@string/app_name_dev",
                                    azureRedirectURI: "URI_FOR_DEV"]
  
    }

    release {
        manifestPlaceholders = [    applicationLabel: "@string/app_name",
                                    azureRedirectURI: "URI_FOR_PROD"]
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在清单中你可以这样做:

<application android:label="${applicationLabel}" />

<activity android:name="com.microsoft.identity.client.BrowserTabActivity">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <!--Add in your scheme/host from registered redirect URI-->
            <data
                android:scheme="${azureRedirectURI}"
                android:host="auth" />
        </intent-filter>
    </activity>
Run Code Online (Sandbox Code Playgroud)