신혼여행에서 즐긴 음식들

스페인 바르셀로나

카푸치노

IMG_1491

핀초스

IMG_0238

샹그리아

IMG_0452

빠에야

IMG_0455

보케리아시장 해산물구이

IMG_1623

보케리아시장 컵과일

IMG_0489

El Rey De La Gamba

IMG_0649

English Breakfast

IMG_1664

프랑스 카르카손

IMG_0722

IMG_0720

IMG_0817

IMG_0818

IMG_0852

IMG_0855

IMG_0856

프랑스 아를

IMG_0894

IMG_0896

IMG_0897

IMG_1047

IMG_1056

IMG_1057

IMG_1058

IMG_1063

프랑스 고흐드

IMG_1135

IMG_1136

IMG_1923

프랑스 후쓸리옹

IMG_1194

IMG_1195

프랑스 엑상프로방스

IMG_1268

IMG_1269

프랑스 니스

IMG_1310

IMG_1309

IMG_1330

IMG_1331

IMG_2071

IMG_2072

Android Studio 프로젝트 릴리즈 빌드할때 Proguard를 이용해 로그제거하기

마켓에 애플리케이션을 릴리즈하기 전에 해야할 일 중 하나는 로그를 제거하는 작업입니다.

소스코드를 수정하지 않고 릴리즈 빌드할때 Proguard를 이용해 로그(android.util.Log) 메서드 호출을 간단하게 제거할 수 있습니다.

build.gradle에서 다음과 같이 릴리즈 빌드할때 Proguard를 적용하도록 정의해 줍니다.

    buildTypes {
        release {
            runProguard true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.txt'
        }
    }

그리고 proguard-rules.txt를 아래와 같이 수정해 줍니다.

-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
}

이렇게 설정하고 gradle assembleRelease로 빌드하면, Log.d(), Log.v() 호출은 제거됩니다. (리턴값을 참조하지 않는다면)

중요한 포인트는 -assumenosideeffects 옵션은 optimize 단계를 거쳐야만 적용이 된다는 점입니다. 때문에 proguard-android.txt가 아닌 proguard-android-optimize.txt를 사용하도록 설정해야 합니다.

이 파일들은 안드로이드 SDK의 tools/proguard 디렉토리에 위치하고 있습니다.

Console에서 Android SDK 업데이트하기

Jenkins로 안드로이드 프로젝트를 자동으로 빌드하는 시스템을 구축하다보면 UI 없이 Console에서 Android SDK를 업데이트해야 하는 상황이 발생합니다.

먼저 SDK 루트 디렉토리에서 tools 디렉토리로 이동합니다.

cd tools

설치할 수 있는 SDK 목록을 확인합니다.

$ ./android list sdk
Refresh Sources:
  Fetching https://dl-ssl.google.com/android/repository/addons_list-2.xml
  Validate XML
  Parse XML
  Fetched Add-ons List successfully
  Refresh Sources
  Fetching URL: https://dl-ssl.google.com/android/repository/repository-10.xml
  Validate XML: https://dl-ssl.google.com/android/repository/repository-10.xml
  Parse XML:    https://dl-ssl.google.com/android/repository/repository-10.xml
  Fetching URL: https://dl-ssl.google.com/android/repository/addon.xml
  Validate XML: https://dl-ssl.google.com/android/repository/addon.xml
  Parse XML:    https://dl-ssl.google.com/android/repository/addon.xml
  Fetching URL: https://dl-ssl.google.com/android/repository/addon-6.xml
  Validate XML: https://dl-ssl.google.com/android/repository/addon-6.xml
  Parse XML:    https://dl-ssl.google.com/android/repository/addon-6.xml
  Fetching URL: https://dl-ssl.google.com/glass/gdk/addon.xml
  Validate XML: https://dl-ssl.google.com/glass/gdk/addon.xml
  Parse XML:    https://dl-ssl.google.com/glass/gdk/addon.xml
  Fetching URL: https://dl-ssl.google.com/android/repository/extras/intel/addon.xml
  Validate XML: https://dl-ssl.google.com/android/repository/extras/intel/addon.xml
  Parse XML:    https://dl-ssl.google.com/android/repository/extras/intel/addon.xml
  Fetching URL: https://dl-ssl.google.com/android/repository/sys-img/android/sys-img.xml
  Validate XML: https://dl-ssl.google.com/android/repository/sys-img/android/sys-img.xml
  Parse XML:    https://dl-ssl.google.com/android/repository/sys-img/android/sys-img.xml
  Fetching URL: https://dl-ssl.google.com/android/repository/sys-img/android-wear/sys-img.xml
  Validate XML: https://dl-ssl.google.com/android/repository/sys-img/android-wear/sys-img.xml
  Parse XML:    https://dl-ssl.google.com/android/repository/sys-img/android-wear/sys-img.xml
  Fetching URL: https://dl-ssl.google.com/android/repository/sys-img/android-tv/sys-img.xml
  Validate XML: https://dl-ssl.google.com/android/repository/sys-img/android-tv/sys-img.xml
  Parse XML:    https://dl-ssl.google.com/android/repository/sys-img/android-tv/sys-img.xml
  Fetching URL: https://dl-ssl.google.com/android/repository/sys-img/x86/addon-x86.xml
  Validate XML: https://dl-ssl.google.com/android/repository/sys-img/x86/addon-x86.xml
  Parse XML:    https://dl-ssl.google.com/android/repository/sys-img/x86/addon-x86.xml
