참고 : Xavier의 답변 후 수정 된 답변
Android Studio에서 하나의 동일한 응용 프로그램 프로젝트에 다른 빌드 풍미 를 사용하려고합니다 . 그러나 적절하게 작동하도록 구성하는 데 끔찍한 시간이있는 것 같습니다.
단계 :
- ‘Test’라는 새 Android Studio 프로젝트를 만듭니다.
-
build.gradle *를 열고 다음 행을 추가하십시오.
productFlavors { flavor1 { packageName 'com.android.studio.test.flavor1' } flavor2 { packageName 'com.android.studio.test.flavor2' } }
- Android Studio를 다시 시작한 후 Build Variants 섹션에 4 개의 빌드 변형이 표시 됩니다. 우리는 지금까지 제품 맛을 설정하는 데 성공했습니다. **
-
에 대한 새로운 소스 폴더 생성 flavor1을 ; 그러나 올바른 방법으로하고 있는지 확실하지 않습니다. 내가 한 방법은 다음과 같습니다.
- 이 프로젝트의 패키지 이름은 다음과 같습니다.
com.foo.test
src
flavor1의 경우 폴더를 마우스 오른쪽 버튼으로 클릭하면 실제로 구조가와 같은 방식으로 탐색기에서 개별 폴더를 만들었습니다src/flavor1/java/com/foo/test/MainActivity.java
.- 위의 내용은 ‘java’폴더가 파란색 이므로 IDE가 활성 소스 디렉토리를 알고 있음을 의미합니다. 또한 패키지가 자동으로 생성되었습니다. 그럼에도 불구하고 중복 클래스가 발견되었다는 경고가 표시됩니다. 여기 스크린 샷을 참조하십시오.
- flavor2의 경우 패키지를 수동으로 만들려고 시도했지만 flavor2의 ‘src’폴더가 파란색이 아니므로 마우스 오른쪽 버튼을 클릭하면 옵션이 다르므로 ‘새 패키지’를 사용할 수 없습니다. 여기 이미지를 참조하십시오.
- flavor1의 경우 파란색으로 바뀌는 ‘res’디렉토리도 만들었지 만, 그럼에도 불구하고 다른 리소스를 사용하려는 경우 Android 리소스 파일 또는 Andorid 리소스 디렉토리를 만들 수는 없습니다. 다른 풍미를위한 resoruces.
- 이 프로젝트의 패키지 이름은 다음과 같습니다.
내가 뭔가 잘못하고 있습니까? 아니면 뭔가 빠졌습니까? 더 자세한 정보가 필요하면 알려주십시오.
* 내 프로젝트에는 두 개의 build.gradle 파일 이있는 것 같습니다 . 하나는 프로젝트 폴더의 루트 (\ GradleTest)에 있으며 비어 있습니다. 두 번째 것은 \ GradleTest의 하위 폴더 루트에 있으며 ‘GradleTest'(GradleTest-GradleTest)라고도합니다. 그러므로 이것이 제가 편집 한 것입니다.
** gradle 설정을 확인했으며 자동 가져 오기 사용 이 이미 활성화되어 있습니다. 그럼에도 불구하고 build.gradle 파일을 변경해도 빌드 변형이 자동으로 업데이트되지는 않습니다 . 참고 : 나는 또한 Build-Rebuild Project 및 / 또는 Build-Make Project, no-go를 사용해 보았습니다. 여전히 프로젝트를 닫고 변경 사항을 적용하려면 다시 열어야합니다.
답변
Studio 환경 설정에있는 경우 Gradle 섹션에서 프로젝트에 대해 자동 가져 오기를 활성화 할 수 있습니다 (나중에 기본적으로 활성화). 이렇게하면 Studio는 build.gradle을 편집 할 때마다 다시 가져올 수 있습니다.
플레이버를 생성한다고해서 사용자 정의 코드를 사용한다는 의미는 아니므로 폴더를 생성하지 않습니다. 직접 작성해야합니다.
내 IO 토크 를 보면 맛과 빌드 유형의 값을 혼합하여 변형을 만드는 방법을 볼 수 있습니다.
Java 소스의 경우 :
src/main/java
src/flavor1/java
src/debug/java
3 개는 모두 단일 출력을 생성하는 데 사용됩니다. 이는 동일한 클래스를 정의 할 수 없음을 의미합니다.
두 가지 플레이버에서 동일한 클래스의 다른 버전을 사용하려면 두 가지 플레이버에서 모두 동일한 클래스를 작성해야합니다.
src/flavor1/java/com/foo/A.java
src/flavor2/java/com/foo/A.java
그리고 src / main / java의 코드는 할 수 있습니다
import com.foo.A
선택한 맛에 따라 올바른 버전의 com.foo.A가 사용됩니다.
이것은 또한 두 버전의 A가 동일한 API를 가져야 함을 의미합니다 (적어도 src / main / java / …
수정 된 질문과 일치하도록 편집
또한 상호 배타적 인 소스 폴더에만 동일한 A 클래스를 배치하는 것이 중요합니다. 이 경우 src / flavor1 / java와 src / flavor2 / java는 함께 선택되지 않지만 main과 flavor1은 함께 선택됩니다.
다른 플레이버에서 다른 버전의 활동을 제공하려면 src / main / java에 두지 마십시오.
3 개의 플레이버가 있고 플레이버 1에 대한 사용자 정의 1 개만 원하는 경우, 플레이버 2와 플레이버 3가 동일한 활동을 공유 한 경우 해당 2 개의 다른 활동에 대한 공통 소스 폴더를 작성할 수 있습니다. 새 소스 폴더를 만들고이를 사용하도록 소스 세트를 구성 할 때 유연성이 뛰어납니다.
다른 포인트로 :
두 번째 플레이버 소스 폴더가 파란색이 아닌 것이 정상입니다. 활성화하려면 2 차 플레이버로 전환 한 다음 패키지와 클래스를 내부에서 만들 수 있습니다. 그때까지 Studio는 소스 폴더로 간주하지 않습니다. IDE에서 비활성 소스 폴더를 인식하도록 향후이를 개선 할 수 있기를 바랍니다 .
res 폴더에 리소스 파일을 만들 수없는 것도 정상이라고 생각합니다. 이러한 추가 리소스 폴더를 모두 처리하도록 메뉴 시스템이 업데이트되지 않았습니다. 이것은 나중에 올 것이다.
답변
Android의 “제품 맛”
다른 호스트, 아이콘 또는 패키지 이름을 사용하여 동일한 앱의 다른 버전에 의존하는 방법에 대해 때때로 질문을 받았습니다.
이를 수행해야하는 많은 이유와 한 가지 쉬운 방법이 있습니다 : 제품 맛.
앞에서 설명한 이런 종류의 것들을 build.gradle 스크립트에서 정의 할 수 있습니다.
제품의 맛
이 기사의 일부는 제품의 맛에 대한 생각을 담고 있습니다. Android 설명서와 관련하여 :
제품 플레이버는 프로젝트별로 애플리케이션 빌드의 사용자 정의 버전을 정의합니다. 단일 프로젝트는 생성 된 애플리케이션을 변경하는 다른 특징을 가질 수 있습니다.
그것들을 어떻게 정의 할 수 있습니까? 어떤 풍미를 정의하려는 build.gradle에 작성해야합니다.
productFlavors {
...
devel {
...
}
prod {
...
}
}
이제 우리는 앱의 두 가지 맛을 갖게 될 것입니다. Build Variants 탭의 Android Studio에서도 확인할 수 있습니다
변형 빌드
여러 패키지 이름
개발 상태의 앱 하나와 프로덕션 상태의 앱 하나를 전화기에 설치하려면 어떻게해야합니까? 아시다시피, 동일한 패키지 이름으로 하나의 앱만 설치할 수 있습니다 (휴대 전화에 설치된 것과 동일한 새 APK를 설치하려고하면 업데이트하려고합니다).
당신이해야 할 유일한 것은 각 제품 맛에 그것을 정의하는 것입니다 :
android {
productFlavors {
devel {
applicationId "zuul.com.android.devel"
}
prod {
applicationId "zuul.com.android"
}
}
}
특징에 따라 여러 호스트에 요청 보내기 이전과 같이 제품 특징 구성 필드에 일부 매개 변수를 포함해야합니다.
android {
productFlavors {
devel {
applicationId "zuul.com.android.devel"
buildConfigField 'String', 'HOST', '"http://192.168.1.34:3000"'
}
prod {
applicationId "zuul.com.android"
buildConfigField 'String', 'HOST', '"http://api.zuul.com"'
}
}
}
예를 들어,이 서버를 Retrofit과 통합하여 사용자가 가리키는 서버를 처리하지 않고 적절한 서버에 요청을 보내는 방법을 보여 주려고합니다. 이 경우 Zuul Android 앱의 일부입니다.
public class RetrofitModule {
public ZuulService getRestAdapter() {
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(BuildConfig.HOST)
.setLogLevel(RestAdapter.LogLevel.FULL)
.build();
return restAdapter.create(ZuulService.class);
}
}
보시다시피 BuildConfig 클래스를 사용하여 방금 정의한 변수에 액세스해야합니다.
코드를 통해 사용 가능한 모든 변수 HOST 변수는 코드에서 노출 할 수있는 유일한 변수가 아닙니다. 당신이 원하는대로 할 수 있습니다 :
prod {
applicationId "zuul.com.android"
buildConfigField 'String', 'HOST', '"http://api.zuul.com"'
buildConfigField 'String', 'FLAVOR', '"prod"'
buildConfigField "boolean", "REPORT_CRASHES", "true"
}
다음과 같이 액세스 할 수 있습니다.
BuildConfig.HOST
BuildConfig.FLAVOR
BuildConfig.REPORT_CRASHES
풍미마다 다른 아이콘 풍미마다 다른 아이콘을 원한다면 열고있는 것을 시각적으로 감지 할 수 있습니다 (이름으로도 가능하지만 공간에 맞지 않을 수 있습니다!). 각 특징에 대한 새로운 디렉토리 구조를 정의합니다.
방금 사용한 예제에서는 devel과 prod의 두 가지 맛이 있습니다. 그런 다음 두 가지 새로운 디렉토리 구조를 정의하여 원하는 리소스를 정의 할 수 있습니다.
구조
이것은 strings.xml, integers.xml, arrays.xml
등과 같은 다른 유형의 리소스와 함께 작동합니다 .
서명 설정 구성
Gradle 빌드 구성을 사용하여 릴리스 빌드 유형에 대한 서명 구성을 수동으로 구성하려면 다음을 수행하십시오.
1. 키 저장소를 작성하십시오. 키 저장소는 개인 키 세트를 포함하는 이진 파일입니다. 키 저장소를 안전하고 안전한 곳에 보관해야합니다. 2. 개인 키를 만듭니다. 개인 키는 개인 또는 회사와 같이 앱으로 식별 할 엔티티를 나타냅니다. 3. 서명 구성을 모듈 수준 build.gradle 파일에 추가하십시오.
android {
...
defaultConfig {...}
signingConfigs {
release {
storeFile file("myreleasekey.keystore")
storePassword "password"
keyAlias "MyReleaseKey"
keyPassword "password"
}
}
buildTypes {
release {
...
signingConfig signingConfigs.release
}
}
}
서명 된 APK 생성 :
서명 된 APK를 생성하려면 기본 메뉴에서 빌드> 서명 된 APK 생성을 선택하십시오. app / build / apk / app-release.apk의 패키지가 릴리스 키로 서명되었습니다.
답변
에 새 맛을 추가 한 후 프로젝트 를 다시로드 해야합니다 build.gradle
. 그런 다음 빌드 변형보기에 4 개의 빌드 변형이 표시됩니다 (창 왼쪽 가장자리에서 액세스).
추가 소스 디렉토리에 관한 것 같습니다 당신은 손을 작성해야 src/flavor1/java
하고 src/flavor2/java
. 당신은 “빌드 변형”보기에 맛을 변경하면 변경됩니다 것을 볼 현재 활성화 된 소스 디렉토리를 (그것이 때 디렉토리가 파란색 활성 소스 디렉토리 )
마지막으로, Gradle을이 개체를 만드는 것을 의미한다 “Gradle을 새 맛에 대한 새로운 sourceSets 만들 것입니다” android.sourceSets.flavor1
하고 android.sourceSets.flavor2
당신이 당신의 build.gradle 스크립트에서 사용할 수 있습니다. 그러나 이러한 객체는 동적으로 생성되므로 build.gradle
(이 문서를 읽는 것이 좋습니다 : http://www.gradle.org/docs/current/userguide/tutorial_using_tasks.html 특히 6.6 : 동적 작업 생성. gradle 스크립트는 그루비 스크립트이므로 그루비에 익숙해지는 것이 좋습니다.)
답변
프로젝트를 Gradle로 마이그레이션 할 때도 같은 문제가있었습니다. 문제는 빌드가 적절한 리소스 폴더를 찾지 못했다는 것입니다. build.gradle의 android 요소 아래에 이것을 추가하여 수정했습니다.
sourceSets {
main {
res.srcDirs = ['myProject/res']
}
}
답변
중요하고 꽤 오랫동안 나를 막 았던 것은 gradle의 풍미 정의 내부에 정의 된 패키지와 달리 패키지와 일치 해야하는 풍미 이름입니다. 예를 들면 다음과 같습니다.
src/flavor1/java/com/foo/A.java
일치합니다
productFlavors {
flavor1 {
packageName 'com.android.studio.test.foobar'
}
}
그러나
src/foobar/java/com/foo/A.java
flavor1 빌드에는 사용되지 않습니다.
답변
gradle에서 :
빌드 유형의 경우 다음이 필요합니다.
buildTypes {
release{
//proguard, signing etc.
}
debug {
//development
}
}
}
그리고 맛을 위해 필요한 것을 추가하십시오
productFlavors {
pro {
applicationIdSuffix '.paid'
buildConfigField 'boolean', 'PRO', 'true'
}
free {
applicationIdSuffix '.free'
buildConfigField 'boolean', 'PRO', 'false'
}
}