[안드로이드] kakao sample gradle 분석 3.applications.gradle
안녕하세요. 드리머즈입니다.
다음으로 볼 gradle파일은, applications/ 경로에 있는 applications.gradle 파일입니다.
역시 조금씩 나눠서 보겠습니다.
subprojects {
apply plugin: 'com.android.application'
android {
compileOptions.encoding = "UTF-8"
version = project.APP_VERSION
project.ext.set("defaultDeployPhase", "${project.hasProperty('deploy_phase') ? deploy_phase.toString() : "$DEFAULT_PHASE"}")
compileSdkVersion ANDROID_BUILD_SDK_VERSION
buildToolsVersion ANDROID_BUILD_TOOL_VERSION
defaultConfig {
minSdkVersion ANDROID_BUILD_MIN_SDK_VERSION
targetSdkVersion ANDROID_BUILD_TARGET_SDK_VERSION
versionCode Integer.parseInt(project.APP_VERSION)
versionName project.APP_VERSION_NAME
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
debug {
debuggable true
// minifyEnabled true
zipAlignEnabled true
// proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
lintOptions {
checkReleaseBuilds true
abortOnError false
checkAllWarnings true
xmlReport true
htmlReport true
disable "InvalidPackage", "MissingTranslation"
}
packagingOptions {
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
exclude 'META-INF/maven/com.google.guava/guava/pom.properties'
exclude 'META-INF/maven/com.google.guava/guava/pom.xml'
}
android.applicationVariants.all { variant ->
variant.outputs.all { output ->
output.processManifest.doLast {
String manifestPath = "$manifestOutputDirectory/AndroidManifest.xml"
println ">> processManifest $manifestPath"
def appKeyName = 'kakao_app_key'
def appSchemeName = 'kakao_scheme'
def clientSecret = 'kakao_client_secret'
def file = file(manifestPath)
replaceString(file, appKeyName, addPrefix(project, appKeyName))
replaceString(file, appSchemeName, addPrefix(project, appSchemeName))
replaceString(file, clientSecret, addPrefix(project, clientSecret))
}
}
}
}
preBuild.dependsOn rootProject.bumpVersionInProperties
dependencies {
androidTestImplementation('com.android.support.test:runner:0.5') {
exclude group: 'com.android.support', module: 'support-annotations'
}
androidTestImplementation('com.android.support.test:rules:0.5') {
exclude group: 'com.android.support', module: 'support-annotations'
}
// Optional -- Hamcrest library
// Optional -- UI testing with Espresso
androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2') {
exclude group: 'com.android.support', module: 'support-annotations'
}
androidTestImplementation('com.android.support.test.espresso:espresso-intents:2.2.2') {
exclude group: 'com.android.support', module: 'support-annotations'
}
androidTestImplementation('com.android.support.test.espresso:espresso-web:2.2.2') {
exclude group: 'com.android.support', module: 'support-annotations'
}
androidTestImplementation "com.android.support:support-annotations:$ANDROID_SUPPORT_LIB_VERSION"
androidTestImplementation "org.hamcrest:hamcrest-library:$HAMCREST_VERSION"
}
}
subprojects{} 블럭은, applications 의 하위폴더에 존재하는 하위 모듈의 gradle에서도 위의 사항을 동일하게 적용하기 위해 사용됐습니다.
그 다음 보이는 코드는
apply plugin: 'com.android.application'입니다. 이 플러그인을 적용해야 그 다음의 android{} 블럭을 사용할 수 있는 것으로 보입니다.
그리고.. 이 android{} 블럭이 apk빌드를 위한 핵심 부분입니다. 여기서 apk빌드와 관련된 설정들을 정할 수 있습니다.
preBuild.dependsOn rootProject.bumpVersionInProperties
이 코드가 왜 있는지는 모르겠지만.. 빌드 이전에 실행되는 preBuild라는 task에 의존성(dependsOn)을 설정하여
빌드를 하기 전에 rootProject에 있는 bumpVersionInProperties task가 실행되게 만드는 코드입니다.
그 다음은 dependencies{} 블럭입니다. gradle에 대해 자세히 공부하기 전에 이 부분의 정확한 역할이 궁금했습니다.
여기 코드에서는 블럭 안에 androidTestImplementation만 존재하네요.
여러 종속성이 존재합니다. 이 프로젝트의 빌드를 위해 필요한 라이브러리를 명시하는 부분입니다.
여기서는 안드로이드 테스트를 지원하기 위해 필요한 라이브러리들이 명시되어 있습니다.
스택오버플로우 - implementation 과 compile에 대한 질문글 : https://stackoverflow.com/questions/44493378/whats-the-difference-between-implementation-and-compile-in-gradle
위의 사이트를 참고하면 도움이 됩니다.
그리고 마지막 코드는
static def addPrefix(Project project, String value) {
def result = value
if(project.defaultDeployPhase.toLowerCase() != 'release') {
result = project.defaultDeployPhase.toLowerCase() + "_" + result
}
return result
}
static def replaceString(file, fromString, toString) {
def updatedContent = file.getText('UTF-8').replaceAll(fromString, toString)
file.write(updatedContent, 'UTF-8')
}
위와 같습니다. 이 gradle파일에서 사용되는 함수를 정의한 부분이고 특별한 점은 없는 것 같습니다.
*참고
안드로이드 디벨로퍼 - 빌드 구성 : https://developer.android.com/studio/build/index.html?hl=ko
안드로이드 디벨로퍼 사이트의 설명이 참 좋은 것 같습니다. 한글 번역 추가합니다.
모듈 레벨 빌드 파일각 아래의 샘플 Android 앱 모듈
|
dependencies{}에 대한 내용 : https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.dsl.DependencyHandler.html
//Our Gradle plugin is written in groovy apply plugin: 'groovy' //now we can use the 'compile' configuration for declaring dependencies dependencies { //we will use the Groovy version that ships with Gradle: compile localGroovy() //our plugin requires Gradle API interfaces and classes to compile: compile gradleApi() //we will use the Gradle test-kit to test build logic: testCompile gradleTestKit() }
stackoverflow 질문글-dependency configuraton : https://stackoverflow.com/questions/35947897/gradle-dependencies-difference-between-compile-apk-project-compile-project-pro
There's two separate things to discuss here: Dependency Configurations and Dependency Sources. Dependency Configurations Configurations help define the transitivity of a dependency, which in turn removes the pain of having to discover and specify the libraries your own project/library requires, including them automatically. This notion of configurations in gradle is very similar to that of Maven's scopes:
There are more configurations that you can encounter on Android, such as
Dependency Source Once you understand the configurations available for you, you need to specify an actual dependency. Dependencies might be internal or external, you may rely on another library you are working on, as well as on publicly available libraries. Here's where the Assume you have a project
Now assume that both
To sum up, it is the combination of both configurations and sources that enables you to declare dependencies as |
stackoverflow 질문글-dependencies에서 implementation과 compile의 차이점 : https://stackoverflow.com/questions/44493378/whats-the-difference-between-implementation-and-compile-in-gradle
It is one of the breaking changes coming with gradle:3.0 that Google announced at IO17 gradle:3.0 the From the gradle docs :
tl;dr: |
댓글들
implementation
hiding the dependency. Does my question make sense? – Suragch Sep 8 at 6:53implementation
only x api will be exposed, but if you useapi
y,z also will be exposed. – humazed Sep 8 at 7:16