빌드 풍미 사용-소스 폴더 구조 및 올바르게 build.gradle com.foo.test srcflavor1의 경우 폴더를 마우스 오른쪽 버튼으로

참고 : Xavier의 답변 후 수정 된 답변

Android Studio에서 하나의 동일한 응용 프로그램 프로젝트에 다른 빌드 풍미 를 사용하려고합니다 . 그러나 적절하게 작동하도록 구성하는 데 끔찍한 시간이있는 것 같습니다.

단계 :

  1. ‘Test’라는 새 Android Studio 프로젝트를 만듭니다.
  2. build.gradle *를 열고 다음 행을 추가하십시오.

    productFlavors {
    flavor1 {
        packageName 'com.android.studio.test.flavor1'
        }
    flavor2 {
        packageName 'com.android.studio.test.flavor2'
        }
    }
  3. Android Studio를 다시 시작한 후 Build Variants 섹션에 4 개의 빌드 변형이 표시 됩니다. 우리는 지금까지 제품 맛을 설정하는 데 성공했습니다. **
  4. 에 대한 새로운 소스 폴더 생성 flavor1을 ; 그러나 올바른 방법으로하고 있는지 확실하지 않습니다. 내가 한 방법은 다음과 같습니다.

    • 이 프로젝트의 패키지 이름은 다음과 같습니다. com.foo.test
    • srcflavor1의 경우 폴더를 마우스 오른쪽 버튼으로 클릭하면 실제로 구조가와 같은 방식으로 탐색기에서 개별 폴더를 만들었습니다 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의 패키지가 릴리스 키로 서명되었습니다.

심판 : https://developer.android.com/studio/build/build-variants.html#signing,http://blog.brainattica.com/how-to-work-with-flavours-on-android/


답변

에 새 맛을 추가 한 후 프로젝트다시로드 해야합니다 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'
    }
}


답변