Kotlin으로 Android 라이브러리를 만들고 게시합니다.

12490 단어 AndroidKotlin

입문


나는 Kotlin으로 간단한 라이브러리Android-PageControl를 만들어 보았다.
이것은 유명한 View Pager Indicator 등 라이브러리를 많이 사용한 모델이지만 iOS의 Page Control처럼 지시기를 누르면 페이지가 바뀔 수 있도록 제작되었다.
작은 프로그램 라이브러리라서 다른 언어로 쓰고 싶어서 이번에 Kotlin 개발에 도전했습니다.
다음은 배포에서 Maven Central 릴리스까지의 설명입니다.

※ 전제로 Kotlin을 능숙하게 사용하는 사람은 아닙니다. "자바 이외에 안드로이드 앱을 더 간단하게 쓸 수 있나요?"이것은 Kotlin 초보자가 초보자를 대상으로 하는 내용이다.
※ XXX 언어로도 쓸 수 있습니다. XXX는 사용하지 말아야 합니다. 단, 이 상황을 철저히 비교해 보십시오.

개발 환경에 배포


Android Studio에서 IntelliJ IDEA의 Kotlin 플러그인을 가져옵니다.
이 밖에 Gradle은kotlin-gradle-plugin과kotlin-stdlib를 배치할 것이다.
(자세한 상황은 베어주세요)
가져오기에서 주의해야 할 것은 버전 선택입니까?
Maven Central은 현재 kotlin-gradle-plugin/kotlin-stdlib의 0.8.679를 발표했지만, IntelliJ 플러그인 버전(0.8.11)과 일치하지 않아 오류가 발생하여 동기화할 수 없습니다.
따라서 0.8.11을 사용한다.
build.gradle는 아래와 같다.(Kotlin Plugin 지원 섹션도 있음)
build.gradle
buildscript {
    ext.kotlin_version = '0.8.11'
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.12.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}
:

Java에서 마이그레이션


위의 라이브러리는 처음에 Java로 작성되었습니다.
하나하나 다시 써야 할 것 같아.. 하지만 더 간단해.
자바 파일의 코드를 kotlin 디렉터리에 있는 Kotlin 원본 파일(.kt)에 복사하여 붙여넣으면 Convert가 완성됩니다.
많은 오류가 생겨 완벽하지는 않지만 몇 반이면 편해진다.

인코딩


인코딩의 주의점 등은 쓴 내용에 따라 정해지기 때문에 이번 경우에는 자바와 달리 눈에 띄며, Kotlin으로 전환할 때 자동이 아니라 손으로 다시 쓴 부분 등 몇 가지를 적어야 한다.

구조 함수


