Programing

동일한 클래스의 다른 버전에 대한 플레이버 빌드

lottogame 2020. 12. 1. 07:34
반응형

동일한 클래스의 다른 버전에 대한 플레이버 빌드


다음과 같은 구조의 프로젝트가 있습니다.

project/
   |
   |---src/
        |---flavorA2/
        |      |
        |      |---java/
        |      |     |---com.abc.flavorA.mk2
        |      |                 |-----classA.java
        |      |                 |-----classB.java
        |      |---res/
        |      |---AndroidManifest.xml
        |
        |---main
        |      |---java/
        |      |     |---com.abc.flavorA
        |      |                 |-----classA.java
        |      |                 |-----classB.java
        |      |                 |-----classC.java
        |      |                 |-----classD.java
        |      |---res/
        |      |    |---drawable/
        |      |    |---layout/
        |      |    |---values/
        |      |         
        |      |---AndroidManifest.xml
        |
        |---flavorA

flavorA에서 소스와 자산을 사용할 main완전히 동안 flavorA2몇 가지 작은 변화를 가지고 classAclassB패키지 이름도 변경됩니다 com.abc.flavorA.mk2.

다음 build.gradle과 같은 파일이 있습니다.

...
buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
    productFlavors {
        flavorA2 {
            packageName "com.abc.flavorA.mk2"
            versionCode 2
            versionName "1.0.1"
        }

        flavorA {
            packageName "com.abc.flavorA"
        }
    }
...

빌드 변형을 선택하여 코드를 실행합니다 flavorA2. 그러나 실행 결과는 gradle이 내부에서 변경된 버전을 사용하는 대신 클래스 ( classAclassB)를 여전히 선택한다는 것을 보여줍니다 .mainflavorA2

여기에 뭔가 빠졌나요?


두 개의 다른 패키지 아래에 클래스가 있으므로 완전히 다른 클래스입니다. 따라서 클래스는 서로를 대체하지 않습니다.

플레이버를 사용하면 클래스 파일을 재정의 할 수 없습니다. 따라서 원하는 것을 달성하는 한 가지 방법은 이러한 클래스 main를에서 flavorA.

따라서 다음과 같은 것이 있습니다.

project/
   |
   |---src/
        |---flavorA2/
        |      |
        |      |---java/
        |      |     |---com.abc
        |      |                 |-----classA.java
        |      |                 |-----classB.java
        |      |---res/
        |      |---AndroidManifest.xml
        |
        |---main/
        |      |---java/
        |      |     |---com.abc.flavorA
        |      |                 |-----classC.java
        |      |                 |-----classD.java
        |      |---res/
        |      |    |---drawable/
        |      |    |---layout/
        |      |    |---values/
        |      |         
        |      |---AndroidManifest.xml
        |
        |---flavorA/
        |      |---java/
        |      |     |---com.abc
        |      |                 |-----classA.java
        |      |                 |-----classB.java

이렇게하면 플레이버를 선택할 때마다 ClassA 및 ClassB의 한 버전 만 표시됩니다.


주요 빌드 변형에서, 클래스 A는 com.abc.flavorA.classA, 그리고에서 flavorA2그것의 com.abc.flavorA.mk2.classA. 이들은 두 개의 서로 다른 정규화 된 클래스 이름이므로 두 개의 서로 다른 클래스입니다.

You can't really override entire classes in a flavor. Depending on what you want to do, you might want to look into the BuildConfig mechanism -- in short, this is a class that's generated by the build system which can have values or statements that vary depending on the build type and flavor. You can have runtime code that looks at constants in that class and varies its behavior.

See Android Studio Update 0.4.0 could not find buildConfig() for more information on the syntax, but in brief, it looks like this:

productFlavors {
    flavor {
      buildConfigField "boolean", "MY_FLAG", "true"
    }
}

You need to specify sourceSets in your build file. You need to modify your directory structure to make it so that only the folder names are different, everything under the java directory should be the same, so remove the mk2 from the class name. I'm not sure if the syntax is entirely correct but it should look like this:

android {
    sourceSets {
        flavorA {
            java {
                srcDirs = ['src/flavorA/java']
            }
        }

        flavorA2 {
            java {
                srcDirs = ['src/flavorA2/java']
            }
        }
    }
}

참고URL : https://stackoverflow.com/questions/23698863/build-flavors-for-different-version-of-same-class

반응형