앞으로 Google Play에 앱을 올릴 경우 64비트 대응이 되어야 올릴 수가 있다고 합니다.

 

https://developers-kr.googleblog.com/2019/01/get-your-apps-ready-for-64-bit.html

 

Google Play의 64비트 요구 사항에 맞춰 앱을 준비하세요

<블로그 원문은 이곳 에서 확인하실 수 있으며 블로그 번역 리뷰는 양찬석(Google)님이 참여해 주셨습니다> 게시자: Vlad Radu(Play 제품 관리자), Diana Wong(Android 제품 관리자) 64비트 CPU는 사용자...

developers-kr.googleblog.com

일정은 2019년 8월 1일 부터이며, 2021년 8월 1일부터는 64비트 대응이 안된 앱은 서비스 종료를 시킨다네요.

 

참 무서운 이야기이고, 뭘 해야하나 싶은 이야기입니다.

 

  • 네이티브 코드를 포함하는 모든 새 앱과 앱 업데이트는 Google Play에 게시할 때 32비트 버전 외에 64비트 버전도 함께 제공되어야 합니다.

Google Developer 블로그에는 위와 같이 설명이 되어 있습니다.

 

즉, 네이티브 코드를 쓰던 부분들이 문제가 되는 것으로 보이고요. 

 

제 경우엔 다음? 카카오? 맵 SDK가 해당이 되는 경우가 발생하였습니다.

 

맵 SDK가 so 파일로 제공이 되었지만, 64비트로는 아직 제공이 안되고 있는데요.

 

만약 개인이 직접 so 파일을 만들고 사용 중이라면 64비트짜리도 만들어 대응을 하셔야 합니다.

 

참고로 다음? 카카오? 맵 SDK는 다음주 초, 즉 2019년 7월 4주 초쯤에 대응이 될거 같다는 것 같습니다.

 

https://devtalk.kakao.com/t/topic/80108

 

Kakao DevTalk_

카카오 데브톡. 카카오 플랫폼 서비스 관련 질문 및 답변을 올리는 개발자 커뮤니티 사이트입니다.

devtalk.kakao.com

 

이번 시련도 다들 잘 넘어가시길 기원하겠습니다.

 

 


 

오늘(7/24) 확인해보니 7월 22일자로 카카오 지도 API 업데이트가 되었나 봅니다. 

 

http://apis.map.kakao.com/android/guide/

불러오는 중입니다...

다소 타이트하겠지만 기존에 쓰시던 분들은 대응이 되셔야 할 것 같네요.

 

행운을 빌겠습니다~

2017년도부터 방통위에서 앱들에서 사용하는 권한과 그 목적에 대해서 사용자에게 고지하도록 법률이 시행됨.

 

https://kcc.go.kr/user.do?mode=view&page=A05030000&boardId=1113&boardSeq=44546

 

 

방송통신위원회 누리집 > 알림마당 > 보도자료 상세보기(「스마트폰 앱 접근권한 개인정보보호 안내서」 발표)

보도자료 방송통신위원회 보도자료를 게시하고 있습니다.방송통신위원회 활동과 정책에 관련된 언론 보도자료를 게시하고 있습니다. 「스마트폰 앱 접근권한 개인정보보호 안내서」 발표 제목 「스마트폰 앱 접근권한 개인정보보호 안내서」 발표 담당부서 개인정보보호윤리과 작성자 이기훈 연락처 02-2110-1529 첨부파일  (보고 나)스마트폰 앱 접근권한

kcc.go.kr

 

안그래도 Android 6.0 부터 런타임 퍼미션에 대한 처리가 있던 터였지만 위 내용도 추가되었음.

 

사용자에게 친절하게 필수/선택적인 권한에 대한 안내가 필요하게 되었음.

 

그럴때 어떤 권한들을 어떻게 안내할지 등에 대한 고민들이 시작됨.

 

아래 링크를 참고해 작성하면 도움이 될 듯함.

 

