How to run Kotlin files in a command-line

이미지
사용 버전: Kotlin 2.3.0 How to run Kotlin files in a command-line을 알아보겠습니다. 어떻게 코틀린(Kotlin) 파일들을 커맨드 라인(command-line)에서 실행할 수 있을까요? 참고한 문서입니다. https://kotlinlang.org/docs/command-line.html 보통은 아이디이(IDE)에서 실행하기 때문에 컴파일러(compiler)를 수동으로 받을 필요가 없습니다. 그렇지만, 저는 CI에서 돌려보려고 수동으로 받아보았는데요. 여기서 최신 컴파일러를 받을 수 있습니다. 현재 최신 버전은 2.3.0이네요. https://github.com/JetBrains/kotlin/releases 저는 kotlin-compiler-2.3.0.zip을 다운로드했습니다. 압축을 풀면 kotlinc라는 디렉터리가 생깁니다. bin이라는 디렉터리에 들어가면 다음과 같이 우리가 사용할 수 있는 프로그램들이 나옵니다. 여기서 Compiler는 kotlinc입니다. 그럼 kotlin 파일을 만들어 볼까요? test.kt라는 파일로 바탕화면에 만들었습니다. 위 코드는 아래에서도 볼 수 있습니다. https://pl.kotl.in/czIx_jKTs 그럼 실행해 봅시다. 먼저 compile을 해서 jar로 만들어 줘야 합니다. kotlinc/bin으로 가서 ./kotlinc [Kotlin 파일] -include-runtime -d [결과.jar 파일] 을 적어주면 됩니다. 그럼 이런 jar이 생깁니다. 잘(Jar)은 자바(Java)의 .class 파일들을 모아놓은 압축 형식입니다. .class는 Java 바이트코드(bytecode)로 변환된 파일입니다. Java에 대해 간단히 설명하자면, Java 언어로 작성된 코드를 javac라는 compiler가 .class 형식인 java bytecode로 변환하고 이것을 모아 Jar로 만듭니다. 이 java bytecode는 제이브이엠(JVM)이라는 Java 용 가상머신에서 읽을 수 있...

Android Room database embedded and relation

이미지
사용 언어: Kotlin 2.3.0 사용 버전: Android Studio Otter 2 Feature Drop | 2025.2.2 안드로이드 Room database embedded and relation을 알아보겠습니다. Room에서는 임베디드(Embedded)와 릴레이션(Relation)이라는 에너테이션(Annotation)을 제공해 줍니다. 해당 코드는 여기에 있습니다. https://github.com/android/nowinandroid/blob/main/core/database/src/main/kotlin/com/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResource.kt 먼저 @Embedded 먼저 살펴봅시다. Embedded에 대한 문서는 아래에 있습니다. https://developer.android.com/reference/androidx/room/Embedded 처음 사진에 있는 코드를 보면 NewsResourceEntity라는 것을 Embedded 합니다. 이 의미는 Sqlite로 매핑(mapping) 할 때 NewsResourceEntity의 필드(Field) 값을 PopulatedNewsResource의 Field에도 동일하게 사용하겠다는 뜻입니다. 그러면 PopulatedNewsResource의 Field는 id, title, content, url, header_image_url, publish_date, type, topics로 구성되겠네요. 다음으로 볼 것은 @Relation입니다. Relation 문서는 여기 있습니다. https://developer.android.com/reference/androidx/room/Relation parentColumn에 들어간 "id"는 PopulatedNewsResource에 있는 id를 사용하겠다는 말입니다. entityColumn에 들어간 "id"는 TopicEntity에...

iOS Error Undefined symbol Testing.Trait

이미지
사용 언어: Swift 5 사용 버전: Xcode Version 16.4 (16F6) iOS 오류 Undefined symbol Testing.Trait를 알아보겠습니다. Xcode를 최신 버전으로 업데이트해서인지, OS를 최신 버전으로 업데이트해서 인지, 잘 되던 빌드가 갑자기 안되었습니다. 오류 내용은 다음과 같습니다. Showing Recent Messages Could not find or use auto-linked framework 'CoreAudioTypes': framework 'CoreAudioTypes' not found Could not find or use auto-linked framework 'Testing': framework 'Testing' not found Could not parse or use implicit file '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Frameworks/SwiftUICore.framework/SwiftUICore.tbd': cannot link directly with 'SwiftUICore' because product being built is not an allowed client of it Undefined symbol: associated type descriptor for Testing.Trait.TestScopeProvider Undefined symbol: protocol descriptor for Testing.SuiteTrait Undefined symbol: method descriptor for Testing.SuiteTrait.isRecursive.getter : Swift.Bool Undefined sym...

Android Compose automation for getting localized images to use on Play Store app image

