일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 큐 자바 코드
- Rxjava Observable
- android retrofit login
- ar vr 차이
- 스택 자바 코드
- rxjava cold observable
- jvm 작동 원리
- ANR이란
- 안드로이드 라이선스 종류
- 안드로이드 os 구조
- 2022 플러터 설치
- 안드로이드 레트로핏 crud
- 서비스 쓰레드 차이
- 스택 큐 차이
- 안드로이드 레트로핏 사용법
- 서비스 vs 쓰레드
- 안드로이드 라이선스
- rxjava hot observable
- 멤버변수
- 객체
- 클래스
- 플러터 설치 2022
- 안드로이드 유닛테스트란
- jvm이란
- rxjava disposable
- 안드로이드 유닛 테스트
- android ar 개발
- 2022 플러터 안드로이드 스튜디오
- 안드로이드 유닛 테스트 예시
- 자바 다형성
- Today
- Total
나만을 위한 블로그
[Android] 라이브러리 커스텀 방법 본문
개발할 때 라이브러리를 붙여서 쓰다 보면 고쳐서 쓰고 싶은 기능이 있다. 이를 위해 레포지토리에 이슈를 만들거나, 직접 PR을 날리는 방법이 있지만 어쩔 수 없이 내가 직접 수정해서라도 써야 할 수 있다.
하지만 대부분 라이브러리들의 코드들은 읽기 전용 파일로 되어 있어서, 프로젝트에서 수정할 수 없는 경우가 많다.
이 포스팅에선 이런 라이브러리들의 코드를 어떻게 수정할 수 있는지에 대해 적는다. 예시로 사용할 라이브러리는 TedImagePicker다.
커스텀할 라이브러리를 선택했다면 먼저 가장 해야 할 것은 해당 라이브러리의 라이선스 확인이다.
라이브러리의 라이선스 종류는 크게 아래와 같다.
- Apache 2.0 라이선스
- MIT 라이선스
- BSD 라이선스
- GPL 라이선스
아파치, MIT, BSD 라이선스는 버전과 저작권 명시 등만 지켜주면 코드 수정을 자유롭게 할 수 있다.
그러나 GPL 라이선스가 적용된 라이브러리를 쓸 경우 모든 소스코드를 공개해야 하는 의무가 있다. 관련 판례도 존재한다. 오랫동안 앱 개발을 하진 않아서 GPL 라이선스가 적용된 라이브러리는 아직 본 적이 없지만, 이런 라이선스도 있으니 조심해서 나쁠 건 없다. 라이선스에 대한 자세한 내용은 아래 포스팅을 참고한다.
https://onlyfor-me-blog.tistory.com/394
TedImagePicker는 아파치 2.0 라이선스를 적용받기 때문에 코드 수정, 배포로 받는 불이익은 없다.
라이선스까지 확인했다면 다음은 라이브러리의 소스코드를 가져와야 한다. app gradle에 의존성을 추가한 다음 안드로이드 스튜디오를 Project 뷰로 바꾸고, 폴더 목록에서 tedimagepicker라고 입력하면 폴더가 표시되는데 이 코드를 가져올 수도 있고, 깃허브의 master 레포지토리에서 코드를 가져오는 방법도 있다. 편한 방법으로 진행한다.
코드를 가져올 때 주의할 것은 import문이다. 예를 들어 TedImagePickerActivity에 포함된 import문은 아래와 같다.
import android.Manifest
import android.animation.AnimatorSet
import android.animation.ValueAnimator
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.view.MenuItem
import android.view.View
import android.view.animation.AccelerateDecelerateInterpolator
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.databinding.DataBindingUtil
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.gun0912.tedonactivityresult.model.ActivityResult
import com.gun0912.tedpermission.TedPermissionUtil
import com.tedpark.tedonactivityresult.rx2.TedRxOnActivityResult
import gun0912.tedimagepicker.adapter.AlbumAdapter
import gun0912.tedimagepicker.adapter.GridSpacingItemDecoration
import gun0912.tedimagepicker.adapter.MediaAdapter
import gun0912.tedimagepicker.adapter.SelectedMediaAdapter
import gun0912.tedimagepicker.base.BaseRecyclerViewAdapter
import gun0912.tedimagepicker.builder.TedImagePickerBaseBuilder
import gun0912.tedimagepicker.builder.type.AlbumType
import gun0912.tedimagepicker.builder.type.CameraMedia
import gun0912.tedimagepicker.builder.type.MediaType
import gun0912.tedimagepicker.builder.type.SelectType
import gun0912.tedimagepicker.databinding.ActivityTedImagePickerBinding
import gun0912.tedimagepicker.extenstion.close
import gun0912.tedimagepicker.extenstion.isOpen
import gun0912.tedimagepicker.extenstion.setLock
import gun0912.tedimagepicker.extenstion.toggle
import gun0912.tedimagepicker.model.Album
import gun0912.tedimagepicker.model.Media
import gun0912.tedimagepicker.partialaccess.PartialAccessManageBottomSheet
import gun0912.tedimagepicker.util.GalleryUtil
import gun0912.tedimagepicker.util.MediaUtil
import gun0912.tedimagepicker.util.ToastUtil
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
import java.text.SimpleDateFormat
import java.util.*
import java.util.concurrent.TimeUnit
io.reactivex로 시작하는 import문이 보이는 걸 보니 RxJava를 사용하는 것 같고, TedPermission 라이브러리도 사용하는 것 같다. 이 라이브러리들의 의존성도 내 프로젝트에 추가해야 한다.
그 외에 gun0912.tedimagepicker로 시작하는 import문이 보이는데, 자신의 프로젝트 안으로 코드를 가져올 거라면 저 import문의 위치에 포함된 모든 파일들도 프로젝트로 가져와야 한다. 최종적으로는 app gradle의 의존성을 제거해도 이 라이브러리가 작동하게 만들어야 하기 때문이다.
또한 XML, 드로어블, res 폴더에 있는 strings, colors, style들도 모두 가져와야 한다. 라이브러리의 소스코드를 전부 파악하고 어느 부분을 어떻게 커스텀할지 이미 정해서 필요없다면 몰라도, 일단 가져와서 실행되는지부터 확인한다면 모든 파일을 가져와서 실행되는지 확인하는 게 낫다.
모두 붙여넣기를 완료했다면 내 프로젝트에서 TedImagePicker 라이브러리를 참조하는 import문을 제거해도 잘 작동하는지 확인한다. 이 때 에러가 발생한다면 차근차근 수정해서 작동하게 만들고, 작동하는 것을 확인했다면 app gradle의 의존성을 제거한다.
작동 확인까지 끝났다면 레포지토리에 있는 라이선스 문구를 내 프로젝트 깃허브의 리드미에 추가하거나, license 파일을 만들고 그 안에 추가한다. 별 것 아닌 것 같지만 이렇게 해야 라이선스를 사용하기 위한 법적 조건을 충족할 수 있다. 또한 나 외의 다른 기여자가 해당 코드의 사용 조건을 이해할 수 있는 배경을 제공할 수 있고, 만든 분에 대한 예의기도 하다. 귀찮더라도 꼭 추가한다.
요약
- 프로젝트에 가져올 라이브러리의 의존성 추가 (깃허브 레포의 master 브랜치에서 소스코드를 가져올 경우 이 부분 생략)
- 안드로이드 스튜디오를 Project 뷰로 바꿔서 해당 라이브러리의 소스코드 복사 -> 내 프로젝트로 가져옴 (깃허브 레포의 master 브랜치에서 소스코드를 가져올 경우 이 부분 생략)
- 라이브러리에서 사용하는 다른 라이브러리가 있다면 프로젝트에 추가
- 라이브러리 의존성 제거 후 프로젝트에 가져온 코드만 써도 라이브러리의 기능이 작동하는지 확인
- 라이선스 관련 내용을 내 깃허브 리드미나 license 파일에 추가
- 수정 or 리팩토링이 필요한 부분의 수정 진행
'Android' 카테고리의 다른 글
[Android] @SerializedName이 둘 이상의 필드명을 탐색하게 설정하는 법 (0) | 2024.02.14 |
---|---|
[Android] SerializedName이란? (0) | 2024.02.08 |
[Android] ExifInterface로 사진의 회전 각도 구하는 법 (0) | 2024.01.30 |
[Android] 레트로핏으로 파일 업로드 중 java.io.FileNotFoundException: /external/video/media/1000000085: open failed: ENOENT (No such file or directory) 에러 해결 방법 (0) | 2024.01.21 |
[Android] TedImagePicker 사용법 (0) | 2023.12.22 |