안드로이드 커스텀뷰 라이브러리 Jitpack 배포 첫 성공기

김보현·2023년 4월 17일
0

android

목록 보기
2/2

안드로이드 개발을 한지 벌써 수년이 지났지만, 오랫동안 묵혀둿던 버킷 리스트를 드디어 실천하게 되었다. 의외로 오래 걸리지 않았고, 그리고 예상외로 재미있었고, 결과적으로는

생각보다 보람차고 뿌듯하다.

진작할걸...

아무튼 간에, 만 이틀 동안에 걸쳐 진행한 과정에 대한 기록을 남겨보려 한다.


시간은 아주 사소한 계기였다. 회사 동료의 요청에 의해 CameraX 의 Preview 영역에 특정 영역만 노출 시킬 마스크를 적용하는 방법론에 대해 고민하게 되었다. 평소라면 가장 최단 시간에 해결할 수 있는 라이브러리를 찾아 적용했겠지만, 직접 커스텀 뷰를 통해 여러가지 모드로 마스크를 그릴 수 있는 라이브러리를 직접 만들어 보면 좋지 않을까 고민했고, 당장 만들어 보기로 했다.

DrawingMaskView Class 를 생성하고 커스텀 뷰로써 동작하도록 View 를 상속받고, constructor 를 작성했다.

class DrawingMaskView constructor(context: Context, attrs: AttributeSet?) : View(context, attrs) {
	...
}

res/values 에 attrs.xml 을 생성해, layout 에서 입력 받을 설정값을 세팅했다.

attrs.xml

<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>

layout xml

<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 모드도 적용하였다.

image view 위에 custom view 를 적용시킨 모습

이제는 배포할 차례. 처음 접해보는 영역이라 막막할 것이라 생각했지만, 생각보다 간단했고, 구글링을 통해 자세한 방법과 성공기를 찾을 수 있었다.


참고한 포스팅

개발일지 (강태종) : Android in A..Z - Module 베포 (Jitpack)
기계공학하던 안드로이드 개발자 : 안드로이드 라이브러리 만들고 jitpack으로 배포하기


라이브러리를 github 에 올리고, jitpack 에 배포하기 위한 과정 차례로 나열해보자.

build.gradle(project)

buildscript {
    dependencies {
        classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
    }
}

build.gradle(Module)

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'
            }
        }
    }
}

settings.gradle

repositories {
   	...
    maven { url "https://jitpack.io" }
}

깃헙에 라이브러리를 commit push 후에 최종 버전과 맞추어 tag 를 걸고 release 한다.

라이브러리 깃헙주소

그리고 대망의 jitpack 배포.

Jitpack으로 배포하기

https://jitpack.io/

이곳에서 자신의 깃헙과 연동한다.

정상적인 연동이 되었다면,

자신의 깃헙에 릴리즈한 버전이 표시되며 Get it 아이콘이 생성된다.

이러면 깃헙에 릴리즈한 버전의 라이브러리를 다른 프로젝트에서 dependencies 를 통해 다운로드하여 사용할 수 있게 된다.

...
라고 하면 한번에 해결해 버린 것 같지만!!

이틀 동안 수만은 시행착오 끝에 성공한 결과이다.
트러블 슈팅이라고 까지 하긴 뭐하지만, 시행착오의 내용을 살펴보자면,

failed issue 1

위에서 작성하던 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 에서 빌드 실패를 맛 보았다.

failed issue 2

안드로이드 스튜디오 상에서는 잘 동작하던 라이브러리가, 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'
}
    

위와 같이 수정한 후 정상적인 배포에 성공했다.

막상 작성하다 보니 대단한것도 없다. 이게 뭐라고 그동안 안했는지... 게으른 스스로를 채찍질하게 된다.
이로써 생애 첫 라이브러리 배포에 대한 기록을 남긴다.

profile
Android Developer

0개의 댓글