RichUtils 2.0.0 :: Dreaming Bird:: Release Note English (2017. 11. 23)

한글로 된 릴리즈 노트를 원하신다면, 여기에서 보세요.

Introduction

from May 30, 2017 to Nov 26, 2017, RichUtils meet D+180 from first release. Also I celebrate 22th birthday on Nov 26, 2017. Nov 26, 2017 is special day for me.

To celebrate that day, I decided to release RichUtils 2.0.0 to want to be a good library for Android developers.

Release name of 2.0.0 is Dreaming Bird, the song name 夢魅鳥’s english name that wrote by ‘azuma’ in May 2012 using VOCALOID 結月ゆかり. (Yuzuki Yukari) I mean, it’s not much to reveal, but I’ve chosen to find something missing.

After release 2.0.0, i receive any idea to improve this library by Issue Tracker or Pull Request. If you give me code written in java, i will convert them and insert library with original credit. Many ideas please!

Release Note

Release Date: Nov 23, 2017 14:25 (UST), 23:25(KST)

Release Name: Dreaming Bird (夢魅鳥, Yumemidori)

Release Note

  • Adding ‘Application Context’: It make using global Context to some methods instead of explicit Context by declare RichUtilsGlobal.initializeApplication(this) in Application class. Note, this feature is dedicated to Java. Most methods need Context declare as Extension Methods of Context in Kotlin. You don’t need to declare Context to use methods in Kotlin.
  • Adding ‘Crash Handler’: Integrate RichCrashCollector library can collect crash log as Markdown
  • Make Code Index Demo Application: Remove old sample, sampleJava, i write new application. In new application, it provides code snippets written in Kotlin, Java.
  • Inquiry Network State: inquiry Network State by isConnected(), isWifiConnected()
  • Inquiry Foreground State: check application is foreground state.
  • Generate ViewId: generate new View ID
  • Inquiry Width, Height, Mimetype of Image: inquiry Width, Height, Mimetype of Image without load bitmap to memory. it support String (file path) and Drawable Resources.
  • Intent to Browse, call: browse, makeCall, dialCall
  • Change JVMName of Assets.asList : asAssetsList
  • SAM Conversion: adding compatible sam conversion methods in JSONArray.forObjectList
  • Oreo Responding: fix force crash using RPickMedia, RPermission in Oreo
  • RPickMedia.RESULT_FAILED: it return FAILED when user action back event
  • CheckPermissionGranted: check given StringArray is granted
  • Generate Notification Channel: generate Notification Chanel which feature from Oreo
  • Remove nullable object: remove useless nullable property
  • Inquiry Width, Height of Video: inquiry Width, Height of Video. it support String (file path)
  • File Size: convert size to human-readable string using given file
  • update README
  • update KDoc

RichUtils 2.0.0 :: Dreaming Bird:: Release Note 한글 (2017. 11. 23)

for ‘Release Note in English’, link is here.

도입

2017년 5월 30일부터 시작하여, 2017년 11월 26일이 되면 RichUtils 는 180일을 맞이하게 됩니다. 그리고 이 블로그의 저자도 11월 26일이 되면 22번째 생일을 맞이해 어느 면으로는 많은 의미를 포함하고 있는 날입니다.

그런 날을 기념으로 RichUtils 의 2.0.0을 배포하여 안드로이드 개발자를 위한 좋은 라이브러리로 남으려 합니다.

2.0.0 의 릴리즈 네임은 Dreaming BirdVOCALOID 結月ゆかり를 사용해 azuma 가 2012년 5월에 작곡한 곡의 이름인 ‘夢魅鳥’의 영문 이름입니다. 뜻은 그다지 공개할 만큼은 아니지만, 지금은 없어진 어떤 것을 다시 찾고 싶다는 의미에서 선택하였습니다.

2.0.0 이후에도 이슈 트래커Pull Request로 라이브러리를 좀 더 발전시키기 위한 아이디어를 받습니다! Java 로 제공해주실 경우에도 직접 의도에 맞게 변환하여 편입시키니, 많은 아이디어 부탁드립니다!

내역

배포일: 2017년 11월 23일 14:25 (UST), 23:25(KST)

릴리즈 네임: Dreaming Bird (夢魅鳥, Yumemidori)

업데이트 내역

  • Application Context 기능 추가: RichUtilsGlobal.initializeApplication(this)를  Application내부에 사용해서 몇몇 메서드에 Context를 명시적으로 선언하지 않아도 작동합니다. 이 기능은 Java 전용으로, Kotlin 에서는 대부분의 Context 를 필요로 하는 메서드가 Context의 확장 메서드로서 선언되었습니다.
  • CrashHandler 기능 추가: 강제 종료 로그를 Markdown 문서로서 수집하는 RichCrashCollector 라이브러리가 통합되었습니다.
  • Sample / Code Index 앱 구현: 이전 sample, samplejava 를 제거하고 새로운 데모 앱을 작성했습니다. 해당 앱에서 대부분의 기능에 대한 Code Snippet 와 목록이 제공됩니다.
  • 네트워크 상태 조회: isConnected(), isWifiConnected() 등 메서드로 네트워크 상태를 조회할 수 있습니다.
  • Foreground 상태 조회: 앱이 Foreground 에 있는지 체크합니다. :: isProcessRunning()
  • ViewId 생성: 새로운 ViewId를 생성합니다. :: generateViewId()
  • 이미지 가로, 세로, mimetype 조회: 비트맵을 메모리에 불러오지 않고 가로, 세로, mimetype를 조회할 수 있습니다. String 및 Drawable Resources 를 지원합니다. :: getImageWidth()
  • 인터넷, 전화 인텐트: browse, makeCall, dialCall
  • Assets.asList 의 JvmName 변경: asAssetsList
  • SAM Conversion: JSONArray.forObjectList 에 SAM Conversion 호환 메서드가 추가되었습니다.
  • Oreo 대응: Oreo에서 RPickMedia, RPermission 사용시 종료되던 문제를 해결했습니다.
  • RPickMedia.RESULT_FAILED: 선택 창에서 뒤로 가면 FAILED 를 반환합니다.
  • CheckPermissionGranted: 주어진 권한 String[] 이 전부 허용되었는지 체크합니다.
  • Notification Channel 생성: Oreo부터 추가된 Notification Channel 를 생성합니다.
  • Nullable object 제거: 필요없는 nullable 속성을 제거했습니다.
  • 영상 가로, 세로 조회: 영상의 가로, 세로를 조회할 수 있습니다. String만 지원합니다.
  • 파일 사이즈: 주어진 파일의 크기를 사람이 알아볼 수 있게 변경합니다.
  • README 업데이트
  • KDoc 업데이트

