2015-11-17 8 views
5

フレーバーを設定しようとしているので、同じコードを共有する同じプロジェクトで別のアプリケーションを作成できます...しかし、私は私は、フォルダWでcom.sharedid.appと呼ばれるプロジェクトを作成したAndroidスタジオでのフレーバーの使用 - 間​​違ったAndroidManifestの選択/非統合

...完全に正しいことをしています:\ androidのスタジオ・プロジェクトを\ sharedidこのため

は私が

を持っている\ 1) W:\ android-studio-projects \ sharedid \ app \ src \ mainのlookinでAndroidManifest.xmlを作成しましたこのようなグラム:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.sharedid.app" 
    android:versionCode="1" 
    android:versionName="1.0" 
> 
<activity android:name="com.shared.app.SharedMain" android:label="@string/MicMainName" > 
    <intent-filter> 
    <action android:name="android.intent.action.MAIN" /> 
    <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</activity> 
</manifest> 

2)W で:\ androidのスタジオ・プロジェクト\ sharedid \アプリ\ SRC \メイン\のJava ...私はすべての.javaファイルを持っている

3) Wで:\ androidのスタジオ・プロジェクト\ sharedid \アプリ\ SRC \メイン\ RES私はすべて私が持っている私の味についておよび/またはダミーリソース

を共有しています

1)私はWでのAndroidManifest.xmlを作成しました:アンドロイド・スタジオ・プロジェクト\ \ sharedid \アプリ\ SRC \ myflavour(このファイルはすべてのものを定義するものである - それはそれぞれの味のためunqiueです)

2) でW:\ androidのスタジオ・プロジェクト\ sharedid \アプリ\ SRC \ myflavour \ RES私は描画可能-hdpi conttainingは Wでグラフィック

3)単一のフォルダをvarioisている:\ androidのスタジオ・プロジェクトに\ sharedid \ app \ src \ myflavour \ assetsのすべての種類のデータ、設定、グラフィックファイルがあります。特定のアプリ。 *のWで )

4を(実行時にコードで読み取り):

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.myflavour.app" 
    android:versionCode="2" 
    android:versionName="2.0" 
> 
<uses-sdk 
    android:minSdkVersion="9" 
    android:targetSdkVersion="17" 
/> 
    <uses-feature android:glEsVersion="0x00020000" android:required="true" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/app_logo__forlarge" 
    android:label="@string/MicAppName" 
    android:theme="@style/MicTheme_myflavour" 
    android:name="com.shared.app.MicApp" 
> 
<provider 
    android:name="android.support.v4.content.FileProvider" 
    android:authorities="com.myflavour.app.fileprovider" 
    android:grantUriPermissions="true" 
    android:exported="false"> 
    <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_filepaths" /> 
</provider> 
<activity android:name="com.shared.app.SharedMain" android:label="@string/MicMainName" > 
    <intent-filter> 
    <action android:name="android.intent.action.MAIN" /> 
    <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</activity>   
<activity>...more...</activity>   
</application> 
</manifest> 
:アンドロイド・スタジオ・プロジェクト\ \ sharedid \アプリ\ SRC \ myfavlour *私は、次ののAndroidManifest.xmlファイルを持っています私の問題は、この

です

apply plugin: 'com.android.application' 

android { 
    signingConfigs { 
    } 
    compileSdkVersion 21 
    buildToolsVersion '21.1.2' 
    defaultConfig { 
     applicationId "com.sharedid.app" 
     minSdkVersion 9 
     targetSdkVersion 17 
    } 
    buildTypes { 
     release { 
      minifyEnabled true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' 
     } 
    } 
    repositories { 
     maven { url "https://jitpack.io" } 
    }  
    productFlavors { 
     myflavour { 
      applicationId "com.myflavour.app" 
     } 
    } 
    sourceSets { 
     main { 
     manifest.srcFile 'src/main/AndroidManifest.xml' 
     } 
     myflavour { 
     manifest.srcFile 'src/myflavour/AndroidManifest.xml' 
     } 
    }   
}  
dependencies { 
    compile 'com.android.support:support-v4:18.0.0' 
    compile 'com.google.android.gms:play-services:+' 
    compile 'com.android.support:appcompat-v7:21.1.2' 
    compile 'com.github.PhilJay:MPAndroidChart:v2.0.8' 
} 

:次のようになります(アプリモジュール)は、 "Gradleのを構築する" - ここに

はどのように "のGradleスクリプト" です

"ビルドバリアント"で "module = app"と "build-variant = com.myflavour.appDebug"を選択し、 "実行>デバッグ..."をクリックします。"エラー:デフォルトのアクティビティ私は右のそれabnoutていたら...私は味のためのファイルのデフォルトconventenionを使用するので、私はsourcesetsパスを定義する必要はありません味の私の研究から「

が見つかりません - そして、なぜそれが見えません。フレーバーのAndroidmanifestファイルが選択されていますか?参照用

リンクは、私が上で私の理解を基礎:この問題の根本を見つけるために、私の試みで

追加のトラブルシューティング

