Kori 3월 11일에 포스트됨 공유하기 3월 11일에 포스트됨 짐 메키트 (Jim Mckeeth)의 "Developing for Android 11 & 12 with Delphi 11 Alexandria" 을 번역했습니다. (원문 작성: 2022년 2월, 최종 번역: 2022년 3월) 옮긴이: 원문 작성일이 번역일 기준 1년 1개월 전임을 고려하고 읽기 바랍니다. IT 환경은 매우 빠르게 변하고, 델파이도 이에 맞추어 변하고 있습니다). 그럼에도 불구하고 안드로이드 앱을 개발하는 델파이 개발자에게 도움되는 내용이라고 판단되어 늦었지만 번역하였습니다. 번역일 현재 안드로이드 최신 버전은 13이며, 델파이 최신 버전인 11.3에서 공식 지원하고 있습니다) 안드로이드 11은 새 스마트폰 대부분에 탑재되어 제공된다. 하지만, 안드로이드 12는 모든 픽셀(Pixel) 장비에 들어있다. 이 웨비나는 안드로이드 11과 12에서 달라진 것이 무엇인지를 살펴보고, 안드로이드 개발에 적용할 수 있는 가장 좋은 적용 방법와 팁을 제공한다. 발표자료 보기/다운로드 목차 1 데스트탑, 모바일,태블릿 OS(운영 체제) 시장 점유율 2 모바일 장비 제조사 시장 점유율 추이 (2020.1 - 2022.1) 3 모바일 장비 제조사 시장 점유율 (2022.1) 4 안드로이드 vs iOS 시장 점유율 추이 (2020.1 - 2022.1) 5 모바일 안드로이드 버전 시장 점유율 추이 (2020.1 - 2022.1) 6 모바일 안드로이드 버전 시장 점유율 (2022.1) 7 안드로이드 플레이의 보안 및 성능 요구 사항 8 델파이 11에서 안드로이드 관련 변경 9 델파이 11에서 안드로이드 12 지원? 10 기존 안드로이드 프로젝트를 업그레이드하기 11 델파이 개발자의 안드로이드 도구를 업데이트하기 12 무선 디버깅 13 안드로이드 앱 번들(App Bundle) 포맷 14 안드로이드의 새 런타임(Runtime) 권한(Permission) 모델 15 예전 권한 승인(Permissions Approval) 대화창 16 새 권한 승인(Permissions Approval) 대화창 17 사용자들은 이제 세분화된 권한 제어(Permission Control)를 가진다 18 위험한 권한 vs 일반 권한 19 권한(Permission) 요청 방법 - 델파이 20 델파이의 권한 서비스 (Permission Service) 21 IsPermissionGranted 메소드 22 IsEveryPermissionGranted 메소드 23 RequestPermissions 24 TRequestPermissionsResult[Event|Proc] 25 권한(Permission)을 언제 요청하는가 26 중대한 권한(Critical Permission)을 언제 요청하는가 27 부수적인 권한(Secondary Permission)을 언제 요청하는가 28 가장 좋은 적용 방법 기타 29 추가 정보 30 다음 단계 1 데스트탑, 모바일,태블릿 OS(운영 체제) 시장 점유율 https://gs.statcounter.com/os-market-share/desktop-mobile-tablet/worldwide/#monthly-200901-202201 2 모바일 장비 제조사 시장 점유율 추이 (2020.1 - 2022.1) https://gs.statcounter.com/vendor-market-share/mobile/worldwide/#monthly-202001-202202 3 모바일 장비 제조사 시장 점유율 (2022.1) https://gs.statcounter.com/vendor-market-share/mobile/worldwide/#monthly-202001-202202 4 안드로이드 vs iOS 시장 점유율 추이 (2020.1 - 2022.1) https://gs.statcounter.com/vendor-market-share/mobile/worldwide/#monthly-202001-202202 5 모바일 안드로이드 버전 시장 점유율 추이 (2020.1 - 2022.1) https://gs.statcounter.com/android-version-market-share/mobile/worldwide/#monthly-202001-202201 6 모바일 안드로이드 버전 시장 점유율 (2022.1) 2022년 현재 안드로이드 11이 가장 많이 사용되고 있다. Android 12 released Oct 4, 2021 Android 11 released Sept 8, 2020 Android 10 released Sept 3, 2019 Android 9 released Aug 6, 2018 Android 12 = API 31 Android 11 = API 30 Android 10 = API 29 Android 9 = API 28 (Pie) https://gs.statcounter.com/android-version-market-share/mobile/worldwide/#monthly-202001-202201 7 안드로이드 플레이의 보안 및 성능 요구 사항 매년마다 targetSdkVersion 요구사항이 올라간다. 새 안드로이드 버전이 출시되면 그로부터 1년 이내에 새 앱 등록과 기존 앱 업데이트 시 해당 API 업데이트 버전 또는 그 이상을 목표로 해야 한다. 2021년 11 타겟 API 레벨 30 (안드로이드 11) 안드로이드 앱 번들(App Bundle) 포맷으로 게시(Publish) 구글 플레이 콘솔에서 요구하는 사항 API 마이그레이션 가이드를 통해 기타 변경 사항 확인하기: developer.android.com/distribute/best-practices/develop/target-sdk 8 델파이 11에서 안드로이드 관련 변경 옮긴이: 원문 작성 후부터 2022년 3월 현재까지 1년간 델파이의 추가 변경 사항은 아래 링크 참조 델파이 11.3, 델파이 11.2, 델파이 11 모아 보기 구. "Support Library" 라이브러리에서 새 "AndroidX" 라이브러리로 마이그레이션되었다: https://developer.android.com/jetpack/androidx 9 델파이 11에서 안드로이드 12 지원? 옮긴이: 번역일 (2022.3.10) 최신 버전인 델파이 11.3에서는 안드로이드 13을 공식 지원합니다. 10 기존 안드로이드 프로젝트를 업그레이드하기 예전 버전으로 만든 안드로이드 프로젝트 열기 프로젝트(Projects) 창으로 가기 활성화된 타겟 플랫폼으로 Android 32-bit를 선택 Libraries 노드에서 마우스 오른쪽 클릭 Revert System Files to Default 선택 써드-파티 라이브러리 등을 커스터마이징 Android-64에서도 위 조치를 반복 비디오에서 이 부분 "기존 안드로이드 프로젝트를 업그레이드하기 데모" 보기 델파이 개발자의 안드로이드 도구를 업데이트하기 델파이에서는 추가 선택 설치를 통해 Android SDK 25.2.5과 업데이트를 설치할 수 있다. 경로에 ADB를 추가한다: C\Users\Public\Documents\Embarcadero\Studio\22.0\CatalogRepositoryAndroidSDK-2525-22.0.42600.6491\platform-tools 경로에 SDKManager를 추가한다: C\Users\Public\Documents\Embarcadero\Studio\22.0\CatalogRepository\AndroidSDK-2525-22.0.42600.6491\toolsbin 실행한다 adb kill-server SDKManager —update adb version “.android/repositories.cfg could not be loaded.”에러가 발생하는 경우, 사용자의 디렉토리에 .android 폴더가 있는 지 확인한다 빈 repositories.cfg 파일을 생성한다 최신 버전 (2022년 현재) Android Debug Bridge version 1.0.41 Version 32.0.0-8006631 12 무선 디버깅 안드로이드 11 (API 30)에서 추가됨 안드로이드 장비에서 개발자 모드로 들어간다("빌드 번호"를 7번 탭한다) 무선 디버깅을 활성화한다 개발자 옵션 -> 무선 디버깅 페어링 코드로 기기 페어링을 탭한다. "이 네트워크에서 항상 허용하기"를 체크하고 확인 창이 뜨면 "허용"을 누른다 윈도우 CMD(명령창)에서 adb start-server adb pair [ip]:[port] (from pairing dialog) [페어링 코드] adb connect [ip]:[port] (무선 디버깅 화면에 있는 값) 델파이 IDE에서 장비 새로고침 실행 비디오에서 이 부분 "무선 디버깅 데모" 보기 13 안드로이드 앱 번들(App Bundle) 포맷 이 포맷은 구글 플레이에서 Dynamic Delivery application servicing model을 사용하여 각 장비에 최적화된 APK를 만들 수 있도록 한다. Project > Options > Building > Delphi Compiler > Compiling Generate Android App Bundle file (arm + arm64) 앱 번들(App Bundle) 생성에 성공하면, 델파이 IDE은 대화창을 띄워서 해당 .aab 파일 경로를 알려준다. 알아둘 점: 앱 번들(App Bundle)은 개발자가 실행하거나 디버깅할 수 었다. 해당 애플리케이션을 디버깅하려면 .APK 패키지 포맷을 사용해야 한다. https://docwiki.embarcadero.com/RADStudio/en/Submitting_Your_Android_App_to_Google_Play#Android_App_Bundle_Support 14 안드로이드의 새 런타임(Runtime) 권한(Permission) 모델 안드로이드 6.0 (API 23) Marshmallow에서 도입됨 지원 라이브러리는 그 이전 안드로이드 버전들을 커버함 새 모델은 자동-업데이트 절차를 간소화한다 최초 사용 시 권한(Permission)승인 설치 시에 모든 권한을 승인하는 방식이 아니다 권한 제어를 최종 사용자가 더 많이 할 수 있게 되었다 각 앱 별로 개별 권한을 승인 또는 거부할 수 있으며, 이후에 변경할 수도 있다 안드로이드의 새 API 메소드인 checkSelfPermission()와 requestPermissions()를 통해 관리한다. 더 많은 내용: https://developer.android.com/training/permissions/requesting 15 예전 권한 승인(Permissions Approval) 대화창 설치 중에 모든 권한 수락 사용자는 개별 권한 거부 불가 모든 권한이 매니페스트(manifest) 안에 공개됨 권한이 변경되면, 업데이트 전에 승인을 받아야 함 16 새 권한 승인(Permissions Approval) 대화창 사용자는 개별 권한을 처음 요청받을 때 허용 또는 거부를 할 수 있다. 사용자가 일단 거부한 경우, 그 앱에서 다시 권한을 요청하지 못하도록 할 수 있다. 언제 그리고 어떻게 권한을 요청할 것인지가 중요하다 (뒤에서 추가 설명) 모든 권한은 여전히 매니페스트(manifest) 안에 공개됨 17 사용자들은 이제 세분화된 권한 제어(Permission Control)를 가진다 18 위험한 권한 vs 일반 권한 일반 권한은 사용자에게 요청이 가지 않는다 예: 인터넷, 진동, 블루투스 등 위험한 권한은 사용자가 반드시 승인하도록 되어 있다. 개인정보, 비용 발생 가능성 등이 전형적으로 여기에 해당한다. 이 권한들은 해당 권한 그룹 안에 모여있다 Calendar, Call_Log, Camera, Contacts, Location, Microphone, Phone, Sensors, SMS, Storage 사용자는 그룹을 통째로 승인한다 예를 들어 SMS 보내기와 받기 여전히 개발자는 필요한 안드로이드 OS의 모든 권한을 매니페스트(manifest) 안에 넣어서 선언하고 요청해야 한다. 더 많은 내용: https://developer.android.com/guide/topics/permissions/overview 19 권한(Permission) 요청 방법 - 델파이 개발자는 필요한 권한을 프로젝트의 속성에서 지정해 주어야 한다. 그러면, 필요한 권한들이 만들어진 앱의 매니페스트에 들어간다. 더 많은 내용: https://docwiki.embarcadero.com/RADStudio/en/Android_Permission_Model 20 델파이의 권한 서비스 (Permission Service) System.Permissions 유닛에는 PermissionsService라고 하는 TPermissionsService 클래스의 인스턴스가 있다. 또는 DefaultService 프로퍼티를 통하여 여기에 접근할 수 있다. docwiki:/Libraries/System.Permissions.TPermissionsService IsPermissionGranted: 앱에서 권한이 현재 허용되었는 지 여부 docwiki:Libraries/System.Permissions.TPermissionsService.IsPermissionGranted RequestPermissions: 특정 권한 또는 해당 권한 그룹을 요청 docwiki:Libraries/System.Permissions.TPermissionsService.RequestPermissions IsEveryPermissionGranted: 목록에 있는 권한들이 현재 모두 허용되었는 지 여부 docwiki:Libraries/System.Permissions.TPermissionsService.IsEveryPermissionGranted 델파이 RTL에서 안드로이드 유닛에 새로 추가된 관련 타입들 Manifest.permission과 Build.VERSION (Androidapi.JNI.Os.pas 파일 안) ContextCompat, ActivityCompat, PermissionChecker (Androidapi.JNI.Support.pas 파일 안) 21 IsPermissionGranted 메소드 System.Permissions.TPermissionsService의 멤버 메소드 function IsPermissionGranted(const APermission: string): Boolean; 앱에서 권한이 현재 허용되었는 지를 알아낸다 여전히 허용되고 있다고 절대로 가정하지 말자 검사를 실제로 수행하도록 구현된 플랫폼 권한 서비스가 없는 경우, 기본적으로 모든 권한이 부여되었다고 응답한다. docwiki:/Libraries/System.Permissions.TPermissionsService 22 IsEveryPermissionGranted 메소드 docwiki:/RADStudio/Uses_Permissions docwiki:Libraries/System.Permissions.TPermissionsService.IsEveryPermissionGranted System.Permissions.TPermissionsService의 멤버 메소드 function IsEveryPermissionGranted(const APermissions: TArray<string>): Boolean; F목록에 있는 권한들이 현재 모두 허용되었는 지를 알아낸다 여전히 허용되고 있다고 절대로 가정하지 말자 권한 문자열(string)은 TJManifest_permission.JavaClass (Androidapi.JNI.Os 안에서 찾을 수 있다) 권한 및 설명 목록 23 RequestPermissions System.Permissions.TPermissionsService의 멤버 메소드 procedure RequestPermissions( const APermissions: TArray<string>; const AOnRequestPermissionsResult: TRequestPermissionsResult[Event|Proc]; AOnDisplayRationale: TDisplayRationale[Event|Proc] = nil); 하나 또는 그 이상의 권한(permission)을 요청 현재 허용된 상태가 아닌 권한 모두를 요청 이미 거부된 권한을 다시 요청하는 경우, 그 권한에 대한 근거 문자열이 설정되어 있어서 이전에 근거 표시 루틴이 전달된 경우 그 근거가 사용자에게 사전에 표시될 수 있다. docwiki:Libraries/System.Permissions.TPermissionsService.RequestPermissions 24 TRequestPermissionsResult[Event|Proc] RequestPermissions에서 오는 콜백(Callback) TRequestPermissionsResult[Event|Proc] = procedure(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>); 시스템에서 우리의 권한 요청을 처리했을 때의 콜백 타입(Callback type) APermissions 안에 있는 각 요청된 권한 마다, AGrantResults 안에 불린(Boolean) 값으로 들어 있어서 해당 요청이 승인되었는지 여부를 알 수 있다 docwiki:Libraries/en/System.Permissions.TRequestPermissionsResultEvent docwiki:Libraries/en/System.Permissions.TRequestPermissionsResultProc 25 권한(Permission)을 언제 요청하는가 권한을 알맞은 때 알맞은 방법으로 요청하면 사용자는 더 잘 승인한다 해당 앱에서 요청하는 권한이 왜 필요한지 사용자가 명확히 알 수 없다면, 권한 요청을 하기 전에 왜 필요한 지를 설명한다. 권한 요청을 처음 했을 때 사용자가 거부한다면, 왜 필요한 지를 설명한다. 모든 권한을 한번에 요청하지 말라. 26 중대한 권한(Critical Permission)을 언제 요청하는가 귀하의 앱 기능에서 중대한 (Critical) 권한인 경우, 앱이 처음 시작할 때 요청한다 그 권한이 꼭 필요한 이유가 명확하다면, 바로 사용자에게 요청한다 예: SMS(문자 메시지) 앱 그 권한이 꼭 필요한 이유가 명확하지 않다면, 사용자에게 알려준다. 예: 노트 기록 앱에서 노트가 기록된 위치를 저장하는 경우 사용자가 처음 그 앱을 실행할 때 환영 메시지를 제시하면서, 해당 내용을 알려준다. 부수적인 권한이라면, 바로 요청하지 않고 기다린다! 27 부수적인 권한(Secondary Permission)을 언제 요청하는가 사용자가 앱을 사용할 때 해당 권한이 필요할 수 있고 그렇지 않을 수도 있는 기능에 필요한 권한 이런 경우, 사용자가 해당 작동을 하는 시점에 권한을 요청한다 예: 사진 찍기, 공유하기, 등 그 권한이 꼭 필요한 이유가 명확하지 않다면, 사용자에게 권한을 요청하기 전에 먼저 알려준다. 예: 먼저 해당 기능과 필요한 권한을 설명하는 내용을 설명하는 대화창을 제공한 후에 권한을 요청한다. 이와 같이 부수적인 권한을 필요할 때 요청하면, 사용자가 앱을 처음 실행할 때 너무 많은 권한을 승인하게 하는 압박을 줄일 수 있다. 28 가장 좋은 적용 방법 기타 메소드와 대화창의 Async 버전을 사용하라 UI 처리 쓰레드를 가로막지 말라 비디오에서 이 부분 "Async 메소드 데모" 보기 항상 HTTPS를 사용하라 (모든 것이 안전해야 한다) 델파이의 새 HTTP 클라이언트 라이브러리를 사용하라: docwiki.embarcadero.com/RADStudio/en/Using_an_HTTP_Client Indy는 여전히 사용할 수 있고, 업데이트와 지원이 되고 있다 병렬 프로그래밍(Parallel Programming) 라이브러리를 알아두라 docwiki.embarcadero.com/RADStudio/en/Using_the_Parallel_Programming_Library System.IOUtils와 TPath를 알아두라 docwiki.embarcadero.com/RADStudio/en/Standard_RTL_Path_Functions_across_the_Supported_Target_Platforms ADB, logcat, Log.d를 알아두라 https://docwiki.embarcadero.com/Libraries/en/FMX.Types.Log.d https://github.com/DelphiWorlds/DeviceLens https://github.com/DelphiWorlds/Codex 29 추가 정보 SD 카드에 쓰기: stackoverflow.com/a/57600189/255 삭제가능한 SD 카드 경로 받기 Androidapi.JNI.Os.pas getExternalStorageDirectory getExternalStoragePublicDirectory getExternalStorageState “Mobile Permissions Component for Android”를 겟잇(GetIt)에서 받기 getitnow.embarcadero.com/mobile-permissions-component-for-android/ github.com/adrianosantostreina/MobilePermissions/ 30 다음 단계 RAD 스튜디오 평가판 시작하기: embarcadero.com/products/rad-studio/start-for-free 커뮤니티 에디션 받기: embarcadero.com/products/delphi/starter 특별 프로모션 찾기 (RAD 스튜디오 새 버전) www.devgear.co.kr/radoffer 유튜브 구독: youtube.com/c/EmbarcaderoTechnologies 트위터 팔로우: twitter.com/embarcaderotech 페이스북에서 좋아요: facebook.com/embarcaderotech 링크드인 팔로우: linkedin.com/company/embarcadero-technologies 블로그 읽기: blogs.embarcadero.com 1 인용하기 이 댓글 링크 다른 사이트에 공유하기 더 많은 공유 선택 사항
Recommended Posts
이 토의에 참여하세요
지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.