6

Gradle を使用するようにプロジェクトを移行しました (古い Android プロジェクト構造を使用)。最近、Android Studio を v0.2 にアップグレードしたため、Android gradle プラグイン v0.5 を使用する必要がありました。デバッグ/リリース時に、定義したフレーバーのいずれかを使用してプロジェクトをビルドできます。

次のシナリオを使用すると、何か問題が発生します。

  • gradlew clean を実行する
  • gradlew assembleTestenvDebug を実行します
  • この時点での Gradle 出力:

ビルド成功

  • styles.xmlファイルの任意の値を変更します
  • gradlew assembleTestenvDebug を実行します(再度)
  • この時点での Gradle 出力:

/Users/myuser/Project/src/com/namespace/project/views/SomeCustomView.java:60: エラー: シンボルが見つかりません mSize = arr.getInt(R.styleable.SomeCustomView_some_custom_styleable, 0);

Gradle は、attrs.xml で宣言したすべてのカスタム xml 属性について不平を言うようになりました。styles.xml を変更するたびにプロジェクトをクリーンアップして再構築する必要があるため、これは私を夢中にさせています

私を助けてください。

ありがとう!

私のプロジェクト構造:

- Project
- . AndroidManifest.xml
- . assets/
- . build/
- . build.gradle
- . gen/
- . gradle/
- . gradle.properties
- . gradlew
- . libs (includes .jar files)
- . modules
- . . library_projectA
- . . library_projectB
- . out
- . project.properties
- . res

- . res_testenv
- . . values
- . . . strings.xml

- . res_prodenv
- . . values
- . . . strings.xml

- . settings.gradle
- . src/
- . . com/
- . . . namespace/
- . . . . android/ 

プロジェクト ディレクトリの build.gradle:

task wrapper(type: Wrapper) {
    gradleVersion = '1.6'
}

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.5.+'
    }
}

apply plugin: 'android'

dependencies {
    compile 'com.android.support:support-v4:13.0.0'
    compile fileTree(dir: 'libs', include: '*.jar')
    compile project(':modules:libprojectA')
    compile project(':modules:libprojectB')
}

android {
    compileSdkVersion 17
    buildToolsVersion "17.0.0"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 17
    }

    signingConfigs {
        release {

        }
    }

    buildTypes {
        debug {
            runProguard false
        }

        alphaRelease {
            runProguard false
            zipAlign true
            signingConfig signingConfigs.release
        }

        release {
            runProguard true
            proguardFile 'proguard-project.txt'
            signingConfig signingConfigs.release
        }
    }

    productFlavors {
        testenv {}
        prodenv {}
    }

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
            aidl.srcDirs = ['src']
        }

        testenv {}
        prodenv {}
    }

    android.sourceSets.testenv {
        res.srcDirs = ['res_test']
    }

    android.sourceSets.prodenv {
        res.srcDirs = ['res_prod']
    }
}

if (project.hasProperty('storeFile') && project.hasProperty('storePassword') &&
        project.hasProperty('keyAlias') && project.hasProperty('keyPassword')) {
    android.signingConfigs.release.storeFile = file(storeFile)
    android.signingConfigs.release.storePassword = storePassword
    android.signingConfigs.release.keyAlias = keyAlias
    android.signingConfigs.release.keyPassword = keyPassword
}

各ライブラリ プロジェクトの build.gradle ファイル:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.5.+'
    }
}

apply plugin: 'android-library'

dependencies {
    compile 'com.android.support:support-v4:13.0.0'
}

android {
    compileSdkVersion 17
    buildToolsVersion "17.0.0"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 17
    }

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            res.srcDirs = ['res']
        }
    }
}

添付スタックトレース:

org.gradle.api.tasks.TaskExecutionException: タスク ':compileTestenvDebug' の実行に失敗しました。org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69) で org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46) で org.gradle org.gradle.internal. Factory$1.create(Factories.java:22) at org.gradle.cache.internal.DefaultCacheAccess.longRunningOperation(DefaultCacheAccess.java:179) at org.gradle.cache.internal.DefaultCacheAccess. 詳細については、コンパイラ エラー出力を参照してください。org.gradle.api.internal.tasks.compile.jdk6.Jdk6JavaCompiler.execute(Jdk6JavaCompiler.java:42) で org.gradle.api.internal.tasks.compile.jdk6.Jdk6JavaCompiler.execute(Jdk6JavaCompiler.java:33) でorg.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.delegateAndHandleErrors(NormalizingJavaCompiler.java:95) で org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:48) で org.gradle .api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:34) org.gradle.api.internal.tasks.compile.DelegatingJavaCompiler.execute(DelegatingJavaCompiler.java:29) org.gradle.api.internal org.gradle.api.internal の .tasks.compile.DelegatingJavaCompiler.execute(DelegatingJavaCompiler.java:20)。

4

2 に答える 2

2

私には理論がありますが、間違っている可能性があります。

ユーザーガイドを見ると、カスタムソースセットを直接追加することについて言及されていません。testenvこれは、それがフレーバーまたは buildType の一部でない限り、ビルド システムが sourceSet の変更を検出しないことを意味する場合があります。

私が試したいのは、環境をフレーバー グループとして定義することです。特定の要件についてはわかりませんが、次のようになります。

flavorGroups "environment", "flavors"
productFlavors {
    testenv { 
        flavorGroup "environment"
    }

    prodenv {
        flavorGroup "environment"
    }

    flavorA {
        flavorGroup "flavors"
        ...
    }

    flavorB {
        flavorGroup "flavors"
        ...
    }

これは、これら 2 つで構成できるビルド ( app-flavor1-testenv-debug.apk. ただの考えですが、私はそれをテストしていません。

また、これが機能するようになったら、新しいレイアウトに移行することをお勧めします。そうすれば、および とのsrc/main/resマージの規則が存在する場合は、 で言及する必要さえなく、それらに依存できます。src/testenv/ressrc/debug/resbuild.gradle

于 2013-07-17T16:58:43.713 に答える