欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

关于gradle替换Android Manifest中的属性变量的方法教程

程序员文章站 2022-04-26 17:50:33
项目中我有多个activity想设置为启动的activity,也就是设置成mainactivity,需要在manifest中对activity配置: &n...

项目中我有多个activity想设置为启动的activity,也就是设置成mainactivity,需要在manifest中对activity配置:

<intent-filter>

    <action android:name="android.intent.action.main"/>

......

</intent-filter>

如果每次编译版本都去手动修改的话,不仅麻烦还容易忘记。

可以用gradle配置来解决这个问题。

defaultconfig {

   ......

   // 先在默认配置中定义两个变量main_activity_key和oem_main_activity_key,并赋初始值

   manifestplaceholders += [main_activity_key: "android.intent.action.main",

                            oem_main_activity_key: "android.intent.action.no_main"]

  //不能当独写两个manifestplaceholders,必须是一个数组,不然编译通不过

   ......

}

// 客户版本

productflavors {

oema {

buildconfigfield "int", "oem_type", "0"

}

oemb {

buildconfigfield "int", "oem_type", "0"

}

}

现在我的oema客户和oemb客户,各自都有自己的mainactivity.

<activity

android:name=".ui.activity.oemaactivity"

android:launchmode="singleinstance"

android:screenorientation="landscape"

android:theme="@android:style/theme.notitlebar.fullscreen">

<intent-filter>

<action android:name="android.intent.action.main"/>

<category android:name="android.intent.category.launcher"/>

</intent-filter>

</activity>

<activity

android:name=".ui.activity.oembactivity"

android:launchmode="singleinstance"

android:screenorientation="landscape"

android:theme="@android:style/theme.notitlebar.fullscreen">

<intent-filter>

<action android:name="android.intent.action.main"/>

<category android:name="android.intent.category.launcher"/>

</intent-filter>

</activity>

现在我想在编译oema的时候,把oemaactivity变成mainactivity,而oembactivity为非mainactivity.

// 遍历oem版本,在目标客户中根据需要替换main_activity_key和oem_main_activity_key的值

productflavors.all {

flavor ->

if (flavor.name.contains("oema")) {

flavor.manifestplaceholders = [main_activity_key: "android.intent.action.no_main",

   oem_main_activity_key: "android.intent.action.main"]

}

else if (flavor.name.contains("oemb")) {

flavor.manifestplaceholders = [main_activity_key: "android.intent.action.main",

   oem_main_activity_key: "android.intent.action.no_main"]

}

}

然后在manifest中修改两个activity的action属性

<activity

android:name=".ui.activity.oemaactivity"

android:excludefromrecents="true"

android:launchmode="singleinstance"

android:screenorientation="landscape"

android:theme="@android:style/theme.notitlebar.fullscreen">

<intent-filter>

<action android:name="${oem_main_activity_key}"/> // 修改属性

<category android:name="android.intent.category.launcher"/>

</intent-filter>

</activity>

<activity

android:name=".ui.activity.oembactivity"

android:excludefromrecents="true"

android:launchmode="singleinstance"

android:screenorientation="landscape"

android:theme="@android:style/theme.notitlebar.fullscreen">

<intent-filter>

<action android:name="${main_activity_key}"/> // 修改属性

<category android:name="android.intent.category.launcher"/>

</intent-filter>

</activity>

最后编译 gradlew assembleoemarelease