https://developers-kr.googleblog.com/2019/01/get-your-apps-ready-for-64-bit.html

 

 

 

Google Play의 64비트 요구 사항에 맞춰 앱을 준비하세요

<블로그 원문은 이곳 에서 확인하실 수 있으며 블로그 번역 리뷰는 양찬석(Google)님이 참여해 주셨습니다> 게시자: Vlad Radu(Play 제품 관리자), Diana Wong(Android 제품 관리자) 64비트 CPU는 사용자...

developers-kr.googleblog.com

2019년 7월 19일 현재 위 링크에 설명되고 있는 권한 내용들임.

 

인앱 구매

앱이 사용자에게 앱 내에서 구매하도록 요청할 수 있습니다.

 

기기 및 앱 기록

앱은 다음 항목 중 하나 이상을 할 수 있습니다.

  • 중요한 로그 데이터 읽기
  • 시스템 내부 상태 검색
  • 웹 북마크 및 기록 읽기
  • 실행 중인 앱 검색

네트워크 데이터 설정

앱은 모바일 데이터 연결 및 수신 데이터를 제어하는 설정을 사용할 수 있습니다.

 

ID

앱이 기기 내의 계정 정보나 프로필 정보를 사용할 수 있습니다. ID 액세스는 다음 기능을 포함할 수 있습니다.

  • 기기에서 계정 찾기
  • 내 연락처 카드 읽기(예: 이름 및 연락처 정보)
  • 내 연락처 카드 수정
  • 계정 추가 또는 삭제

연락처

앱은 사용자 기기의 주소록을 사용하여 연락처를 읽고 수정할 수도 있습니다.

 

캘린더

앱은 기기의 캘린더 정보를 사용할 수 있으며 다음과 같은 기능을 포함할 수 있습니다.

  • 캘린더 일정 및 기밀정보 읽기
  • 소유자에게 알리지 않고 캘린더 일정을 추가하거나 수정하고 참석자에게 이메일 보내기

위치

앱은 기기의 위치를 사용할 수 있습니다. 위치 액세스는 다음을 포함할 수 있습니다.

  • 대략적인 위치(네트워크 기반)
  • 정확한 위치(GPS 및 네트워크 기반)
  • 추가적인 위치 제공업체 명령에 액세스
  • GPS 액세스

SMS

앱은 기기의 문자 메시지(SMS) 또는 멀티미디어 메시지(MMS)를 사용할 수 있습니다. 이 그룹에는 문자, 사진 또는 동영상 메시지를 사용하는 기능이 포함될 수 있습니다.

중요: 요금제에 따라 이동통신사에서 문자 또는 멀티미디어 메시지에 요금을 부과할 수 있습니다. SMS 액세스는 다음 기능을 포함할 수 있습니다.

  • 문자 메시지 받기(SMS)
  • 내 문자 메시지 읽기(SMS 또는 MMS)
  • 문자 메시지 받기(사진이나 동영상 메시지 등의 MMS)
  • 내 문자 메시지 수정(SMS 또는 MMS)
  • SMS 메시지 보내기(요금이 부과될 수 있음)
  • 문자 메시지 받기(WAP)

휴대전화

앱이 사용자의 휴대전화 및 통화 기록을 사용할 수 있습니다. 요금제에 따라 이동통신사에서 통화료를 부과할 수 있습니다. 전화 액세스는 다음 기능을 포함할 수 있습니다.

  • 전화번호로 직접 전화걸기(요금이 부과될 수 있음)
  • 통화 기록 쓰기(예: 통화 기록)
  • 통화 기록 읽기
  • 발신전화 경로 전환
  • 휴대전화 이용 상태 변경
  • 사용자의 조작 없이 전화 걸기

사진/미디어/파일

