안드로이드 개발을 한지 벌써 수년이 지났지만, 오랫동안 묵혀둿던 버킷 리스트를 드디어 실천하게 되었다. 의외로 오래 걸리지 않았고, 그리고 예상외로 재미있었고, 결과적으로는
아무튼 간에, 만 이틀 동안에 걸쳐 진행한 과정에 대한 기록을 남겨보려 한다.
시간은 아주 사소한 계기였다. 회사 동료의 요청에 의해 CameraX 의 Preview 영역에 특정 영역만 노출 시킬 마스크를 적용하는 방법론에 대해 고민하게 되었다. 평소라면 가장 최단 시간에 해결할 수 있는 라이브러리를 찾아 적용했겠지만, 직접 커스텀 뷰를 통해 여러가지 모드로 마스크를 그릴 수 있는 라이브러리를 직접 만들어 보면 좋지 않을까 고민했고, 당장 만들어 보기로 했다.
DrawingMaskView Class 를 생성하고 커스텀 뷰로써 동작하도록 View 를 상속받고, constructor 를 작성했다.
class DrawingMaskView constructor(context: Context, attrs: AttributeSet?) : View(context, attrs) {
...
}
res/values 에 attrs.xml 을 생성해, layout 에서 입력 받을 설정값을 세팅했다.
<resources>
<declare-styleable name="DrawingMaskView">
<attr name="shadow_color" format="reference|integer"/>
<attr name="shape_type" format="dimension">
<enum name="circle" value="0" />
<enum name="rect" value="1" />
<enum name="rect_round" value="2" />
</attr>
...
</declare-styleable>
</resources>
<com.pepperkim.drawingmaskview.DrawingMaskView
android:id="@+id/maskView"
app:shape_type="rect_round"
app:align="center"
app:shadow_mode="destination_out"
app:shadow_color="@color/black"
app:radius_size="300"
app:shape_width="500"
app:shape_height="500"
app:rect_round="100"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
CustomView 의 init 을 통해 layout 에서 입력 받은 설정값으로 onDraw 함수에서 마스크를 그렸다.
최초의 요구 사항은 단순히 circle 을 그리는 것이었지만, rect 와 round rect 로 추가하고, 원하는 위치에 배치 시키기 위한 align 모드도 적용하였다.
이제는 배포할 차례. 처음 접해보는 영역이라 막막할 것이라 생각했지만, 생각보다 간단했고, 구글링을 통해 자세한 방법과 성공기를 찾을 수 있었다.
참고한 포스팅
개발일지 (강태종) : Android in A..Z - Module 베포 (Jitpack)
기계공학하던 안드로이드 개발자 : 안드로이드 라이브러리 만들고 jitpack으로 배포하기
라이브러리를 github 에 올리고, jitpack 에 배포하기 위한 과정 차례로 나열해보자.
buildscript {
dependencies {
classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
}
}
plugins {
...
id 'maven-publish'
}
...
afterEvaluate{
publishing {
publications {
release(MavenPublication) {
from components.release
groupId = 'com.github.깃헙 이름'
artifactId = '라이브러리 이름'
version = '1.0.1'
}
debug(MavenPublication) {
from components.debug
groupId = 'com.github.깃헙 이름'
artifactId = '라이브러리 이름'
version = '1.0.1'
}
}
}
}
repositories {
...
maven { url "https://jitpack.io" }
}
깃헙에 라이브러리를 commit push 후에 최종 버전과 맞추어 tag 를 걸고 release 한다.
그리고 대망의 jitpack 배포.
이곳에서 자신의 깃헙과 연동한다.
정상적인 연동이 되었다면,
자신의 깃헙에 릴리즈한 버전이 표시되며 Get it 아이콘이 생성된다.
이러면 깃헙에 릴리즈한 버전의 라이브러리를 다른 프로젝트에서 dependencies 를 통해 다운로드하여 사용할 수 있게 된다.
...
라고 하면 한번에 해결해 버린 것 같지만!!
이틀 동안 수만은 시행착오 끝에 성공한 결과이다.
트러블 슈팅이라고 까지 하긴 뭐하지만, 시행착오의 내용을 살펴보자면,
위에서 작성하던 build.gradle(Module) 에서
afterEvaluate{
publishing {
publications {
release(MavenPublication) {
from components.release
groupId = 'com.github.깃헙 이름'
artifactId = '라이브러리 이름'
version = '1.0.1'
}
debug(MavenPublication) {
from components.debug
groupId = 'com.github.깃헙 이름'
artifactId = '라이브러리 이름'
version = '1.0.1'
}
}
}
}
이 부분의 버전과, github 에 올린 tag 와 릴리즈 버전이 달라 jitpack 에서 빌드 실패를 맛 보았다.
안드로이드 스튜디오 상에서는 잘 동작하던 라이브러리가, jitpack 에선 build 에 실패하는 현상이 나타났다. 이 부분이 가장 많은 시간을 잡아 먹었다.
jitpack 배포 중 빌드 실패하게 되면 로그를 볼 수 있는데,
그 원인은
gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
build.gradle(project)
plugins {
id 'com.android.application' version '7.4.1' apply false
id 'com.android.library' version '7.4.1' apply false
id 'org.jetbrains.kotlin.android' version '1.8.0' apply false
}
내 gradle 버전과, build.gradle(module) 에 설정한 jvmtarget 의 버전이 맞지 않아서 였다.
kotlinOptions {
jvmTarget = '1.8'
}
->
kotlinOptions {
jvmTarget = '11'
}
위와 같이 수정한 후 정상적인 배포에 성공했다.
막상 작성하다 보니 대단한것도 없다. 이게 뭐라고 그동안 안했는지... 게으른 스스로를 채찍질하게 된다.
이로써 생애 첫 라이브러리 배포에 대한 기록을 남긴다.