我正在尝试从build.gradle android扩展中的AndroidManifest.xml文件中执行替换,但收到此错误:
AndroidManifest.xml:89:16 Error:
Attribute uses-library#com.company.platform.${encoding}@name at AndroidManifest.xml:89:16 requires a placeholder substitution but no value for <encoding> is provided.
/Users/Company/Desktop/Checkout/android/Project/app/src/main/AndroidManifest.xml:0:0 Error:
Validation failed, exiting
:app:processDebugManifest FAILED
这是清单文件的一个片段:
...
</receiver>
<uses-library android:name="com.company.platform.${encoding}" />
</application>
...
这是build.gradle的截图:
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
applicationId "com.company.app"
minSdkVersion 23
targetSdkVersion 23
versionName cityVersion
setProperty("archivesBaseName", "City_$versionName")
manifestPlaceholders = [encoding: "some value"]
manifestPlaceholders = [version: cityVersion]
}
我还尝试在构建类型中添加清单占位符,即
buildTypes {
release {
minifyEnabled true
shrinkResources true
manifestPlaceholders = [encoding: deviceEncoding]
manifestPlaceholders = [version: cityIDVersion]
}
debug {
manifestPlaceholders = [encoding: deviceEncoding]
manifestPlaceholders = [version: cityIDVersion]
}
}
但我仍然收到同样的错误。
为什么在清单占位符中提供占位符替换时需要占位符替换会出现错误?
您只需添加到数组中即可。您正在替换它。这样做:
manifestPlaceholders = [encoding: "some value", version: cityVersion]
通过为相同的风格/构建类型声明两次 manifestPlaceholder,您将替换前一个。替换上一个属性后,生成失败,因为该属性不再存在。
这个
manifestPlaceholders = [encoding: "some value"]
manifestPlaceholders = [version: cityVersion]
应该是这样的
manifestPlaceholders = [encoding: "some value"]
manifestPlaceholders += [version: cityVersion]
由于库清单中定义manifestPlaceholders
而遇到清单合并/清单注入问题的人来说,问题来自您需要在库清单中为manifestPlaceholders
定义值的事实。当您在使用应用程序中注入实际值时,该值不会被覆盖。若要解决此问题,应仅为库中debug
生成定义这些manifestPlaceholders
值。
这样:
android.buildTypes.debug.manifestPlaceholders = [
authScheme: 'clientAppReplaces', authHost: 'clientAppReplaces'
]
通过这样做,您将能够构建您的库。同时还允许客户端应用程序为manifestPlaceholders
提供正确的值。让您的图书馆完成所有繁重的工作。这是可能的,因为库构建为发布版本(除非另有定义)。
客户端应用build.gradle
示例:
defaultConfig {
applicationId "com.app.manifestPlaceholders"
minSdkVersion 16
targetSdkVersion 27
versionCode project.ext.versionCode
versionName project.ext.versionName
manifestPlaceholders = [authScheme: 'customSchemeValue', authHost: 'hostValue']
}
我在值周围留下了 ${} 符号:
<meta-data android:name="net.example" android:value="${XXXX}" />
请注意,+=
操作应用于manifestPlaceholders
而不是=
。这是有意为之的,也是必需的,因为新版本的Flutter SDK
在引擎盖下进行了一些更改以处理multidex。使用 =
而不是 +=
可能会导致如下错误:
Attribute application@name at AndroidManifest.xml:5:9-42 requires a placeholder substitution but no value for <applicationName> is provided.
如果看到此错误,请更新build.gradle
以改用+=
。
如果您的应用程序使用谷歌地图
在运行应用程序之前,您需要一个 Google 地图 API 密钥。
To get one, follow the directions here:
https://developers.google.com/maps/documentation/android-sdk/get-api-key
Once you have your API key (it starts with "AIza"), define a new property in your
project's local.properties file (e.g. MAPS_API_KEY=Aiza...), and replace the
"YOUR_API_KEY" string in this file with "${MAPS_API_KEY}".
-->
您需要将 applicationId 占位符添加到应用程序 gradle 中。这发生在更新到 Gradle 2.2.0-alpha1 后的 Firebase 集成中。
android {
...
defaultConfig {
applicationId "com.example.my.app"
...
}
}
请参阅:无法获取提供程序 com.google.firebase.provider.FirebaseInitProvider