静态android快捷方式多种口味?

是否有可能为多种口味定义静态快捷方式而不复制shortcuts.xml? 我有两个口味:

  • main(package:com.test)
  • 免费(包:com.test.free)

shortcuts.xml如下所示:

<shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> <shortcut android:enabled="true" android:icon="@drawable/ic_shortcut_add_photo" android:shortcutId="new_photo" android:shortcutLongLabel="@string/new_photo" android:shortcutShortLabel="@string/new_photo"> <intent android:action="android.intent.action.VIEW" android:targetClass="com.test.MainActivity" android:targetPackage="com.test"/> </shortcut> 

问题是意图中的包名称不能引用string资源,并且必须在xml中进行硬编码

为了还提供免费味道的快捷方式,我必须复制 shortcuts.xml并将targetPackage更改为com.test.free这是一个不好的解决scheme。

Solutions Collecting From Web of "静态android快捷方式多种口味?"

在调查这件事情时,我遇到了这个图书馆,这似乎有诀窍:

https://github.com/Zellius/android-shortcut-gradle-plugin

缺点:你的应用程序的res文件夹中不能有shortcuts.xml ,因为插件需要这个文件,修改它自动添加targetPackage ,然后在targetPackage期间把它放下,如果你已经定义了一个,会导致重复的资源错误。

除了这个缺点,似乎很好!

我创build了一个插件,使其能够在资源中使用manifestPlaceholders,并且可以使用android gradle插件的3.0.0版本

https://github.com/timfreiheit/ResourcePlaceholdersPlugin

的src / main / RES / shortcuts.xml:

 <shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> <shortcut android:enabled="true" android:icon="@drawable/ic_shortcut_add_photo" android:shortcutId="new_photo" android:shortcutLongLabel="@string/new_photo" android:shortcutShortLabel="@string/new_photo"> <intent android:action="android.intent.action.VIEW" android:targetClass="com.test.MainActivity" android:targetPackage="${applicationId}"/> </shortcut> 

重要提示:此解决scheme仅适用于3.0之前的Android Gradle插件版本,原因是资源处理方式发生了变化。

所以现在只是因为debugging版本的应用程序ID上的.debug后缀而.debug了这个问题。 这是我们的解决方法(请注意,这是来自我们的代码库的未经testing的适配):

src/main/res/shortcuts.xml

 <shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> <shortcut android:enabled="true" android:icon="@drawable/ic_shortcut_add_photo" android:shortcutId="new_photo" android:shortcutLongLabel="@string/new_photo" android:shortcutShortLabel="@string/new_photo"> <intent android:action="android.intent.action.VIEW" android:targetClass="com.test.MainActivity" android:targetPackage="@string/application_id"/> </shortcut> 

<android module name>/build.gradle

 apply plugin: 'com.android.application' //region: Fix shortcuts.xml by manually replacing @string/application_id final String APPLICATION_ID_STRING_RES_KEY = "application_id" android.applicationVariants.all { variant -> // Add the application id to the strings resources // We do this so that in the future if google fixes the // processing of the shortcuts.xml we can leave this // and remove the `mergeResources.doLast` block below resValue "string", APPLICATION_ID_STRING_RES_KEY, variant.applicationId // Manually replace @string/application_id with `variant.applicationId` variant.mergeResources.doLast { println("variant = ${variant.applicationId}") final File valuesFile = file("${buildDir}/intermediates/res/merged/${variant.dirName}/xml/shortcuts.xml") final String content = valuesFile.getText('UTF-8') final String updatedContent = content .replace("@string/${APPLICATION_ID_STRING_RES_KEY}", variant.applicationId) valuesFile.write(updatedContent, 'UTF-8') } } //endregion android { ... }