在使用GCM,ContentProvider,AccountType时,如何配置项目以便能够在发布版本旁安装调试版本? (不使用口味)
我不断收到错误,例如:INSTALL_FAILED_CONFLICTING_PROVIDER或INSTALL_FAILED_DUPLICATE_PERMISSION
解决方法
如果您只使用构建类型而不是风味,则在同一设备上安装调试apk和发行版apk很棘手(
Why Build types and not flavors)
大多数博客文章要么过时(谈论packageName),要么是force you to use flavors,因为他们提出的解决方案不支持applicationIdSuffix,而构建类型不能声明applicationId,因此你需要使用一种风格
我建议使用的解决方案
>每种构建类型的权限
>每种构建类型的帐户类型
>每种构建类型的GCM权限
为此,我在Gradle文件中使用applicationIdSuffix,manifest placeholders,BuildConfigField和resValue.
剩下的唯一问题是当你想为app和每种语言设置一个不同的名字时,字符串不会被设置为可翻译(bug aosp tracker)
这会强制您将abortOnError设置为false,否则您将无法进行发布构建.
的build.gradle
project.ext { defaultApplicationId = "com.myapp.package" } android { compileSdkVersion 23 buildToolsversion "23.0.1" defaultConfig { applicationId defaultApplicationId manifestPlaceholders = [ applicationIdWithSuffix: "${applicationId}" ] buildConfigField "String","ACCOUNT_TYPE","\"${applicationId}\"" buildConfigField "String","AUTHORITY","\"${applicationId}.provider\"" resValue "string","account_type","${applicationId}" resValue "string","authority","${applicationId}.provider" } buildTypes { debug { applicationIdSuffix ".debug" debuggable true manifestPlaceholders = [ applicationIdWithSuffix: defaultApplicationId + ".debug" ] buildConfigField "String","\"${defaultApplicationId}.debug\"" buildConfigField "String","\"${defaultApplicationId}.debug.provider\"" resValue "string","${defaultApplicationId}.debug" resValue "string","${defaultApplicationId}.debug.provider" } } lintOptions { abortOnError false } }
AndroidManifest.xml中
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.mypackage" > <permission android:name="${applicationIdWithSuffix}.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="${applicationIdWithSuffix}.permission.C2D_MESSAGE" /> <application android:label="@string/app_name" > <provider android:name=".MyContentProvider" android:authorities="${applicationIdWithSuffix}.provider" android:exported="false" android:multiprocess="true" /> </application> </manifest>
同步适配器xml
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android" android:contentAuthority="@string/authority" android:accountType="@string/account_type"/>
帐户验证者
<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android" android:accountType="@string/account_type" .../>
内容提供商
AUTHORITY = BuildConfig.AUTHORITY
帐户类型
BuildConfig.ACCOUNT_TYPE
多语言应用名称
如果你想要每个应用程序不同的名称和语言:
调试/值恩/ strings.xml中
<resources> <string name="app_name">MyApp debug EN</string> </resources>
调试/值-FR / strings.xml中
<resources> <string name="app_name">MyApp debug FR</string> </resources>
主/值恩/ strings.xml中
<resources> <string name="app_name">MyApp EN</string> </resources>
主/值-FR / strings.xml中
<resources> <string name="app_name">MyApp FR</string> </resources>