앱이 기기에 저장된 파일이나 데이터를 사용할 수 있습니다. 사진/미디어/파일 액세스는 다음 기능을 포함할 수 있습니다.

  • USB 저장소의 내용 읽기(예: SD 카드)
  • USB 저장소의 내용 수정 또는 삭제
  • 외부 저장소 포맷
  • 외부 저장소 마운트 또는 마운트 해제

카메라

앱이 기기의 카메라를 사용할 수 있습니다. 카메라 액세스는 다음 기능을 포함할 수 있습니다.

  • 사진 및 동영상 찍기
  • 동영상 녹화

마이크

앱이 기기의 마이크를 사용할 수 있습니다. 마이크 액세스는 음성 녹음 기능을 포함할 수 있습니다.

 

Wi-Fi 연결 정보

앱은 Wi-Fi 사용 설정 여부 및 연결된 기기의 이름 등 기기의 Wi-Fi 연결 정보를 사용할 수 있습니다. Wi-Fi 연결 정보 액세스는 Wi-Fi 연결을 볼 수 있는 기능을 포함할 수 있습니다.

참고: 앱은 대개 인터넷에 액세스하기 때문에 앱을 설치할 때 다운로드 화면에 Wi-Fi 연결 정보 권한 그룹만 표시됩니다. 앱 다운로드 화면에 '전체 인터넷 액세스' 권한을 계속 표시하지는 않지만, 상기 '특정 앱에 대한 모든 권한 표시' 지침을 통해 언제든지 전체 권한 목록을 확인할 수 있습니다.

 

블루투스 연결 정보

앱이 주변 블루투스 기기로 송신하거나 이에 대한 정보를 수집하는 등의 방식으로 블루투스를 제어할 수 있습니다.

 

웨어러블 센서/활동 데이터

앱이 웨어러블 센서(예: 심박수 측정기)의 데이터에 액세스할 수 있도록 허용합니다. 신체 활동 수준에 대해 정기적인 업데이트를 받을 수 있습니다.

 

기기 ID 및 통화 정보

앱은 기기 ID, 전화번호, 휴대전화 사용 여부, 통화 시 연결된 번호에 액세스할 수 있습니다. 기기 ID 및 통화 정보는 전화 상태 및 ID를 읽는 기능을 포함할 수 있습니다.

 

기타

앱은 기기 제조업체에서 제공한 맞춤설정이나 앱에 필요한 특정 권한을 사용할 수 있습니다.

중요: 앱이 '기타' 그룹의 권한을 추가한 경우 항상 업데이트를 다운로드하기 전 변경사항을 검토하라는 요청을 받게 됩니다.

기타 액세스는 다음 기능을 포함할 수 있습니다.

  • 소셜 스트림 읽기(일부 소셜 네트워크)
  • 소셜 스트림에 글 올리기(일부 소셜 네트워크)
  • 구독 피드 액세스

앱 다운로드 화면에 표시되지 않은 권한을 포함하여 Play 스토어에 표시된 '기타' 그룹의 권한을 모두 볼 수 있습니다.

 

Serializable 과 Parcelable 이란?

Android 에서 작업시 Activity 간 이동이나 다른 앱 Compnent 이동시 Intent를 사용함.

이때 데이터 객체 등을 전달하기 위해 Class를 직렬화하는 부분들을 추가하여 사용함.

Serializable 이나 Parcelable을 사용하게 됨.

보통 개발자 편의성이나 유지보수는 Serializable이 우위고, 런타임시 성능은 Parcelable이 낫다고들 해 옴.

참고로 Serializable에서 직렬화 프로세스를 직접 구현하면 성능까지 더 우위라는 포스팅도 있음.

