동일한 클래스의 다른 버전에 대한 플레이버 빌드
다음과 같은 구조의 프로젝트가 있습니다.
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
몇 가지 작은 변화를 가지고 classA
와 classB
패키지 이름도 변경됩니다 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이 내부에서 변경된 버전을 사용하는 대신 클래스 ( classA
및 classB
)를 여전히 선택한다는 것을 보여줍니다 .main
flavorA2
여기에 뭔가 빠졌나요?
두 개의 다른 패키지 아래에 클래스가 있으므로 완전히 다른 클래스입니다. 따라서 클래스는 서로를 대체하지 않습니다.
플레이버를 사용하면 클래스 파일을 재정의 할 수 없습니다. 따라서 원하는 것을 달성하는 한 가지 방법은 이러한 클래스 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
'Programing' 카테고리의 다른 글
PHP 이미지 업로드 보안 검사 목록 (0) | 2020.12.02 |
---|---|
Android : 버튼 텍스트 및 배경색 변경 (0) | 2020.12.01 |
Travis-CI를 구성하여 풀 리퀘스트를 빌드하고 중복없이 마스터에 병합하는 방법 (0) | 2020.12.01 |
Docker 컨테이너를 중지 / 시작하지 않는 파일을 편집하는 방법 (0) | 2020.12.01 |
웹 사이트 API의 표준은 무엇입니까? (0) | 2020.12.01 |