월별 글 목록: 2015년 5월월

안드로이드 5.1 AsyncTask 개선점

안드로이드 5.1에서 AsyncTask의 소스 일부가 변경되었다. 변경된 소스를 살펴보기 전에 AsyncTask의 API 문서에서 필요한 내용을 살펴보자. API 문서는 많은 것들을 설명하고 있고, 이것은 그 만큼 복잡하기도 하고 사용 시에 주의할 필요가 있다는 것이다. 아래는 AsyncTask의 API 설명 중에 일부이고, AsyncTask를 문제없이 사용하기 위해서 꼭 알아둘 필요가 있는 내용이다. 아래 내용은 결국 AsyncTask는 UI 스레드에서 사용하라는 것이다.

Threading rules


There are a few threading rules that must be followed for this class to work properly:

안드로이드 5.1에서 변경된 내용을 살펴보자.


이 변경된 내용을 보면, 이전 버전(5.0)에서는 핸들러(Handler)인 InternalHandler를 미리 생성하고 외부(ActivityThread 클래스가 로딩)에서 초기화(init() 메서드 호출해서 미리 UI 스레드 루퍼를 사용하는)하는 구조인데 반해, 5.1 버전에서는 핸들러 생성을 레이지 로딩(Lazy Loading)하는 형태이고 싱글톤 패턴을 사용하는 것을 알 수 있다. 개인적으로 위에서 가이드로 UI 스레드에서 AsyncTask를 생성하고 실행하라고 설명하고 있기에 레이지 로딩하는 구조의 싱글톤의 형태가 더 좋겠다.


이 변경 코드는 5.1에서 사용하는 핸들러가 싱글톤의 형태를 가지고 있고, 이것을 사용하는 형태로 바뀌었다.

이상 5.1에서 이전에 비해서 변경된 내용을 살펴봤다. 변경된 내용이 성능에 영향을 미치는 부분이 없기 때문에 개발자나 사용자나 변경에 대한 사이드 이펙트는 없을 것으로 보인다.

안드로이드 스튜디오(Android Studio)에서 Fabric의 Crashlytics을 플러그인 설치 없이 사용하기

Crashlytics는 안드로이드나 IOS에서 크래시나 그와 같은 상황에 대한 리포팅 서비스를 제공하고 있다. 이 서비스를 사용하는 기본 방법은 http://sjava.net/?p=479를 확인하면 쉽게 알 수 있다. 필자가 진행하고 있는 프로젝트로 외부 프로젝트도 같이 진행하고 있다. 그래서 Crashlytics 계정을 2개 이상 사용하고 있다.

프로젝트를 변경해서 다른 계정을 사용할 때는 Crashlytics의 플러그인에서 로그아웃 -> 로그인 해서 사용하는 계정을 변경해서 사용한다. 그리고 이 플러그인을 설치하고 싶지가 않았다. 그래서 이 글에서는 플러그인을 설치하지 않고 Crashlytics를 사용하는 방법을 살펴보자.

Crashlytics는 트위터(Twitter)가 인수를 하고 Fabric이라는 통합 툴의 일부가 되었다. 그리고 사용하는 방법도 변경이 되었기에 변경된 내용을 살펴보자.

1. Fabric에서 Crashlytics에 해당하는 gradle 설정은 다음과 같다. 아래 내용은 https://fabric.io/migrations/gradle 에서 확인 할 수 있다.

buildscript {
  repositories {
    jcenter()
    maven { url 'https://maven.fabric.io/public' }
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:1.5.0'
    // The Fabric Gradle plugin uses an open ended version to react
    // quickly to Android tooling updates
    classpath 'io.fabric.tools:gradle:1.+'
  }
}

apply plugin: 'com.android.application'
apply plugin: 'io.fabric'

repositories {
  jcenter()
    maven { url 'https://maven.fabric.io/public' }
  }

android {
  compileSdkVersion 23
  buildToolsVersion "23.0.0"

  defaultConfig {
    minSdkVersion 16
    targetSdkVersion 23
  }
}

dependencies {
  // Crashlytics Kit
  compile('com.crashlytics.sdk.android:crashlytics:2.5.5@aar') {
    transitive = true
  }
}

2. AndroidManifest.xml 파일에 아래의 권한을 추가한다.

<manifest>
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>

3. AndroidManifest.xml 의 <application> 요소에 아래의 값을 추가한다.

<application>
    <meta-data android:name="com.crashlytics.ApiKey" android:value="키를 넣어 주세요" />
</application>

3.1 위에서 필요한 키는 웹사이트에서 Settings > Organizations 의 목록에 있는 Admin 그룹을 클릭하면 사용자 목록을 볼 수 있고, 이 화면에서 API 키를 확인할 수 있다.

