4

GCM、ContentProvider、AccountType を使用しているときに、リリース バージョンと一緒にデバッグ バージョンをインストールできるようにプロジェクトを構成するにはどうすればよいですか? (香料不使用)

次のようなエラーが発生し続けます: INSTALL_FAILED_CONFLICTING_PROVIDERまたはINSTALL_FAILED_DUPLICATE_PERMISSION

4

1 に答える 1

8

デバッグ apk とリリース apk を同じデバイスにインストールするのは、フレーバーではなくビルド タイプのみを使用している場合は注意が必要です (ビルド タイプでフレーバーではない理由) 。

ほとんどのブログ投稿は時代遅れ (packageName について話している) であるか、フレーバーが提案するソリューションがサポートされておらず、宣言できないため、フレーバーを使用する必要があるため、フレーバーを使用する必要があります。applicationIdSuffixbuild typeapplicationIdflavors

私が提案するソリューションは

  • ビルドタイプごとの権限
  • ビルド タイプごとのアカウント タイプ
  • ビルドタイプごとの GCM 権限

これを機能させるにはapplicationIdSuffixマニフェスト プレースホルダーをGradle ファイルでBuildConfigField使用します。resValue

残っている唯一の問題は、アプリに別の名前を付ける必要があり、言語ごとに文字列が翻訳可能として設定されていない場合です (バグ aosp トラッカー)。これにより、設定が強制され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", "ACCOUNT_TYPE",  "\"${defaultApplicationId}.debug\""
            buildConfigField "String", "AUTHORITY", "\"${defaultApplicationId}.debug.provider\""

            resValue "string", "account_type", "${defaultApplicationId}.debug"
            resValue "string", "authority", "${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"
    .../>

コンテンツプロバイダー

BuildConfig から取得する Authority の定数があります。

AUTHORITY = BuildConfig.AUTHORITY

口座の種類

アカウントの種類を取得するには、BuildConfig からも取得します。

BuildConfig.ACCOUNT_TYPE

多言語アプリ名

アプリと言語ごとに異なる名前が必要な場合:

debug/values-en/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>

main/values-en/strings.xml

<resources>
    <string name="app_name">MyApp EN</string>
</resources>

main/values-fr/strings.xml

<resources>
    <string name="app_name">MyApp FR</string>
</resources>
于 2015-10-20T10:49:15.750 に答える