날씨는 다소 풀린듯 하지만...
미세미세합니다..
머스크 챙기세욧~~


비가 온 뒤라 그런지 미세먼지는 소강상태인거 같네요.
그래도 전체적으로 시야가 뿌연 것 같아요.
저녁에도 비가 온다고 하니 우산을 챙겨야할거 같네요.


이 또한 오래된 이야기입니다.
지난 7월 먹었던 삼겹살 이야기지요.
요새 삼겹살이 비싸지요. 여기도 저렴한 편은 아닙니다.
일반적인 삼겹살집 세팅이구요.
맛도 무난합니다.
국수도 먹었는데 나름 먹을만 했습니다.
멀리서 찾아갈만한 곳은 아니지만 적어도 실망스런 삼겹살을 피하고 싶으시다면 추천할만 합니다~


또하나의 묵혀두었던 사진들을 꺼내봅니다.
지난 6월말즈음에 점심에 먹었던 것이지요.
모범갈빗살의 점심메뉴였습니다.
역시 소고기는 옳고 한우는 더 옳습니다.
거기다 냉면까지 훌륭해서 더할나위가 없었지요.
가성비도 고려한 가격인지라 추천할만 합니다.


아주 오래된 일이 되었지만...
지난 4월즈음에 지인이 대도식당이란 곳에서 소고기를 사준적이 있지요.
한우를 파는 곳으로 어마무시한 가격이었지만....
감사히 잘 먹었습니다 ㅋㅋ
역시나 소고기는.. 한우는... 항상 옳았습니다..
맛있게 식사 후 논현역 주변 투썸플레이스에서 딸기 블라썸도 한잔 해주었지요.
기회가 되신다면 도전하시길요.. 소고기.. 한우.. !!


오늘은 제대로 가을 날씨입니다.
화창하고 맑고 청명하고...
춥습니다...
바람이 많이 붑니다;; 겉옷 챙기세요~

[Android] Daum Map SDK 적용하기

다음 맵 SDK를 사용하면서 공식 가이드대로 진행시 일부 안되는 부분들이 있음.

  1. 카카오 개발자 사이트 가입

  2. 카카오 개발자 사이트에서 앱 생성

  3. Android 플랫폼 추가 : 앱 선택 - 설정 - 일반 - 플랫폼 추가 - Android 선택 후 추가

  4. 키 해시 등록 : Android 플랫폼 선택 후 키 해시 등록

  5. 라이브러리 파일 추가 Android Daum Map 라이브러리 구성  가이드에는 위와 같이 libs 파일에 추가하라고 하지만 이대로 할 경우 오류 발생함. libDaumMapAndroid.jar는 위 위치가 맞고 gradle 에 아래와 같이 추가가 필요함.

    dependencies {
        implementation fileTree(include: ['*.jar'], dir: 'libs')
        implementation files('libs/libDaumMapAndroid.jar')
    }

    armeabi와 armeabi-v7a는 /src/main 디렉토리 아래 jniLibs 디렉토리 생성 후 복사함. 

  6. AndroidManifest.xml 에 Permission과 APP Key 추가

    <uses-permission android:name="android.permission.INTERNET">
    </uses-permission>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION">
    </uses-permission>
    <meta-data android:name="com.kakao.sdk.AppKey" android:value="XXXXXXXXXXXXXXXXXXXXXXXXXXXX"/>
  7. 코드 작성

    MapView mapView = new MapView(this);
    ViewGroup mapViewContainer = (ViewGroup) findViewById(R.id.map_view);
    mapViewContainer.addView(mapView);


Android OS 9 Pie 버전부터는 WebView에 일반적인 텍스트로 "http://" URL 접근이 막혔습니다. 

(tagetSdkVersion 28 이상일 경우)

증상 : WebView에서 Webpage not availablenet::ERR_CLEARTEXT_NOT_PERMITTED 오류 발생

참고 : https://developer.android.com/training/articles/security-config#CleartextTrafficPermitted

검색해보니 이를 수정하기 위해서는 3가지 방법이 있습니다. 

