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를 지원함.

+ Recent posts