、Iマニフェスト合併がうまくいかないと思われ始めた。この疑惑の理由は、私が何の行動もしなかったことを無視して、コンパイルされたアプリをモバイル上にプッシュしようとすると、バージョン番号がモバイル明確なマニフェストにインストールされているバージョン番号よりも小さいという警告が表示されるファイルが使用されていました。

だから私は、エラーになりのsrc /メイン/ AndroidManifest.xmlを削除しようとしています:

A problem was found with the configuration of task ':app:checkmyflavourDebugManifest'. File W:\android-studio-projects\sharedid\src\main\AndroidManifest.xml' specified for property 'manifest' does not exist

これは、Android Studioは完全に私が実際にそれを使用するように指定していますことを無視していると信じて私をリードしますもう一つのマニフェストファイル...そして同じ時間に、私は正しいバリエーションビルドを構築するように見えるでしょう。

私はこの上の任意のコメント/分析をapreciateだろう - ちょうど(このスクリーンショットでは、私は共有/メイン削除experiementedてきた私の現在の設定の原因

スクリーンショット

の私の考えを確認しても、 androidmanifestファイルが、それ以外の場合は、完全な)

最新の更新

私はflavoを締結rsが動作していない/私のgradleの設定が間違っている必要があります。たとえば、建物のバリエーションを選択myflavourDebug Androidスタジオはgradleで定義されたマニフェストファイルを使用しません。これだけで問題がどこに依存しているかを判断するのに十分なはずです。

私のgradleファイルは何とか間違っているかもしれませんが、わかりませんが、私は正しいことに大いに注意しました。賞金が稼動している間に誰かが賞品を掲示したら、私は急いでそれを割り当てようとします。

+0

AndroidManifestはアクティビティを含むクラスを記述する必要があると思います。 – jrsall92

+0

それぞれの味は独自のAndroidManifestを持っています。マニフェストファイルをマージする方法に関するGoogle独自のドキュメントへのリンクは次のとおりです。https://developer.android.com/tools/building/manifest-merge.html - 多分私はそれを誤解してしまいました – Tom

+0

マニフェストファイルにはアクティビティクラスが必要です私はマニフェストファイルでそれを見ていない。アクティビティクラス名は何ですか?アプリケーションタグのマニフェストファイルに追加する必要があります。 –

答えて

3

私はこの問題はここにあると思う:

applicationId "com.myflavour.app" 

あなたのbuild.gradle内com.myflavour.appとしてあなたapplicationIsを定義します。 あなたのAndroidManifestで、あなたはあなたの主な活動として、

<activity android:name="com.shared.app.SharedMain" 
    android:label="@string/MicMainName" > 

を指定します。あなたの主な活動は、間違っていなければ、あなたのapplicationIdにちなんで命名されるべきです。したがって、基本的には、マニフェストのいずれかを変更して、活動をcom.myflavour.appとし、それに応じてパッケージを手配してください。そうでない場合は、同じapplicationIdを使用して味をつけることもできます。

+0

私の過去のすべてのアプリケーションで、私の主な活動はパッケージIDよりもdfferentlyという名前になっています... – Tom

+0

また、味の背後にあるポイントは、異なるアプリケーションIDで複数のフレーバーにわたって同じアクティビティを使用することです。決して一致しませんか? – Tom

2

フレーバを使用するすべてのマニフェストファイルを作成する必要はありません。すべてのクラスをsrc/mani/AndroidManifestに入れてください。xmlファイル。 それでも「インテントフィルタ」ブロックを上書きしないことによって、競合を削除し、両方のファイルを使用する場合:

<intent-filter> 
    <action android:name="android.intent.action.MAIN" /> 
    <category android:name="android.intent.category.LAUNCHER" /> 
</intent-filter> 

は一度だけ、それを使用してください。

そして最後に、あなたがそこからhttp://developer.android.com/tools/building/manifest-merge.html

速い引用の多くの有用な情報を見つけることができます:

それは異なるパッケージ名を持つマニフェストをマージすることはできません

During the build process, the manifest merge process stores a record of each merge transaction in the manifest-merger--report.txt file in the module build/outputs/logs folder. A different log file is generated for each of the module's build variants.

+0

さて、私はできる限りすべてをメインマニフェストに入れました。しかし、マニフェストファイルの "package"はどうですか? (私の問題は、マージが適切にマージされていないことがわかるので、マージがうまくいくように思えます。しかし、私はあなたが提案して報告した通りにやっていきます) – Tom

+0

フレーバーマニフェストにはまだ "provider"しかし、私はこのような情報をどのように扱うのですか:theme = "@ style/...."私は、単に各フレーバーでアンドロイドマニフェストをオーバーライド/マージできると思っていましたか? – Tom

+0

さまざまなことが試され、特定の組み合わせが動作しているように見えますが、次のようなランタイムエラーが発生します: "アクティビティを開始できませんComponentInfo {com.myflavour.app/com.shared.app.SharedMain}:java.lang.NullPointerException " somethngがうまくいくと思う。過去に私のアプリケーション間でコード化されたコードをコピーしていましたので、私は個別に動作することを知っています。私は "マニフェスト - 合併 - 報告"から – Tom

0


これは問題だと思います。
myflavourマニフェストからpackage="com.myflavour.app"を削除するだけです。

関連する問題