[https://medium.com/@limgyumin/parcelable-vs-serializable-%EC%A0%95%EB%A7%90-serializable%EC%9D%80-%EB%8A%90%EB%A6%B4%EA%B9%8C-bc2b9a7ba810](https://medium.com/@limgyumin/parcelable-vs-serializable-정말-serializable은-느릴까-bc2b9a7ba810)

위 링크의 포스팅에 잘 설명이 되어 있고 특히 아래 내용은 공감되는 부분이었음.

제 개인적 생각에는 0.000042 밀리초 빠르게 앱을 실행하는것에 집중하기 보다는 차라리 내가 만드는 이 앱 이 사용자가 원하는 일을 잘 처리하고 만족할 만한 결과를 내도록 집중하는것이 더 가치가 있는 일이 아닐까 싶습니다.

Kotlin에서 Parcelable 적용

 

어쨋든 Parcelable을 사용한다고 치고 Kotlin에서 사용시 팁을 정리하겠음.

 

class User {
    val name: String? = null
    val email: String? = null
}

 

위 클래스를 Parcelable을 구현하면 아래와 같음.

import android.os.Parcel
import android.os.Parcelable

class User() : Parcelable {
    var name: String? = null
    var email: String? = null

    constructor(parcel: Parcel) : this() {
        parcel.run {
            name = readString()
            email = readString()
        }
    }

    override fun writeToParcel(dest: Parcel?, flags: Int) {
        dest?.run {
            writeString(this@User.name)
            writeString(this@User.email)
        }
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<User> {
        override fun createFromParcel(parcel: Parcel): User {
            return User(parcel)
        }

        override fun newArray(size: Int): Array<User?> {
            return arrayOfNulls(size)
        }
    }
}

 

위에서 보다시피 보일러플레이트 코드가 늘어나며, 향후 유지 보수시에도 수정할 부분들이 추가됨.

다행히 Android Extensions 플러그인에서는 실험실 기능으로 아래와 같이 편의기능을 제공함.

1. 실험실 기능 on (app/build.gradle)

android {
    compileSdkVersion 28
    defaultConfig {
		...
    }

    androidExtensions {
        experimental = true
    }

}

 

2. 클래스에 @Parcelize 와 Parcelable 추가 (User.kt)

import android.os.Parcelable
import kotlinx.android.parcel.Parcelize

@Parcelize
class User(val name: String? = null, val email: String? = null) : Parcelable

원래 소스와 달라진 부분은?

프로퍼티들을 주생성자에 추가함.

단순히 @Parcelize 와 Parcelable 을 추가하면 주생성자에 선언된 프로퍼티들만 직렬화 처리를 함.

그렇다면 아래와 같이 프로퍼티를 주생성자에 넣지 않는다면?

import android.os.Parcelable
import kotlinx.android.parcel.Parcelize

@Parcelize
class User() : Parcelable {
    val name: String? = null
    val email: String? = null
}

컴파일 에러는 발생 안함.

다만 런타임시 제대로 프로퍼티들이 직렬화 처리가 안되어 데이터가 없음.

만약 주생성자에서 선언된 것 외의 프로퍼티를 처리해야 한다면 아래와 같이 추가적으로 처리해줘야 함.

import android.os.Parcel
import android.os.Parcelable
import kotlinx.android.parcel.Parceler
import kotlinx.android.parcel.Parcelize

@Parcelize
class User() : Parcelable {
    var name: String? = null
    var email: String? = null

    constructor(parcel: Parcel): this() {
        parcel.run {
            name = readString()
            email = readString()
        }
    }
    private companion object : Parceler<User> {
        override fun User.write(parcel: Parcel, flags: Int) {
            parcel.writeString(name)
            parcel.writeString(email)
        }

        override fun create(parcel: Parcel): User {
            return User(parcel)
        }
    }
}

결국 Android Extensions 플러그인의 기능을 안쓰는 것과 큰 차이는 안나는 듯.

결론

Kotlin에서 Parcelable 사용시 Android Extension 플러그인의 실험실 기능을 사용하면 편해짐.

대신 프로퍼티를 꼭 주생성자에 추가하고 사용하자.

 

  형태 인자 반환
let fun <T, R> T.let(block: (T) -> R): R 호출한 객체 블록 결과값
apply fun T.apply(block: T.() -> Unit): T 호출한 객체 내 메서드 및 속성 객체 자체 반환
run fun <T, R> T.run(block: T.() -> R): R 호출한 객체 내 메서드 및 속성 블록 결과값
with fun <T, R> with(receiver: T, block: T.() -> R): R 호출한 객체 내 메서드 및 속성 블록 결과값

run과 with가 유사하지만 run에서만 Safe Calls를 지원함.

Android 앱 개발시 EditText 에 키보드 옵션을 줄 수 있습니다.

흔히 주는 옵션으로는 `imeOptions``inputType` 등이 있지요. (아래 링크 참조)

 

https://developer.android.com/reference/android/text/InputType

불러오는 중입니다...

https://developer.android.com/training/keyboard-input/style

불러오는 중입니다...

 

imeOptions로 키보드에 버튼 타입 등을 조정할 수 있습니다.

(엔터 버튼 대신 `다음` 또는 `완료` 같은 키로 나오는 등)

 

inputType으로 키보드로 입력 가능한 타입을 정할 수 있습니다.

(비밀번호 입력 형태 등)

 

다만 안드로이드 단말 특성상 제조사별로 다른 키보드가 들어가 있다보니 작은 이슈가 있었습니다.

 

특정 앱에서 삼성 갤럭시 단말의 쿼티 자판으로 한글이 입력이 안되는 경우가 발견된 거죠.

(같은 단말 천지인 자판으로 변경 후는 한글이 잘 입력됨.)

 

재미있는 건 LG 단말에서는 쿼티 자판으로도 한글이 잘 입력됩니다.

 

그리고 넥서스 단말에선 아예 쿼티에서 한글 전환이 불가했고요.

 

확인 결과 문제가 발생하는 경우 inputType 값이 `textVisiblePassword`로 지정되어 있었습니다.

저 타입을 제거할 경우 정상적으로 한글이 잘 입력되더군요.

 

영어, 숫자만 입력이 가능하게 한 것이 목적이었던 것 같은데요.

아마 다른 방법을 찾아야 할 것으로 보이네요.

점심에 회사 동료들과 근처 중국집에 갔습니다.
런치 세트가 있어 시켰는데요.
생각보다 구성도 알차고 맛있었네요.
남자 6명이 가서 짜장+차돌짬뽕 세트 2개와 새우볶음밥 2개 세트 1개를 시켰어요.
런치세트에는 기본적으로 크림새우(4p)와 탕수육(10p)가 포함이고요.
저렴한 가격에 푸짐히 잘 먹고 왔답니다.
추천할만 합니다!!

SMS 또는 통화 기록 권한 그룹 사용 ( ~ 2019/01/09)

위 권한들이 앱에 있을 경우 Google Play에 업데이트시 심사가 어려워짐.

아래 링크들 참조 필요.
https://support.google.com/googleplay/android-developer/answer/9047303
https://play.google.com/about/privacy-security-deception/permissions/
https://m.clien.net/service/board/news/12813944

Google Play services API 14 & 15 지원 중단
- Google Play Services 14.7.99 까지만 지원
https://android-developers.googleblog.com/2018/12/google-play-services-discontinuing.html

FCM 전환 (~ 2019/04/11)

기존 GCM에서 FCM으로 전환되면서 이제 GCM 서비스 종료됨.
https://developers.google.com/cloud-messaging/android/android-migrate-fcm

안드로이드 Pie(OS 9, API 28)에서 https 접근 문제

웹뷰나 API 등 작업으로 https시 오류나는 경우들 발생함.
https://android-developers.googleblog.com/2018/04/protecting-users-with-tls-by-default-in.html
https://developer.android.com/training/articles/security-config#CleartextTrafficPermitted
http://nobase-dev.tistory.com/search/usesCleartextTraffic
https://namu.wiki/w/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C(%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C)/%ED%8C%8C%EC%9D%B4

'Android개발 > News' 카테고리의 다른 글

[Android] 2018년부터 Target API 지정 관련 내용.  (0) 2017.12.29
점심에 회사 동료들과 한번 타이요리를 먹으러 다녀왔습니다.
가격이 무시못하겠지만....
맛은 확실히 보장되는 것 같습니다.
남자 6명이 가서 3인짜리 C 세트 2개에 미고랭 하나와 코코넛 라씨 1+1 행사라 3잔+3잔 시켰네요.
대략 가격은 15만원 조금 넘게 나왔고요.
참고로 C세트에는 텃만꿈, 뿌팟 봉커리, 새우 게살 볶음밥, 왕새우 팟타이가 나오더군요.
모두 배부르게 잘 먹고 왔고요.
만족스러웠던 것 같아요.
추천합니다~

3일 전까지 문제없이 잘 돌아가던 안드로이드 프로젝트에서 갑자기 빌드가 안되는 문제가 발생하였습니다.

주말이 지났을 뿐인데 아래와 같은 로그와 함께 gradle sync도 안되는 문제였습니다.

org.gradle.api.ProjectConfigurationException: A problem occurred configuring project ':mymodule'.
...
Caused by: groovy.lang.MissingPropertyException: Could not get unknown property 'assemble' for task ':mymodule:assembleDebug' of type org.gradle.api.DefaultTask.

혹시나 하는 마음에 소스를 1년 전 껄로 돌려보아도 동일하고, 딱히 형상관리에 문제도 없어 보였죠.

gradle 살펴보던 중 가변적인 요소가 하나 눈에 들어왔고, 그 부분이 원인이었습니다.

classpath 'io.fabric.tools:gradle:1.+'

앱 최상위에 있는 build.gradle에 정의된 Fabric 설정이 문제였습니다.

혹시나 해서 Fabric 쪽 릴리즈 페이지를 찾아보이 3월 15일에 업데이트가 있었네요.

https://docs.fabric.io/android/changelog.html#fabric-gradle-plugin

그 전 버전인 1.27.1 버전으로 수정 후 정상동작을 확인하였습니다.

//classpath 'io.fabric.tools:gradle:1.+'
classpath 'io.fabric.tools:gradle:1.27.1'


어제 구글플레이를 통한 APK 업로드가 무조건 오류가 떨어지는 사례들이 많이 나왔습니다.

국내 카카오톡 오픈채팅방 중 안드로이드 개발자 방에서도 이로 인해 어려움을 호소하는 분들이 많았었죠.

이에 대한 원인은 아직 정확히 못찾아봤는데요. 사람들은 아래 기사의 장애들로 인한 여파로 보는 것 같았습니다.


https://news.naver.com/main/read.nhn?mode=LSD&mid=sec&sid1=105&oid=366&aid=0000429027


어쨋든 배포를 해야하는 개발자들에겐 큰 재앙같은 소식이었죠.

그나마 구글 쪽 문제였다는 걸 공유하고 받은 사람들은 구글 탓이라도 하였겠지만,

그런 소식을 못받은 사람들은 APK 에서 원인을 찾으려 삽질을 했을 수도 있겠죠.


구글에서는 자사 서비스의 상태를 아래 링크를 통해 확인할 수는 있습니다.


https://www.google.com/appsstatus#hl=ko&v=status


다만 구글 플레이는 없는 것 같아 문제는 여전하죠.

그래서 구글에서 직접 고지하는 건 아니지만 이런 장애 소식을 알려주는 곳이 있나 찾아보다가 아래 링크를 찾았습니다.


https://downdetector.com/status/google-play


구글 플레이에 장애 발생시 유저들이 그 장애에 대해 보고하는 사이트 같았습니다.

여기서 그래프 및 댓글들로 구글 플레이에 장애가 있는지 여부를 참고할 수 있을 것 같습니다.

앞으로 의심이 될때 한번씩 찾아봐야겠습니다.



+ Recent posts