1. 아래와 같은 로그가 떨어짐.

ERROR: The specified Gradle distribution 'https://services.gradle.org/distributions/gradle-4.4-all.zip' does not appear to contain a Gradle distribution.

2. Android Gradle plugin 버전 및 사용하려는 gradle 버전 확인

./build.gradle

buildscript { dependencies { classpath 'com.android.tools.build:gradle:3.1.4' } }

.\gradle\wrapper\gradle-wrapper.properties

distributionUrl=https://services.gradle.org/distributions/gradle-4.4-all.zip

3. 버전별 최소 gradle 버전 확인

https://developer.android.com/studio/releases/gradle-plugin#updating-gradle

3 - 1. 최소 gradle 버전에 부합한 경우 맞춰서 수정

build.gradle 이나 gradle-wrapper.properties 파일 내 버전을 한쪽에 맞춰서 수정

4. 최소 gradle 버전에 적합한데도 발생한 경우

예전에 직접 gradle 쪽 초기화를 하고 싶어 직접 gradle 경로에서 파일들을 삭제 하던 중 폴더만 남고 삭제가 안된 경우가 있었음. 그로 인해 gradle 있지만 동작 안하는 것으로 감지한 듯함. 직접 gradle zip 파일을 받아서 해당 경로에 풀어 주고 다시 gradle sync

  • gradle zip 다운로드 : https://services.gradle.org/distributions/gradle-4.4-all.zip

  • gradle 경로 확인 : Android Studio -> File -> Settings -> Build, Execution, Deployment -> Gradle -> Service directory path 확인

  • \.gradle\wrapper\dists\gradle-4.4-all\9br9xq1tocpi6njlyu5op1\gradle-4.4\ 위치에 zip 압축 해제

  • Android Studio에서 다시 sync

개발자가 테스트 전달 전 확인사항

1. 구글 플레이 콘솔에서 Alpha 등록 확인하기

앱 선택 → "출시 관리" → "앱 버전" → 공개 트랙 or 비공개 트랙 확인하기

2. 지정된 테스트 여부 확인하기

공개 트랙 or 비공개 트랙 우측 "관리" → 테스트 참여 대상 관리 → 사용자 그룹 확인

3. 테스트 참여 URL 전달

테스트 참여자에게 URL 전달 후 테스트 참여 수락

(ex. https://play.google.com/apps/testing/com.sample.app)

*** 구글 플레이에 적용까지는 각 단말마다 다르게 시간이 걸릴 수 있음.**

테스트 참여자가 테스트할 경우

1. 전달받은 테스트 참여 URL에서 참여 수락

테스트할 폰의 계정으로 로그인 후 수락해야 함.

(폰의 Google 계정임)

(참고로 참여 URL은 각 앱마다 다름)

(ex. https://play.google.com/apps/testing/com.sample.app)

테스트 확인 후 정식 앱 확인이 필요할 경우 다시 테스트 참여 URL에서 프로그램 종료

*** 아래와 같이 뜰 경우 테스트 계정이 포함이 안되어 있는 경우이니, 담당 개발자에게 테스트 계정 추가를 요청.**

2. 테스트 단말에서 구글 플레이 실행한 후 테스트할 앱 검색.

아래와 같이 베타 테스트에 참여 중이라는 문구나 업데이트 날짜 등으로 베타 앱인지 체크

아래와 같이 베타 테스트에 대한 문구나 업데이트 날짜가 다르다면 담당 개발자에게 문의.

(대체적으로 구글 플레이에서 단말별로 업데이트 되는 시간이 달라 생기는 문제일 가능성이 큼)

3. 앱 설치 후 기능 테스트

Android 앱 개발시 Activity의 Launch Mode에 따른 동작들이 헷갈릴 때가 많습니다.

 

볼 때 다시 찾아보고 다시 기억을 되새김 해야 하는데 대부분 글과 그림으로 설명이 되어 있지요.

 

좀 더 보기 쉽도록 애니메이션으로 만들어 올린 링크가 있어 공유합니다.

 

https://itnext.io/the-android-launchmode-animated-cheatsheet-6657e5dd9b0f

 

The Android LaunchMode Animated CheatSheet - ITNEXT

Before API 11, we used activities show every new page on the screen. Now with Fragments and the navigation tools in API 28, it’s totally…

itnext.io

 

위와 같이 보기 쉽게 여러가지 경우들을 만들어 놓으셨네요.

 

기억이 안나실 때 한번씩 볼만 할 것 같습니다.

 

앞으로 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

+ Recent posts