Migrate CircleCI 1.0 to CircleCI 2.0 (CI/CD for Android)

 

CircleCI 2.0이 나온지 아마 3개월 정도 지났는데,  슬슬 1.0에서 올려야 될 타이밍인 것 같아서 CircleCI 1.0 에서 2.0으로 올리는 방법을 정리하려고 한다

1.0과 2.0의 차이점

기존 CircleCI 1.0에 비해 2.0은 이미 빌드되어 있는 Docker Image를 사용한다. 그와 동시에 캐시 기능도 확실히 제공하기 때문에 1.0에 비해 더 빠른 속도를 제공한다.

왼쪽이 1.0, 오른쪽이 2.0인데 확실히 봐도 속도가 빨라졌음을 알 수 있다.

마이그레이션 방법

기존 circle.yml 삭제

general:
    artifacts:
        - /home/ubuntu/RichUtilsKt/app/build/outputs/apk/

machine:
    environment:
        ANDROID_HOME: /usr/local/android-sdk-linux
        GRADLE_OPTS: '-Dorg.gradle.jvmargs="-Xmx2048m -XX:+HeapDumpOnOutOfMemoryError"'

dependencies:
    pre:
        - echo y | android update sdk --no-ui --all --filter tools,platform-tools,android-26
        - echo y | android update sdk --no-ui --all --filter build-tools-26.0.2
    override:
        - ANDROID_HOME=/usr/local/android-sdk-linux

compile:
    override:
       - (./gradlew dependencies):
                  timeout: 360

test:
    override:
        - (./gradlew test):
            timeout: 360

단 기존 환경 기준으로 API 26을 사용했다는 것 만큼은 기억해두고 지우자.

.circleci/config.yml 파일 생성

2.0에서 부터는 설정 파일이 .circleci 란 폴더 안에 config.yml 로서 존재하게 되었다.

version: 2
jobs:
  build:
    working_directory: ~/RichUtilsKt
    docker:
      - image: circleci/android:api-26-alpha
    environment:
      JVM_OPTS: -Xmx3200m
    steps:
      - checkout
      - run :
          name: display directory
          command: ls -la
      - restore_cache:
          key: jars-{{ checksum "build.gradle" }}-{{ checksum  "app/build.gradle" }}
      - run:
          name: Download Dependencies
          command: ./gradlew androidDependencies
      - save_cache:
          paths:
            - ~/.gradle
          key: jars-{{ checksum "build.gradle" }}-{{ checksum  "app/build.gradle" }}
      - run:
          name: Run Tests
          command: ./gradlew lint test
      - store_artifacts:
          path: app/build/reports
          destination: reports
      - store_test_results:
          path: richutils/build/test-results

조금 길은데, 하나씩 살펴보자.

  • version: 2.0 이므로 2를 적는다.
  • jobs: 시행할 작업을 나열할 곳이다.
  • working_directory: 작업이 실행될 장소. 보통 프로젝트의 루트 폴더명이다.
  • docker image: 이미 빌드되어 있는 안드로이드 이미지를 적어넣는다. Docker Hub에 따르면 api-23 부터 api-26 까지 있다. 만일 7.0이 대상이라면 api-25 를 적어넣으면 된다.
  • environment: 자바 힙 최대 용량을 3200mb로 설정한다.
  • steps: run, restore_cache, checkout, save_cache 등 문서상에 정의된 내용을 나열하는 곳이다.
  • checkout: git checkout. 더 이상 자세한 설명은 생략한다.
  • run : shell commend 를 실행하는 명령어이다. name 로는 CircleCI 페이지에 표시될 제목, commend 에는 실제 명령어를 작성한다.
  • restore_cache: 주어진 key 로부터 캐시를 불러오는 것이다. 여기서는 ./gradlew androidDependencies 까지를 캐시로 저장한다.
  • save_cahce: 주어진 경로를 캐시하는 기능이다.
  • store_artifacts: 빌드 리포트를 올리는 기능이다.
  • store_test_results: 테스트 결과 리포트를 올리는 기능이다.

여기서 주의할 점은 checksum, store_artifacts, store_test_results 경로를 제대로 설정해야 하는데, 대소문자 구별하는 듯 하다. 실제 파일이 있는 경로를 가리키도록 설정하면 된다.

마지막으로 저장하고 커밋하면 CircleCI 에 빌드 트리거가 걸리고 빌드가 시작된다.

정리

private repo 같은 경우 1x container, 오픈소스 저장소의 경우 4x container 가 지원되는 것 같으니, 앞으로 나오는 왠만한 저장소에 부착하려고 한다.

가끔 정신 나간 상태로 코딩하다 보면 CircleCI 쪽에서 실패 메일이 오게 되면 그때서야 정신을 차리는 일이 다반사이기 때문이다(…