(https://stackoverflow.com/questions/45940861/android-8-cleartext-http-traffic-not-permitted)

  • res/xml/network_security_config.xml 추가

    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <domain-config cleartextTrafficPermitted="true">
            <domain includeSubdomains="true">ebookfrenzy.com</domain>
        </domain-config>
        <domain-config cleartextTrafficPermitted="true">
            <domain includeSubdomains="true">amazon.com</domain>
        </domain-config>
        <domain-config cleartextTrafficPermitted="true">
            <domain includeSubdomains="true">nytimes.com</domain>
        </domain-config>
    </network-security-config>

    위 파일 추가 후 AndroidManifest.xml 에서 application에 networkSecurityConfig속성 추가

    <?xml version="1.0" encoding="utf-8"?>
    <manifest ...>
        ...
        <application
            ...
            android:networkSecurityConfig="@xml/network_security_config" 

    이 방법은 network_security_config.xml 파일에 앱 내 텍스트로 사용할 URL들이 정의되어 있어야 함.

    cleartextTrafficPermitted 속성이 true일 경우 동작을 함.


  • AndroidManifest.xml 에서 application 의 usesClearTextTraffic 속성 수정

    <?xml version="1.0" encoding="utf-8"?>
    <manifest ...>
        ...
        <application
            ...
            android:usesCleartextTraffic="true"

    이 방법은 텍스트 URL 을 무조건 허용하게 됨.


  • Android Manifest.xml에서 manifet의 targetSandboxVersion 속성을 사용 중일 경우 관련 내용 : https://developer.android.com/guide/topics/manifest/manifest-element#targetSandboxVersion

    위 관련 내용에 따르면 속성 값이 높을수록 보안 수준이 높아지며, 2일 경우 usesCleartextTraffic의 기본 값이 false가 됨. 그래서 이 속성의 값을 1로 변경해야함. 다만 Android 8.0 (API 26) 이상을 타겟팅하는 Android Instant Apps의 경우 이 속성을 2로 설정해야 함.

    <?xml version="1.0" encoding="utf-8"?>
    <manifest android:targetSandboxVersion="1">
        ...



어제 가족들과 광명동굴을 다녀왔어요.
명성대로 차가 많이 막힐듯 하여 나름 일찍 출발하였는데요 .
10시 전에 도착할땐 생각보단 사람이 많지 않더라고요.
주차장서 좀 걸어가면 매표소를 지나 동굴 입구가 나옵니다.
동굴 입구부터 화아악 시원해집니다.
길이도 꽤 길고 오르락 내리락 코스도 있습니다.
계단 다니시기 불편하신 분들은 계단이 나름 가파른 편이니 내려가는 코스가 나올때 우회해서 가시는게 나을듯 싶더라고요.
동굴 내부는 이것저것 테마를 가지고 잘 꾸며놓았고요.
다녀본 동굴 중엔 나름 인공적인 눈요기꺼리가 많았네요.
다만 연관성 없어보이는 주제들이 많지만 더위 피할 요령으로 가시는 분들이 많기에 문제가 될거 같진 않더라고요.
깊이 내려갈수록 다소 습해지고 바람도 안불면서 계단을 오르면서 땀이 조금 맺히긴 했어요.
다 돌고 나오니 한 시간 정도 소요된거 같네요.
그래도 서울 근교에 있는 동굴이라는 특수성에 한번씩 구경할만 했답니다.
그리고 나오는 길에 도로에 쭈욱 이어진 차량 행렬에 그 명성도 다시 확인했고요.
가실거라면 일찍 가시길요~~

Android OS 9 Pie (Developer)

참고 : https://developer.android.com/about/versions/pie/android-9.0-changes-28

동작 변경사항: API 레벨 28+를 대상으로 하는 앱

요약


포그라운드 서비스시 반드시 권한 요청

빌드 일련번호 지원 중단 및 DNS 개인정보 보호 추가

프레임워크 보안 변경사항

  • 기본적으로 네트워크 TLS 사용
  • 프로세스별 WebView 데이터 디렉토리
  • 앱별 SELinux 도메인

다중 네트워크 트래픽 처리 및 Apache HTTP 클라이언트 지원 중단

뷰 포커스, CSS RGBA 값 처리, document 스크롤 처리, 일시 정지된 앱의 알림 등의 UI 변경


포그라운드 서비스

Android 9 이상 대상 앱에서 포그라운드 서비스를 사용하는 앱은 FOREGROUND_SERVICE 권한을 요청해야 함.

Android 9 이상에서 권한 요청 없이 포그라운드 서비스 생성 시도시 시스템이 SecurityException 발생함.

개인정보 보호 정책 변경사항

빌드 일련번호 지원 중단

Android 9에서는 Build.SERIAL 이 항상 "UNKNOWN"으로 설정됨.

기기 하드웨어 일련번호 액세스시 READ_PHONE_STATE 권한 요청 후 getSerial() 을 호출해야 함.

DNS 개인정보 보호

비공개 DNS API를 준수해야 함.

시스템 확인자가 TLS를 통한 DNS를 수행할 경우 내장 DNS 클라이언트가 동일한 호스트 이름에 대해 암호화된 DNS를 시스템으로 사용하거나 시스템 확인자를 위해 비활성화됨.

프레임워크 보안 변경사항

기본적으로 네트워크 TLS 사용

Android 9에서는 isCleartextTrafficPermitted() 메서드는 기본적으로 false를 반환함.

특정 도메인을 위해 일반 텍스트 사용할 필요 있을 경우 cleartextTrafficPermitted 앱의 네트워크 보안 구성에서 해당 도메인을 true로 명시적으로 설정해야 함.

프로세스 별로 구분되는 웹 기반 데이터 디렉토리

앱은 여러 프로세스 사이에서 단일 WebView 데이터 디렉토리를 공유할 수 없음.

이러한 데이터 디렉토리는 쿠키, HTTP 캐시 그리고 웹 검색과 관련된 다른 영구 저장소와 임시 저장소를 저장함.

대부분의 앱은 한 프로세스에서만 WebView와 CookieManager 같은 android.webkit 패키지의 클래스를 사용함.

앱이 두 개 이상의 프로세스에서 WebView 인스턴스를 사용해야 하는 경우 각 프로세스에서 WebView 의 인스턴스를 사용하기 전에 WebView.setDataDiretorySuffix() 메서드를 사용하여 해당 프로세스에 대한 고유한 데이터 디렉토리 접미사를 지정해야 함.

이 메서드는 각 프로세스의 웹 데이터를 앱의 데이터 디렉토리 내에 있는 자체 디렉토리에 넣음.

앱별 SELinux 도메인

Android 9 이상 앱은 어디서든 액세스 가능한 Unix 권한을 사용하는 다른 앱과 데이터를 공유할 수 없음.

다른 앱과 파일을 공유하려면 콘텐츠 프로바이더를 사용해야 함.

연결 변경사항

연결 데이터 카운트 및 다중 경로

시스템은 현재 기본값이 아닌 네트워크 상의 네트워크 트래픽을 측정하고 NetworkStatsManager 클래스에 메서드를 제공하여 해당 트래픽에 대해 쿼리함.

getMultipathPreference()도 네트워크 트래픽에 기반하여 값을 반환함. Android 9부터 이 메서드는 이동통신 데이터에 대해 true를 반환하지만 하루 일정 수준 이상 트래픽이 누적되면 false를 반환함.

ConnectivityManager.NetworkCallback 클래스는 VPN에 대한 정보를 앱에 전송함.

Apache HTTP 클라이언트 지원 중단

Android 6.0에서 Apache HTTP 클라이언트에 대한 지원이 제거됨.

Android 9부터는 이 라이브러리가 bootclasspath에서 제거되고 기본적으로 사용할 수 없음.

Android 9이상에서 앱이 Apache HTTP 클라이언트를 계속 사용하려면 AndroidManifes.xml에 추가해야 함.

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

android:required="false" 특성은 23 이하 최소 SDK가 있는 앱에 필요함. API 레벨이 24보다 낮은 기기에서는 org.apache.http.legacy 라이브러리가 제공되지 않기 때문.

(이 기기에서는 Apache HTTP 클래스가 bootclasspath에서 제공됨)

앱에서 런타임 Apache 라이브러리를 사용하는 대신 APK에 org.apache.http 라이브러리의 자체 버전을 번들링 할 수 있음. 이 경우 런타임에서 제공되는 클래스와의 호환성 문제를 피하기 위해 Jar 유틸리티 등의 라이브러리로 리패키징 해야 함.

UI 변경사항

뷰 포커스

너비나 높이가 0인 뷰는 포커스가 불가능함.

터치모드에서는 액티비티가 초기 포커스를 암시적으로 할당하지 않으므로, 원할 경우 명시적으로 요청해야 함.

CSS RGBA 16진수 값 처리

Android 9 이상에서는 4자리 및 8자리 16진수 CSS 색상을 처리 지원함. (CSS 색상 모듈 레벨 4)

CSS 색상 모듈 레벨 4는 릴리즈 52 이후로 Chrome에서 지원되었지만 현재는 WebView에서 기능이 비활성화 되어있음.

ex) API 27이하 앱의 경우 #80ff8080 색상이 WebView에서 불투명 연적색(#ff8080)이지만 API 28 이상으로 타겟을 바꾸면 #80ff8080은 50% 투명한 연녹색(#80ff80)으로 해석됨.

