Android Studio 에서 Signature APP 만들기

이미지
  Android Studio 에서 Signature APP 만들기 Android Studio , 에뮬레이터환경에서 Signature App을 만드는 방법에 대해서 기술한다. Android 권한과 관련하여 시스템적으로 중요 정보를 얻기 위해서는 Protection Level 이 Signature 이상이여야 한다. 즉, 시스템 권한이 필요한 경우 pre-built된 앱 혹은 동일한 플랫폼 사이닝키로 인증된 경우 사용 가능하다. 아래는 Android Studio 를 통해서 에뮬레이터 환경에서 플랫폼 사이닝키로 인증하는 방법에 대해서 알아보자. AOSP 퍼미션 정책 AOSP Permision Protection Level Protection Level 선언부 접근 권한 서드파티 앱 normal  "normal" 각 앱에서 <use-permission/> 선언 후, 사용자 동의 없이 사용 가능 사용 가능 dangerous  "dangerous" 각 앱에서 <use-permission/> 선언 후, 사용자 동의 하에 사용 가능 (유저 퍼미션 팝업 및 동의 필요) 사용 가능 signatureOrSystem  "signature|privileged " 아래 signature에 해당되거나, system/priv-app/ 경로에 프리빌트된 앱에서 사용 가능 사용 불가 (플랫폼 사이닝 키 필요) signature  "signature" <permission/> 선언한 앱과 <use-permission/> 선언한 앱이 동일한 인증서로 사인된 경우 사용 가능 사용 불가 (플랫폼 사이닝 키 필요) *signature → certificate: "platform" *system → privileged: true *privileged → allowlist → required: ["allowed_privapp_com.android.car.rotary

Kotlin as 연산자

이미지
Kotlin as 연산자 객체를 지정된 클래스 타입으로 변환하는 연산자이다. 참조 변수 as 클래스 타입 만약 객체가 지정된 클래스타입과 관계가 없을 경우 오류가 발생한다. 형 변환이 발생한 참조 변수는 변환된 타입을 유지한다. as 연산자 여기서 변수는 형변환을 수행하려는 변수이고, 타입은 변수를 변환하려는 타입입니다. as 연산자를 사용하여 변수를 다른 타입으로 변환하면, 변수는 해당 타입으로 강제로 변환됩니다. 명시적 형변환 Kotlin에서 as 연산자는 명시적으로 변수의 타입을 변환하기 위해 사용됩니다. as 연산자를 사용하여 변수를 다른 타입으로 변환할 수 있습니다. 이는 명시적 형변환이라고도 합니다. fun main () { val obj1:SubClass1 = SubClass1() val super1:SuperClass1 = obj1 // SubClass1 으로 명시적 형변환을 하지 않으면 subMethod1 을 사용할 수 없다 . // super1 as SubClass1 // 주석을 해제 하면 Error가 해결된다. super1.subMethod1() // Error } open class SuperClass1 interface Inter1 class SubClass1 : SuperClass1() { fun subMethod1 () { println ( "subMethod1" ) } } class SubClass2 : Inter1 Kotlin: Unresolved reference: subMethod1 fun main () { val obj1:SubClass1 = SubClass1() val super1:SuperClass1 = obj1 super1 as Inter1 // Runtime Error } open class SuperClass1 interface Inter1 class SubClass1 : SuperClass1() { fu

Kotlin 형변환

Kotlin 형변환 변수에 담긴 값이나 객체를 다른 형태로 변환하는 것을 의미한다. Kotlin 은 모든 값을 객체로 관리하기 떄문에, Kotlin 에서의 형변환은 다른 클래스 타입의 객체로 변환하는것을 의미한다. 스마트 캐스팅 Java에서 자동형변환이라고 부르는 개념이다. 특정 조건을 만족하면 자동으로 형변환이 발생하는 개념이다. 스마트 캐스팅 기능 덕분에 형변환에 대해 개발자가 크게 신경을 쓰지 않아도 된다. 형 변환은 객체의 클래스 타입이 아닌 객체의 주소 값을 가지고 있는 참조 변수의 타입이 변경되는 것이다. 객체 타입 변환 객체의 타입변환은 상속관계나 구현한 인터페이스 타입에 해당한다. 부모클래스의 타입으로 형변환 fun main () { val obj1:SubClass1 = SubClass1() val obj2:SubClass2 = SubClass2() // 부모클래스 타입 참조 변수에 담는다 . val super1:SuperClass1 = obj1 } open class SuperClass1 interface Inter1 class SubClass1 : SuperClass1() class SubClass2 : Inter1\ 구현한 인터페이스 타입으로 형변환 fun main () { val obj1:SubClass1 = SubClass1() val obj2:SubClass2 = SubClass2() // 부모클래스 타입 참조 변수에 담는다 . val inter1:Inter1 = obj2 } open class SuperClass1 interface Inter1 class SubClass1 : SuperClass1() class SubClass2 : Inter1 구현한 인터페이스 타입으로 형변환 fun main () { val obj1:SubClass1 = SubClass1() val obj2:SubClass2 = SubClass2() val super1:Su

Kotlin - JetPack Compose Desktop Application 개발 기초

Kotlin - JetPack  Compose Desktop Application 개발 기초 Kotlin Jetpack Compose Desktop는 Kotlin 언어로 작성된 데스크톱 애플리케이션을 개발하기 위한 프레임워크입니다. 이를 사용하면 선언적 UI 프로그래밍 방식을 통해 사용자 인터페이스를 구축할 수 있습니다. Jetpack Compose Desktop은 Android용 Jetpack Compose의 데스크톱 버전으로, Android 앱이 아닌 일반적인 데스크톱 플랫폼에서 작동하는 애플리케이션을 만들 수 있습니다. 아래는 Kotlin Jetpack Compose Desktop 애플리케이션을 개발하기 위한 기초 단계입니다. 개발 환경 설정  1. IntelliJ IDEA - 2022.3.3  2. Kotlin -   3. JetPack Compose - 1.0.0  4. JDK - Amazon Correctoo 18.0.2 프로젝트 생성  1. File - New - Project  2. Compose Multiplatform  - name , location, configuration : Signal Platform.  - JDK 18 버젼 선택 및 다운로드  - Compose , gradle 빌드 시 , JDK 18 버젼이 필요하다.  

Kotlin Null 처리

null 처리 NullPointerException Java 언어로 소프트웨어를 개발하다 보면 NullPointerException 에러를 자주 만나게된다. 이는 객체의 주소값이 담겨져 있지 않는(null 값이 들어있는) 참조 변수를 통해 객체 접근을 시도하면 발생되는 오류이다. null safe  Kotlin 은 개발자가 null 이 담겨 있는 참조변수를 통해 객체 접근을 시도할때 오류가 발생되는 것을 방지하고자 다양한 방법을 제공하고 있다.  이를 통해 null 값에 대한 안정성을 확보 (null safe) 할 수 있다. ?: 연산자 ?: 연산자는 참조변수에 null 이 들어있으면 지정된 기본값을 반환한다. ?: 연산자는 nullable 타입 변수가 null인 경우 대체(default) 값을 지정하는 데 사용됩니다. 이 연산자를 사용하여 null인 경우 대체 값을 제공할 수 있습니다. fun main () { testFun1 ( " 문자열 " ) testFun1 ( null ) } fun testFun1 (str:String?) { val value1:String = str ?: " 기본문자열 " println (value1) } // 결과 문자열 기본문자열 ?. 연산자  참조 변수를 통해 메서드를 호출하거나 멤버 변수를 사용할 떄 참조 변수에 객체의 주소값이 들어있다면 객체에 접근해서 메서드나 변수를 사용한다. 만약 참조 변수에 null 이 들어 있다면 오류가 발생하지 않고 null 을 반환한다. ?. 연산자는 nullable 타입 변수 또는 객체에 접근할 때 사용됩니다. 해당 변수가 null이 아닌 경우에만 프로퍼티나 메소드에 접근하며, null인 경우에는 접근 대상을 null로 반환합니다. fun main () { testFun1 ( " 문자열 " ) testFun1 ( null ) } fun testFun1 (str:String?) { printl