Gradle のビルドタイプを使用して、ContentProvider を使用する同じアプリを 1 つのデバイスで実行する 質問する

Gradle のビルドタイプを使用して、ContentProvider を使用する同じアプリを 1 つのデバイスで実行する 質問する

デバッグ アプリにパッケージ名のサフィックスを追加するように Gradle を設定しました。これにより、使用しているリリース バージョンとデバッグ バージョンを 1 台の電話で使用できるようになります。私はこれを参照していました:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-ビルドタイプ

私の build.gradle ファイルは次のようになります。

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

アプリで ContentProvider を使い始めるまではすべて正常に動作します。結果は次のようになります:

Failure [INSTALL_FAILED_CONFLICTING_PROVIDER]

これは、2 つのアプリ (リリースとデバッグ) が同じ ContentProvider 権限を登録しているために発生すると理解しています。

これを解決する可能性が 1 つあります。正しく理解していれば、ビルド時に使用するさまざまなファイルを指定できるはずです。次に、さまざまなリソース ファイルにさまざまな権限を配置し (マニフェストから権限を文字列リソースとして設定)、デバッグ ビルドにさまざまなリソースを使用するように Gradle に指示できるはずです。これは可能ですか? 可能であれば、それを実現する方法についてのヒントがあればありがたいです。

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

ベストアンサー1

既存の回答はどれも私を満足させませんでしたが、Liberty はそれに近いものでした。そこで、私は次のようにしています。まず、現時点では、次のことに取り組んでいます。

  • Android Studio ベータ 0.8.2
  • Gradle プラグイン 0.12.+
  • グラドル1.12

私のゴール同じデバイス上で同じ を使用してDebugバージョンとバージョンを同時に実行することです。ReleaseContentProvider


ビルドアプリのデバッグビルドのサフィックスを設定します:

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 ベータ 0.9.2
  • Gradle プラグイン 0.14.1
  • グラドル2.1

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

  • 使用ビルド構成フィールドBuildConfig.javaクラスからアクセスするには
  • 使用リソースからアクセスする例@文字列/あなたの値

リソースの代替として、別の buildType または flavor ディレクトリを作成し、その中の XML または値をオーバーライドすることもできます。ただし、以下の例ではこれを使用しません。


ビルドファイルに以下を追加します。

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"'
    }
}

結果は次のようになりますビルド構成.javaクラス

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

そしてビルド/生成/res/生成/デバッグ/値/生成.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>

あなたの認証子.xmlbuild.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"
/>

あなたの同期アダプタ.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)はこれらの生成されたリソースでは機能しないため、手動で入力する必要があります。

おすすめ記事