문서 스크롤 요소

문서의 루트 요소가 스크롤 요소일 경우 적절히 처리함.

이전 버전에서는 스크롤 위치가 본문 요소에만 설정되었으며, 루트 요소는 스크롤 값 0이었음.

document.body.scrollTopdocument.body.scrollLeftdocument.documentElement.scrollTop 또는 document.documentElement.scrollLeft에 직접 액세스하는 동작이 대상 SDK에 따라 달라짐.

뷰포트 스크롤 값에 액세스하려면 document.scrollingElement를 사용해야 함.

일시 정지된 앱의 알림

Android 9 이전에는 정지된 앱의 알림이 취소되었음.

Android 9 부터는 앱이 다시 시작될 때까지 정지된 앱의 알림이 숨겨짐.

앱을 Android 9으로 마이그레이션

Android 9과의 호환성 보장

일부 플랫폼 변경사항은 앱의 작동방식에 영향을 미칠 수 있어 일부 조정은 필요함.

꼭 새로운 API를 사용하거나 targetSdkVersion을 변경할 필요는 없음.

호환성 테스트 수행

아래의 주요 변경사항을 검토하고 필요한 수정사항을 테스트.

변경사항요약
비 SDK 인터페이스에 대한 제한직접 액세스, JNI를 통한 액세스 또는 리플렉션을 통한 액세스 등 특정 비 SDK 인터페이스에 대한 액세스가 차단됨. 
제한된 인터페이스에 액세스하려고 시도하면 NoSuchFieldException 및 NoSuchMethodException과 같은 오류가 발생함.
Crypto 제공자 제거Android 9부터 Crypto JCA 제공자가 제거됨.
SecureRandom.getInstance("SHA1PRNG","Crypto")를 호출하면 NoSuchProviderException이 발생함.
엄격해진 UTF-8 디코더Android 9에서는 Java 언어의 UTF-8 디코더가 더욱 엄격하며 Unicode 표준을 따름.
유휴 앱의 경우 카메라, 마이크 및 센서에 대한 액세스 차단앱이 유휴 상태인 경우 카메라, 마이크 또는 SensorManager 센서에 더 이상 액세스할 수 없음.