이번과 같은 사용자 정의 보기를 만들 때 여러 개의 구조 함수(파라미터의 Context, Attribute Set, int의 조합)를 준비하고 싶었지만 구조 함수는 하나만 정의할 수 있기 때문에 이번 가설은 XML에서 ContextAttributeSet를 사용하여 파라미터의 구조 함수를 정의했다.
open class PageControl(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs, 0) {

비어 있지 않은 값에서만 실행


Kotlin은 NPE를 방지하는 기술들을 많이 준비했습니다.
예를 들어, 다음 설명에서 오류가 발생했습니다.
// getTheme()はnullを返す可能性があるためエラーが出る
context.getTheme().obtainStyledAttributes(attrs, R.styleable.AndroidPageControl, R.attr.apcStyles, 0)
이 경우 getTheme() 다음에 !! 넣거나 ? 넣으면 오류가 없어지지만 어느 것을 쓰느냐에 따라 의미가 달라진다.!! 는 비어 있으면 빈 PointerException 을 던집니다.
한편 ? 를 사용하는 경우 "비어 있지 않은 경우에만 수행"
될 것 같습니다.
따라서null검사를 한 후 방문하고 싶은 경우?를 사용하는 것이 좋다.
context.getTheme()?.obtainStyledAttributes(attrs, R.styleable.AndroidPageControl, R.attr.apcStyles, 0)

Override 빈 값 허용 여부 구분

Activity#onCreate(Bundle) 등 API를 덮어쓰는 것이 많지만 이때 매개 변수 유형이 추가되었는지 여부?로 인해 서명이 변경되므로 덮어쓰려고 했지만 오류가 발생할 수 있습니다.
기본적으로 자바의 API를 덮어쓰면 null이 들어갈 수 있기 때문에 null 허가가 아닐까 생각합니다.
    // OK
    protected override fun onCreate(savedInstanceState: Bundle?) {
    // NG: 'onCreate' overrides nothing
    protected override fun onCreate(savedInstanceState: Bundle) {

빈 값 지정


만약 방법의 반환값을 다시 호출하는 방법을 사용한다면 이러한 연쇄 결과는 이 연쇄의 중도 반환값이null인 상황을 고려할 필요가 있다고 생각하지만, 자바로 쓰려면 긴 기록이 있을 것이다.
Kotlin에서 v: View? (엘비스 연산자) 를 사용하여null의 값을 지정할 수 있습니다.
mNumOfViews = mViewPager?.getAdapter()?.getCount() ?: 0
이거 Groovy (Java8도 되나요?)그럴까요?

삼원 연산자가 아니라 if-else


Kotlin에서는 if/else 형식을 사용할 수 있습니다.
setColor(isCurrent ? mColorCurrentDefault : mColorNormalDefault);
setColor(if (isCurrent) mColorCurrentDefault else mColorNormalDefault)

TargetApi 주석 추가 의미 없음


API 수준 이상에서만 사용할 수 있는 API를 사용하는 경우 Java(Android)는 다음과 같이 설명?:을 사용하지만 Kotlin에서 (추가할 수 있지만) 아무런 의미가 없습니다.
배치된 경고가 남습니다.
(Kotlin이라기보다는 플러그인 등의 문제)
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public void setBackground(....) {
    :
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
        b.setBackgroundDrawable(sld)
    } else {
        b.setBackground(sld)
    }
}

Android Studio(Kotlin Plugin)의 경고와 Gradle의 결과가 다릅니까?


무슨 말인지 모르겠어요 시간이 많이 걸렸어요
경우에 따라 IDE(Kotlin Plugin)의 경고와 Gradle의 경고는 상반됩니다.
Collator와 Comparator에서 Java 처리, 즉 맵의 어떤 요소로 요소에 맵이 있는 List를 정렬하지만 이 이동은 순조롭지 않습니다.
현재 컴파일 오류가 없지만 제대로 실행되지 않았습니다.
현황의 코드는 다음과 같다.
    data.sortBy(object : Comparator<Map<String, Any>> {
        override fun compare(lhs: Map<String, Any>, rhs: Map<String, Any>): Int {
            return Collator.getInstance()!!.compare(lhs.get("className") as String, rhs.get("className") as String)
        }
    })
IDE(Kotlin Plugin)는 "Comparator의 방법에 implement가 없습니다. 매개 변수를 @TargetApi 방법으로 덮어쓰십시오."라고 경고합니다. Map<String, Any>?Map<String, Any> 로 설정하면 Gradle을 구축할 수 없습니다. 반대로...
결국 Kotlin Plugin의 경고(빨간색 오류 표시라 신경 쓰이지만)는 무시해도 구축할 수 있기 때문에Gradle의 결과는 위에서 말한 바와 같다.
(움직이지 않는 것은 샘플 응용 프로그램의 코드입니다. 라이브러리 자체가 잘 움직일 것입니다^;)

라이브러리 사용


라이브러리 프로젝트에 샘플 응용 프로그램을 첨부하였다
사용자는 일반적인 라이브러리로 사용할 수 있다.
이번 샘플 응용 프로그램도 일부는 Kotlin으로 작성되었고, 라이브러리를 하위 항목으로 가져온 Map<String, Any>? 의 작법과 통상적으로 다르지만, 보통 다음과 같이 추가됩니다 build.gradle.
dependencies {
    compile 'com.android.support:support-v4:20.0.0'
    compile 'com.github.ksoichiro:androidpagecontrol:0.1.0'
}

Travis CI에서 구축


구축은 Gradle만 있으면 되기 때문에 특별히 주의해야 할 점이 없다.
일반적으로.travis.yml을 안드로이드용으로 쓰면 구축할 수 있습니다.
이번에는 샘플 응용 프로그램에서만 동작을 확인하고 테스트 코드를 쓰지 않아 자동 테스트에 주의점이 있는지 모르겠다.

마스터 센터로 게시


Android 라이브러리를 Maven Central에 게시하려면 Javadoc의jar 파일도 게시해야 하지만 Kotlin에서는 Javadoc가 아닌 KDoc을 사용하는 것 같습니다.
따라서 정상적인 Javadoc 작업을 수행할 수 없습니다.
Chris Banes씨gradle-mvn-push를 쓰고 싶은데 Javadoc 임무가 실패해서 제대로 움직이지 못했어요.
Kotlin의 다른 라이브러리는 어떻게 됩니까?JetBrains사가 내놓은 Kotlin 라이브러리의 Javadoc를 몇 개 다운로드해 봤는데 그 안에 README밖에 없어서...
아직 대응하지 않은 것 같습니다.
kotlin-gradle-plugin-core는 KDoc이라는 작업이 있지만, 플러그인은plugin으로 안드로이드 플러그인에만 의존하는 상태에서만 제공되며,gradle-mvn-push에 포함될 수 없습니다. (maven,signing 플러그인과 공존합니다.)
그래서 유감스럽게도 이번에gradle-mvn-push를 바탕으로 자바독을 돌려 생성하는 방법(README만의jar)을 채택하였다.

감상


흔한 내용이지만 이번 일을 통해 느낀 소감이다.
전체적으로 좋은 인상을 남겼다.
계속 검사하고 싶어요.

이점

  • 평소에 Android Studio를 사용하는 사람은 가져오기가 매우 간단합니다
  • Kotlin Plugin 자동 변환의 양이 많고 간단합니다
  • Java와 Kotlin의 코드는 프로젝트 내에 공존할 수 있기 때문에 단계적인 이전이 쉽다
  • Null-safety에 대한 구조가 많고 NPE와 연결된 설명을 오류로 하기 때문에 안심하고 쓰기 쉽다
  • 전체적으로 기술량이 감소했다
  • 지금...결점

  • IDE와 Gradle의 결과가 다른 것은 불안하다
  • 인터넷상의 정보는 아직 매우 적다. 영어를 사용해도 언어 규격이 매우 낡아서 빠져들면 골치 아프다...
  • 언어 자체는 괜찮아 보이지만 관련 도구 그룹을 포함하면 자바와의 차이가 클 수 있다(Maven과 Gradle)
  • 여기서 마치겠습니다.

    좋은 웹페이지 즐겨찾기