7

次のプロジェクト設定を実現するために、gradle/android studio で製品バリアントを使用しています。

  1. 1 つの Android Studio プロジェクトで 80% 類似している 2 つのアプリ。
  2. 各アプリには独自のマニフェスト パッケージ パスが必要です (基本的に、独自の Google API とプッシュ キーを使用して、2 つの独立したアプリのように動作する必要があります)。

これを達成するために複数のチュートリアル(プレースホルダー、複数のマニフェスト)に従いましたが、何も機能しません。

このチュートリアルに続いて、次のことを行いました

私のbuild.gradle:

android {
compileSdkVersion 19
buildToolsVersion '20'

defaultConfig {
    minSdkVersion 10
    targetSdkVersion 19
    versionCode 1
    versionName "1.0"
}

buildTypes {
    release {
        runProguard false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
    }
}

productFlavors {
    app1 {
        packageName "com.test.app1"
        //applicationId "com.test.app1"
    }

    app2 {
        packageName "com.test.app2"
        //applicationId "com.test.app2"
    }
}}

そしてここに私のマニフェストファイルがあります。

ソース/メイン/マニフェスト:

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

<application>
</application>

ソース/app1/マニフェスト:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        android:name="com.test.app1”
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <activity
            android:name="com.test.app1.MainActivity"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            android:screenOrientation="portrait" >
        </activity>
    </application>
</manifest>

ソース/app2/マニフェスト:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        android:name="com.test.app2”
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <activity
            android:name="com.test.app2.MainActivity"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            android:screenOrientation="portrait" >
        </activity>
    </application>
</manifest>

これにより、次のエラーメッセージが表示されます。

Manifest merger failed : Main AndroidManifest.xml at AndroidManifest.xml manifest:package attribute is not declared

残念ながら、アプリには異なるパッケージ パスが必要なため、個々のマニフェスト タグにパッケージを設定することはできません。とにかくそれを行うと、パッケージの値が異なるため、マージはマニフェストファイルをマージできません。packageName に加えて、「applicationId」も設定しようとしましたが、これも機能しません。このようなプレースホルダーを使用してpackage="${applicationId}"も、変数値が解決されないため機能しません。

この問題を解決する方法はありますか? 私はgradle 0.12.2でAndroid Studio 0.8.2を使用しています

4

4 に答える 4

4

安心して追加できます

<manifest xmlns:android="..."
  package="com.test.app">
</manifest>

あなたのメインマニフェストで。

ただし、build.gradle ではapplicationIdなく、使用する必要があります。build.gradlepackageNameのは、異なるビルド中にこの値を上書きします。applicationId

これを行うより良い方法は、さまざまな製品フレーバーapplicationIdSuffixの代わりに使用することです.applicationId

フィールドはメイン マニフェストに存在する必要があります。

于 2014-08-12T12:57:49.660 に答える
3

src/app1/AndroidManifest.xmlあなたとsrc/app2/AndroidManifest.xmlあなたに加えて、src/main/AndroidManifest.xml両方のアプリが共有する要素を含むことができる があります。

フレーバー固有のマニフェストでは、属性を指定する必要はありません。packageこれは、 で既に定義されているためbuild.gradleです。

ただし、メイン マニフェストでは、package属性を定義して、共有リソースに使用するパッケージ名を指定する必要があります。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.test.app">
</manifest>

その名前を使用している依存ライブラリがないことを確認してください。そうしないと、別のビルド エラーが発生します。

さらに、アプリの識別に使用されるパッケージ名を、内部リソース アクセスに使用されるパッケージ名から切り離すために、applicationId代わりにpackageNamein youを指定する必要があります。build.gradle

詳細については、このリンクを確認してください: http://tools.android.com/tech-docs/new-build-system/applicationid-vs-packagename

于 2015-07-21T15:56:44.827 に答える
0

最初からやり直しましたが、今回は Android Studio が Variant 構成を生成してくれました (プロジェクト設定の下に、フレーバー、バリアントなどのタブがあります)。

また、各アプリ (バリアント) の識別は applicationId (バリアントの実際のパッケージ名とは関係ありません) によって行われるため、3 つのバリアントすべてのパッケージ名を同じ名前に変更することにしました。

pdegand59 の助けに感謝します!

于 2014-08-21T06:56:16.233 に答える
0

package="com.ex.app"すべてのフレーバーのマニフェストに同じものを入れてapplicationIdファイルに入れ、同じ問題を解決しましたuseOldManifestMerger truebuild.gradle

android {
    useOldManifestMerger true

    productFlavors{
        app1{
            applicationId = "com.ex.app1"
        }
        app2{
            applicationId = "com.ex.app2"
        }
    }
}
于 2014-08-20T12:35:46.310 に答える