이미지
사용 언어: Kotlin 2.0.20 사용 버전: Android Studio Ladybug | 2024.2.1 Patch 3 Android Compose automation for getting localized images to use on Play Store app image를 알아보겠습니다. 저는 앱을 전 세계에 출시하고, 여러 언어로 제공해 주고 있습니다. 무려 67개 언어인데요. 사실 맞게 번역한 건지는 모르겠습니다. 이렇다 보니, 스토어의 앱 이미지를 변경할 때, 같은 이미지라도 언어를 달리하여 여러 장 찍어야 하는 노력이 필요하며, 여기에 들어가는 시간이 상당합니다. 2~3일 넘게 걸리는 것 같네요. 그래서 지금 앱 이미지가 옛날 이미지인 상태로 두었습니다. 스토어 이미지 현재 앱 이미지 엄청나게 다른데요. 오늘은 이것을 자동화해보겠습니다. Android에는 Screenshot test라는 것이 존재합니다. Screenshot을 비교해서 앱이 어떻게 달라졌나 확인하는 테스트인데요. 이것을 이용해서 Screenshot을 마구 찍어볼 겁니다. 오늘 사용할 기술입니다. Compose Screenshot Testing. https://developer.android.com/studio/preview/compose-screenshot-testing 자세한 사용법은 다루지 않겠습니다. libs.versions.toml에 다음과 같이 버전을 넣어줍니다. Plugin도 같이 넣어줍니다. screenshotVersion = "0.0.1-alpha07" android-screenshot = { id = "com.android.compose.screenshot", version.ref = "screenshotVersion" } gradle.properties에 다음을 적어줍니다. android.experimental.enableScreenshotTest=true 모듈용 build.gradle.kts에도 androi...

Android Compose Using a view in compose

이미지
사용 버전: Android Studio Koala 2024.1.1 사용 언어: Kotlin 2.0.10 안드로이드 컴포즈 Using a view in compose를 알아보겠습니다. Compose(컴포즈)에서 지원하지 않는 것은 View(뷰)를 사용해야 합니다. 이러한 예로는 AdMob(애드몹)이 있습니다. AdMob의 경우 XML로 되어 있어, Compose에서 바로 사용하지 못합니다. 이럴 때 사용하는 것이 AndroidView입니다. 저는 ViewBinding을 사용하기 때문에 다음 라이브러리를 사용합니다. androidx.compose.ui:ui-viewbinding 설명을 위해 version catalog는 사용하지 않습니다. 버전이 없는 이유는 Compose BOM을 사용하고 있기 때문입니다. Sync Now를 눌러줍니다. 사용법은 다음과 같습니다. Compose 안에 AndroidViewBinding()을 적어주고, Binding을 사용할 layout(레이아웃)과 inflate를 적어줍니다. 여기서는 AdUnifiedSmallRecyclerBinding::inflate가 사용되었습니다. 그러면, 자동으로 괄호 안에 Binding 된 값들이 들어갑니다. 이런 식으로 Binding으로 할 것들을 정해줍니다. Modifier도 적용할 수 있습니다. 실행해 봅시다. 이런 xml이 이렇게 표현됩니다. 끝. 카테고리; Android

Android Proguard R8 retrace an obfuscate debug

이미지
사용 버전: Android Studio Koala Feature Drop 2024.1.2 사용 언어: Kotlin 2.0.20 안드로이드 Proguard R8 retrace an obfuscate debug를 알아보겠습니다. Proguard(프로 가드)는 obfuscate(난독화)를 시켜주는 툴입니다. 그런데, 문제가 있습니다. 개발자 또한 디버그가 어렵다는 것이죠. 또잉? class(클래스) 'c'가 없다네요? 저는 'c'라는 class를 만든 적 없는데 말이죠? 이것이 바로 난독화입니다. 만약 프로그램을 분석하는 사람이 있다면 우리의 앱을 함부로 분석할 수 있겠죠? 이것을 어렵게 해주는 것입니다. 그럼, debug(디버그)는 어떻게 해야 할까요? Setting에 가셔서 Android SDK - SDK Tools - Android SDK Command-line Tools를 설치합니다. 그러면 본인의 SDK 위치에 설치됩니다. 제 경로는 아래와 같습니다. 위에 오류 난 logcat(로그캣)을 복사하여 저장합니다. Mapping.txt 파일도 찾아줍니다. 이 경로들을 잘 적어줍니다. 결과는 짜잔. 난독화가 해결되었는데, 일부분은 여전히 난독화가 되었네요. 이게 오픈소스 프로젝트라서 키 같은 것이 숨겨져있습니다. 그래서 리소스를 전부 가져다 쓰지 못해서 그런가 봅니다. 끝. 카테고리: Android

Android Migrate view to compose on instrumented test

이미지
사용 버전: Android Studio Koala 2024.1.1 사용 언어: Kotlin 2.0.10 안드로이드 Migrate view to compose instrumented test를 알아보겠습니다. 먼저 View를 Compose로 변경하는 것을 알아보았고, https://shwoghk14.blogspot.com/2024/08/android-migrate-xml-view-to-compose.html XML themes를 compose를 변경하는 것도 알아보았습니다. https://shwoghk14.blogspot.com/2024/08/android-migrate-xml-themes-to-compose.html 이제 대망의 Instrumented(계측) test를 view에서 compose로 변경하는 것을 알아보겠습니다. View(뷰)의 경우 ActivityScenarioRule을 사용하게 됩니다. 이것을 우리는 AndroidComposeTestRule로 변경해야 합니다. Test가 있는 Module(모듈)의 build.gradle.kts로 갑니다. 설명을 위해 version catalog는 일단 제외했습니다. androidTestImplementation(platform("androidx.compose:compose-bom:2024.08.00")) androidTestImplementation("androidx.compose.ui:ui-test-junit4") Sync Now를 누릅니다. TranslateFragmentTest.kt ActivityScenario를 createAndroidComposeRule로 변경해 줍니다. Test에는 일반 Compose에서 Test를 하듯이 composeTestRule을 사용해 주면 됩니다. 끝. 카테고리: Android