4. Application 클래스에서 사용
– Application 클래스를 상속하는 클래스의 onCreate() 메서드에서 아래와 같은 코드를 사용해서 Crashlytics를 사용할 수 있다.

public void onCreate() {
    super.onCreate();
    Fabric.with(this, new Crashlytics());
}

이제 아래 과정은 Crashlytics가 Fabric으로 통합되면서 Deprecated된 과정이다. 따라서, 아래의 과정은 참고를 하지 않는게 좋다.

이 과정은 안드로이드스튜디오(Android Studio)에 적용할 수 있다.

1. Crashlytics의 pom.xml 파일을 확인한다.
https://crashlytics.com/downloads/maven 에서 Crashlytics에서 배포하는 바이너리에 대한 정보를 확인할 수 있다.

2. 위 정보를 기준으로 build.gradle에 아래의 정보를 입력한다.

buildscript {
    repositories {
        // 1. Add the Crashlytics Maven repository
        maven { url 'http://download.crashlytics.com/maven' }
    }
    dependencies {
        // 2. Add the Crashlytics plugin to your dependencies
        classpath 'com.crashlytics.tools.gradle:crashlytics-gradle:1.+'
    }
}

apply plugin: 'com.android.application'

// 3. Apply the Crashlytics plugin after the Android plugin
apply plugin: 'crashlytics'

repositories {
    // 4. Add the Maven repository
    maven { url 'http://download.crashlytics.com/maven' }
}

dependencies {
    // 5. Add the Crashlytics SDK to the Android project
    compile 'com.crashlytics.android:crashlytics:1.+'
}

3. AndroidManifest.xml 파일에 아래의 권한을 추가한다.

<manifest>
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>

4. AndroidManifest.xml 의 <application> 요소에 아래의 값을 추가한다.

<application>
    <meta-data android:name="com.crashlytics.ApiKey" android:value="키를 넣어 주세요" />
</application>

4.1 위에서 필요한 키는 웹사이트에서 Settings > Organizations 의 목록에 있는 Admin 그룹을 클릭하면 사용자 목록을 볼 수 있고, 이 화면에서 API 키를 확인할 수 있다.

5. Application 클래스에서 사용
– Application 클래스를 상속하는 클래스의 onCreate() 메서드에서 아래와 같이 Crashlytics를 사용할 수 있다.

public void onCreate() {
    super.onCreate();
    Crashlytics.start(this);
}

 

* 레퍼런스
http://blog.danlew.net/2015/02/20/setting-up-a-new-app-in-crashlytics-without-the-plugin/

윈도 폰트 렌더링 개선 툴(mactype)

직업이 소프트웨어를 개발하는 일을 가지고 있다 보니, 하루 종일 모니터에 보이는 텍스트(코딩)를 보면서 일을 한다. 그리고 내가 사용하는 PC의 운영체제는 윈도, 리눅스 그리고 맥을 골고루 사용한다. 빈도로 보면 윈도 > 리눅스 > 맥의 빈도로 사용한다. 이 3개의 운영체제를 사용하다 보면 화면에 보이는 UI(예로 우분투 14.04에 화면 가장자리의 Anti-aliasing으로 깨지는 UI 개선)나 글씨의 선명함(확실히 맥이 수려한 글꼴과 레티나 화면으로)이 서로 비교된다.

지금 사용하는 윈도(8.1)가 다른 운영체제에 비해서 제일 눈에 거슬린다. 그래서 윈도의 폰트 렌더링을 개선하는 툴을 확인해 보니 아래의 2개가 있다.

1. dgipp : Customizable Windows text renderers
– 최신 버전 : 2010년 9월
2. mactype : Ultimate font Rasterizer for Windows
– 최신버전 : 2013년 12월 31일

위 2개를 다 사용해본 결과 mactype이 모드별 렌더링하는 옵션도 있고 비교적 더 좋다. mactype을 설치하면 트레이에 아래와 같은 화면을 볼 수 있다. 이 화면에서 렌더링 시작/종료등의 여러 기능을 사용할 수 있다.

위 화면에서 Wizard를 실행하면 아래의 화면을 볼 수 있다. 이 화면에서는 이 애플리케이션을 실행하는 형태를 결정할 수 있다.

위 화면에서 Next를 선택하면 아래의 화면을 볼 수 있다. 그리고 이 화면에서 자신의 환경에서 제일 잘 보이는 화면을 선택하면 된다.

이제 화면에서 트레이에 있는 mactype 메뉴에서 Start/Disable을 사용해서 적용 전과 후를 비교해 볼 수 있다.