대상 버전 업데이트 및 Android P 기능 사용

targetSdkVersion 을 28로 업데이트하고 Android 9의 새 기능을 추가하여 지원하는 방법.

Android 9 SDK 가져오기

Android Studio 3.1 이상을 사용시 Android 9 앱 빌드를 위한 SDK 패키지를 받을 수 있고 새 기능은 필요없고 컴파일만 수행하려는 경우 사용 가능함.

Android Studio 3.2에서는 Android 9 기능을 완벽하게 지원함.

Android 9 앱 테스트

targetSdkVersion 이 28로 설정된 경우 앱에 영향을 미치는 아래 내용들을 검토함.

변경사항요약
포그라운드 서비스 권한포그라운드 서비스를 사용시 FOREGROUND_SERVICE 권한을 요청해야 함. 
이 권한 없이 포그라운드 서비스를 시작하면 SecurityException이 발생.
Bouncy Castle 암호화 지원 중단Android 9에서는 Bouncy Castle 제공자가 제공하는 여러 암호화가 지원 중단되고 Conscrypt 제공자가 제공하는 암호화가 대신 사용됨.
Bouncy Castle 제공자를 요청하는 getInstance() 호출은 NoSuchAlgorithmException 오류를 생성함.
이 오류를 해결하려면 getInstance()에서 제공자를 지정하지 말아야 함.(즉, 기본 구현 요청).
Build.serial에 대한 직접 액세스 제거Build.serial 식별자가 필요한 앱은 이제 READ_PHONE_STATE 권한을 요청한 다음 Android 9에 추가된 새 Build.getSerial() 메서드를 사용해야 함.
WebView 데이터 디렉토리의 공유 불가앱이 더 이상 여러 프로세스에서 단일 WebView 데이터 디렉토리를 공유할 수 없음.
앱에 android.webkit 패키지의 WebView, CookieManager 또는 기타 API를 사용하는 프로세스가 2개 이상 있는 경우, 두 번째 프로세스에서 WebView 메서드를 호출하면 앱이 중단됨.
앱의 데이터 디렉토리에 대한 액세스가 SELinux에 의해 차단됨시스템은 각 앱의 비공개 데이터 디렉토리에 대한 앱별 SELinux 제한과 함께 앱별 SELinux 샌드박스를 적용.
이제 경로를 통해 다른 앱의 데이터 디렉토리에 직접 액세스하는 것은 허용되지 않음. 
앱이 FD 전달을 포함한 IPC 메커니즘을 사용하여 데이터를 계속 공유할 수도 있음.


+ Recent posts