Packages available for installation or update: 15
   1- Android SDK Tools, revision 23.0.2
   2- Documentation for Android 'L' Preview SDK, revision 1
   3- SDK Platform Android 4.4W, API 20, revision 1
   4- SDK Platform Android L Preview, revision 1
   5- Samples for SDK API 20, revision 1
   6- Samples for SDK API L Preview, revision 1
   7- Google APIs (x86 System Image), Android API 19, revision 6
   8- Google APIs (ARM System Image), Android API 19, revision 6
   9- Glass Development Kit Preview, Android API 19, revision 8
  10- Android Support Repository, revision 6
  11- Android Support Library, revision 20
  12- Google Play services, revision 18
  13- Google Repository, revision 9
  14- Google Play Billing Library, revision 5
  15- Google Play Licensing Library, revision 2

아래와 같은 커맨드로 원하는 항목만 선택적으로 업데이트 할 수 있습니다.

$ ./android update sdk --no-ui --filter 1,10,11,12

의존성 문제 때문인지 원하는 항목이 한 번에 나타나지 않을 수도 있습니다. 보통은 리스트를 확인하고 업데이트를 요청하는 과정을 반복하게 되더군요.

Android Studio에서 unsigned apk 생성하기

build.gradle에서 다음과 같이 release 빌드용 signing configuration을 정의해 줍니다.

    signingConfigs {
        release {
            storePassword ""
            keyAlias ""
            keyPassword ""
        }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }

그리고 아래와 같이 console에서 release 빌드하면,

$ gradle assembleRelease

다음 위치에서 unsigned apk를 확인할 수 있습니다.

build/outputs/apk/app-release-unsigned.apk

알리오 올리오

집에서 혼자 식사를 해결해야 할때 “알리오 올리오”는 재료가 많이 필요하지 않고 요리법도 간단해서 좋습니다.

2014-04-09 13.19.10

재료는 단촐합니다. 스파게티면, 소금, 후추, 마늘, 청양고추, 올리브 오일

2014-04-09 13.24.54

시간배분을 잘 해야 전체 요리시간을 단축할 수 있습니다. 먼저 소금을 넣은 물을 끓인 후 면을 넣어 삶습니다.

2014-04-09 13.25.17

타이머를 이용해 정확히 8분을 삶습니다.

2014-04-09 13.25.45

동시에 약불을 이용해 스텐팬을 10분 동안 예열합니다.

2014-04-09 13.23.56

스파게티면을 삶고 스텐팬을 예열하는 사이에 마늘과 청양고추를 손질합니다. 참고로 청양고추의 씨는 꼭지를 따고 양손으로 비비면 떨어집니다.

8분 동안 삶은 면을 꺼내 체를 이용해 물기를 제거합니다.

2014-04-09 13.39.06

스텐팬의 예열이 끝나면 올리브 오일을 충분히 두르고 1분 정도 후에 마늘과 청양고추를 볶아 줍니다. 이때 매운맛이 올리브 오일에 스며듭니다.

2014-04-09 13.41.00

마늘이 노릇노릇해 졌다면 스파게티면을 넣고 올리브 오일이 면에 잘 스며들도록 요리해줍니다. 마무리로 소금이나 후추를 약간 더해주면 요리는 끝납니다.