[解決済み] Gradleでビルドタイプを使用し、ContentProviderを使用する同じアプリを1つのデバイスで実行する。
質問
デバッグアプリにパッケージ名のサフィックスを追加するように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)はこれらの生成されたリソースでは機能しませんので、手動で入力する必要があります。
関連
-
[解決済み】パッケージ名(Google Analytics)に一致するクライアントが見つからない - 複数のproductFlavorsとbuildTypes
-
[解決済み] Gradleを使用して1つのユニットテストクラスのみを実行する方法
-
[解決済み] エラーメッセージ "Android Gradle plugin requires Java 11 to run. 現在、Java 1.8を使用しています"
-
[解決済み] Gradle for Androidを使用して、外部のaarパッケージを手動でインクルードする方法
-
[解決済み] Android- Error:Execution failed for task ':app:transformClassesWithDexForRelease'.
-
[解決済み] 設定ページに移動せずに位置情報サービスをオンにする
-
[解決済み] EclipseのAndroidプロジェクトにライブラリ/JARを追加する
-
[解決済み] Android StudioからADBを手動で再起動する方法
-
[解決済み] android:fontFamily="sans-serif-light "と同等の機能をJavaコードで実現するには?
-
[解決済み] Android端末のシリアルナンバーを調べるには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ArrayAdapter<myClass> の使用方法
-
[解決済み] Nexus 4でUSBデバッグモードを見つける方法とオンにする方法
-
[解決済み] Android Webview - キャッシュを完全に削除する
-
[解決済み] Android - タイトルバーに戻るボタンが表示される
-
[解決済み] Studio 3.4 をアップデートしたら、引数の leftShift() メソッドが見つかりませんでした。
-
[解決済み] Android 6.0でBluetooth Low Energyスキャンを使用するには位置情報を有効にする必要があります。
-
[解決済み] Error:No such property: GROUP for class: org.gradle.api.publication.maven.internal.ant.DefaultGroovyMavenDeployer
-
[解決済み] Fragment ActionBarCompatの内部からgetSupportActionBarを取得する。
-
[解決済み] Android端末のシリアルナンバーを調べるには?
-
[解決済み] Android - logcat メッセージの最大長を設定する