1. ホーム
  2. android

[解決済み] Gradleでビルドタイプを使用し、ContentProviderを使用する同じアプリを1つのデバイスで実行する。

2022-07-15 06:59:49

質問

デバッグアプリにパッケージ名のサフィックスを追加するようにGradleを設定し、1台の携帯電話で使用しているリリース版とデバッグ版を持つことができるようになりました。こちらを参考にさせていただきました。 http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Types

私のbuild.gradleファイルはこのような感じです。

...
android
{
    ...
    buildTypes
    {
        debug
        {
            packageNameSuffix ".debug"
            versionNameSuffix " debug"
        }
    }
}

私のアプリでContentProviderを使い始めるまでは、すべてうまくいきます。私は得ました。

Failure [INSTALL_FAILED_CONFLICTING_PROVIDER]

2つのアプリ(releaseとdebug)が同じContentProviderの権限を登録しているため、このようなことが起こるのだと理解しています。

私はこれを解決するための 1 つの可能性を見ています。私が正しく理解しているならば、構築時に使用する異なるファイルを指定できるはずです。それから、私は異なるリソース ファイルに異なる権限を置くことができ (そしてマニフェストから文字列リソースとして権限を設定します)、デバッグ ビルドのために異なるリソースを使用するように Gradle に指示する必要があります。それは可能ですか?もしそうなら、それを達成する方法についてのヒントは素晴らしいでしょう。

または、Gradle を使用してマニフェストを直接修正することは可能でしょうか?1 つのデバイスで ContentProvider を使用して同じアプリを実行する方法に関する他のソリューションも常に歓迎します。

どのように解決するのですか?

既存のどの答えも私を満足させませんでしたが、リバティはそれに近いものでした。だから、これは私がそれをやっている方法です。 まず第一に、現時点では、私はで動作しています。

  • Android Studio Beta 0.8.2
  • Gradle プラグイン 0.12.+。
  • Gradle 1.12

私の ゴール を実行することです。 Debug バージョンと Release バージョンと同じデバイスで同じ ContentProvider .


build.gradle で、Debug buildのサフィックスを設定します。

buildTypes {
    debug {
        applicationIdSuffix ".debug"
    }
}


AndroidManifest.xml ファイルセット android:authorities プロパティに ContentProvider :

<provider
    android:name="com.example.app.YourProvider"
    android:authorities="${applicationId}.provider"
    android:enabled="true"
    android:exported="false" >
</provider>


あなたの コード セット AUTHORITY プロパティを設定し、実装の必要なところで使用することができます。

public static final String AUTHORITY = BuildConfig.APPLICATION_ID + ".provider";

ヒント 以前は BuildConfig.PACKAGE_NAME

それだ! これで魔法のように動きます。SyncAdapter を使用する場合は、このまま読み進めてください!


SyncAdapterのアップデート(2014.11.14)

改めて現在の設定から説明します。

  • Android Studio Beta 0.9.2
  • Gradle プラグイン 0.14.1
  • Gradle 2.1

基本的に、異なるビルドのためにいくつかの値をカスタマイズする必要がある場合、build.gradleファイルからそれを行うことができます。

  • 使用 buildConfigField からアクセスできるように BuildConfig.java クラス
  • 使用 resValue を使って、リソースからアクセスすることができます。 文字列/あなたの値

リソースの代わりとして、buildTypeやflavourディレクトリを別に作成し、その中でXMLや値をオーバーライドすることができます。しかし、以下の例では使用しません。


build.gradle ファイルに以下を追加してください。

defaultConfig {
    resValue "string", "your_authorities", applicationId + '.provider'
    resValue "string", "account_type", "your.syncadapter.type"
    buildConfigField "String", "ACCOUNT_TYPE", '"your.syncadapter.type"'
}

buildTypes {
    debug {
        applicationIdSuffix ".debug"
        resValue "string", "your_authorities", defaultConfig.applicationId + '.debug.provider'
        resValue "string", "account_type", "your.syncadapter.type.debug"
        buildConfigField "String", "ACCOUNT_TYPE", '"your.syncadapter.type.debug"'
    }
}

で結果を見ることができます。 BuildConfig.java クラス

public static final String ACCOUNT_TYPE = "your.syncadapter.type.debug";

であり build/generated/res/generated/debug/values/generated.xml にあります。

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <!-- Automatically generated file. DO NOT MODIFY -->
    <!-- Values from default config. -->
    <item name="account_type" type="string">your.syncadapter.type.debug</item>
    <item name="authorities" type="string">com.example.app.provider</item>

</resources>


あなたの authenticator.xml は、build.gradleファイルで指定されたリソースを使用します。

<?xml version="1.0" encoding="utf-8"?>
<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
                       android:accountType="@string/account_type"
                       android:icon="@drawable/ic_launcher"
                       android:smallIcon="@drawable/ic_launcher"
                       android:label="@string/app_name"
/>


あなたの syncadapter.xml は同じリソースを再度使用し の文字列/オーソリティ

<?xml version="1.0" encoding="utf-8"?>
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
              android:contentAuthority="@string/authorities"
              android:accountType="@string/account_type"
              android:userVisible="true"
              android:supportsUploading="false"
              android:allowParallelSyncs="false"
              android:isAlwaysSyncable="true"
        />

ヒント オートコンプリート(Ctrl+Space)はこれらの生成されたリソースでは機能しませんので、手動で入力する必要があります。