반응형

Breaking Free from Musical Conventions

Source: Daft Punk, Giorgio by Moroder, 2013. Album: Random Access Memories.

 

Once you free your mind about a concept of harmony and music being correct,

화음과 올바른 음악에 대한 개념에 얽매이지 않는다면,

You can do whatever you want.

무엇이든 할 수 있어.

So, nobody told me what to do,

그래서 아무도 나에게 강요하지 않았고,

And there was no preconception of what to do.

해야 할 것에 대한 편견도 없었지.

 

반응형

'생각의 조각들' 카테고리의 다른 글

미래의 한국  (0) 2024.10.30
인공지능의 학습 한계  (0) 2024.10.10
게으른 야망의 딜레마  (0) 2024.10.06
성공과 실패  (0) 2024.10.02
말이 통하지 않는 사람과 싸우지 말라.  (0) 2023.12.27
블로그 이미지

SKY STORY

,
반응형

게으른 야망의 딜레마

by netcanis

 

"세상에서 가장 불행한 사람은 게으른 야망가이다."

 

반응형
블로그 이미지

SKY STORY

,
반응형

앱스토어 배포를 위해 리뷰 전 'Validate App' 하면 아래 그림과 같이 NDEF 에러가 발생하는 경우가 있다. 이 해결방법을 알아보도록 하겠다.

 

1. Info.plist에 NFC관련 권한이 설정되어있는지 확인하자. 

<key>NFCReaderUsageDescription</key>
<string>This app would like to use NFC for some reason.</string>

 

2. 해당  앱의 App ID 설정에 'NFC Tage Reading'이 체크되어있는지 확인한다.

 

3. .entitlements 파일에 TAG설정이 되어있는지 확인하고 NDEF 부분은 제거한다.

<?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  <plist version="1.0">
  <dict>
      <key>com.apple.developer.nfc.readersession.formats</key>
      <array>
          <string>TAG</string>
          <!-- 'NDEF는 제거하도록 한다. (대부분 이부분 때문에 에러 발생됨)
          <string>NDEF</string>
          -->
      </array>
  </dict>
  </plist>

 

4. Clean & ReBuild

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
블로그 이미지

SKY STORY

,
반응형

안드로이드에서 targetSdkVersion 34로 설정할 때는 몇 가지 주요 변경 사항과 주의 사항이 있습니다. 주요 사항은 다음과 같다.

 

1. 권한 처리 강화

  • 미디어 파일 권한: Android 14에서는 사진, 동영상, 오디오 파일에 대한 권한 요청이 분리되었습니다. READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, READ_MEDIA_AUDIO와 같은 구체적인 권한을 사용해야 합니다.
  • 알림 권한: Android 13(API 33)부터 알림 사용을 위한 권한(POST_NOTIFICATIONS)이 필수적입니다. 사용자가 명시적으로 알림을 허용해야 앱이 알림을 보낼 수 있습니다.
    • 예시:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    requestPermissions(arrayOf(Manifest.permission.POST_NOTIFICATIONS), 100)
}

 

2. 백그라운드 작업 제한 강화

  • 정책 변경: Android 14는 백그라운드 작업에 대한 제약을 더 강화했습니다. 배터리 소모를 줄이기 위해 백그라운드에서 실행되는 작업에 대한 제한이 있으며, 특히 앱이 백그라운드에서 실행 중일 때 작업 스케줄링이 더 어려워졌습니다. 이를 해결하기 위해 JobScheduler 또는 WorkManager를 사용하는 것이 권장됩니다.

 

3. 기본 보안 정책 강화

  • SAF(Storage Access Framework) 적용 강화: 외부 저장소 접근이 더 제한적이며, 앱이 명시적으로 저장소 접근을 요청하지 않으면 사용자가 이를 거부할 수 있습니다. Scoped Storage 적용을 준비해야 하며, 파일 관리는 앱 전용 저장소나 사용자 상호작용을 통해서만 접근해야 합니다.

 

4. 암호화 및 보안

  • 암호화된 네트워크 통신: 명시적 암호화가 더 중요해졌습니다. Android 14는 더 엄격한 네트워크 보안 구성을 요구하며, 특히 비암호화된 HTTP 요청을 차단하거나 이를 명시적으로 허용하지 않으면 기본적으로 차단됩니다. 앱의 network_security_config.xml에서 설정을 확인하고 HTTPS를 권장합니다.

 

5. 개발자 옵션 사용 제한

  • Android 14에서는 디버그 앱이 아닌 경우, 앱 설치 후 개발자 옵션을 통해 설정된 일부 기능이 자동으로 차단될 수 있습니다. 따라서 개발자 전용 빌드 배포 빌드에서 설정 차이를 명확히 하고, 배포 빌드에서는 사용자 경험에 영향을 주지 않도록 주의해야 합니다.

 

6. 백그라운드 위치 접근 제한

  • 위치 서비스 관련 변경 사항으로, 백그라운드에서 위치 정보를 사용하는 경우에 대해 더 엄격한 권한 요구가 추가되었습니다. Android 10(API 29)부터 백그라운드 위치 권한(ACCESS_BACKGROUND_LOCATION)이 따로 분리되었으며, 이를 명시적으로 요청해야 합니다. 이제 위치 권한을 필요로 하는 경우, Foreground 권한 Background 권한을 각각 별도로 요청해야 합니다.

 

7. 동적 코드 로딩 제한

  • Android 14에서는 동적 코드 로딩(dynamic code loading)과 관련된 보안 정책이 더 엄격해졌습니다. APK 내에서 동적으로 코드를 로드하는 방식(예: 외부에서 다운받은 Dex 파일 로딩)을 사용한다면, 보안상의 이유로 Google Play 정책 위반이 될 수 있으므로 주의해야 합니다.

 

8. Non-SDK 인터페이스 사용 제한

  • Android 14에서는 Non-SDK 인터페이스(비공개 API) 사용을 제한하는 정책이 강화되었습니다. 이제 비공개 API에 접근하는 것은 더욱 어렵고, 이에 대한 경고나 오류가 발생할 수 있으므로, 공식 SDK를 사용하는지 점검해야 합니다.

 

 

반응형
블로그 이미지

SKY STORY

,
반응형

Gradle 8.0 이상에서는 이전 버전과 비교해 여러 사항들이 변경되었으며, 특히 안드로이드 빌드 설정에 직접적인 영향을 미치는 요소들이 많다. 몇 가지 주요 변경 사항은 다음과 같다.

 

1. namespace 선언 필수

  • 변경 사항: Gradle 8.0과 Android Gradle Plugin(AGP) 7.3.0 이상에서는 AndroidManifest.xml에서 패키지 이름을 설정하는 대신 build.gradle 파일에서 namespace 속성을 명시적으로 선언해야 합니다.
  • 이유: 이 변경 사항은 Android Gradle Plugin의 개선된 네임스페이스 지원에 따른 것으로, 더 나은 빌드 속도와 코드 분리 지원을 위해 도입되었습니다.
  • 예시:
android {
    namespace 'com.sample.test'
}

 

2. targetSdkVersion이 없어짐

  • 변경 사항: targetSdkVersion은 더 이상 Gradle 파일에서 필수적으로 선언되지 않으며, Google Play가 자동으로 최신 버전으로 간주합니다. 하지만 여전히 하위 호환성을 유지하고 싶다면 명시적으로 설정하는 것이 좋습니다.
  • 이유: 이는 구글이 최신 플랫폼 기능을 활용하도록 유도하기 위한 변화이며, 최신 SDK 버전에 대한 자동 지원을 강화합니다.
  • 예시:
android {
    compileSdkVersion 34
    defaultConfig {
        minSdkVersion 21
        // targetSdkVersion 없어짐
    }
}

 

3. 종속성 관리 변화

  • 변경 사항: Gradle 8.0에서는 jcenter() 지원이 완전히 중단되었습니다. 따라서 mavenCentral() 또는 google()로 대체해야 합니다.
  • 이유: JFrog에서 JCenter 저장소를 더 이상 업데이트하지 않기 때문에 더 이상 사용할 수 없습니다​.
  • 예시:
repositories {
    google()
    mavenCentral()
}

 

4. Java Toolchain 강화

  • 변경 사항: Gradle 8.0에서는 Java toolchain을 보다 엄격하게 관리하며, 잘못된 toolchain 설정이 더 이상 허용되지 않습니다. 또한 자동으로 toolchain을 다운로드할 때 명시적으로 저장소(Repository)를 설정하지 않으면 오류가 발생합니다.
  • 이유: 이는 빌드 환경에서 더 나은 일관성과 신뢰성을 제공하기 위해 도입되었습니다​.
  • 예시:
java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(11)
    }
}

 

5. 테스트 프레임워크 설정 변경

  • 변경 사항: 테스트 태스크에서 테스트 프레임워크를 설정한 후 추가적인 옵션을 변경하는 것이 더 이상 허용되지 않습니다. 테스트 프레임워크는 먼저 설정한 후 옵션을 설정해야 합니다.
  • 이유: 테스트 프레임워크 설정 후 옵션을 변경하는 것이 이전에는 설정을 덮어쓰는 문제가 있었기 때문에 이러한 변경이 적용되었습니다​.
  • 예시:
test {
    useJUnitPlatform {
        includeTags("unit")
    }
    options {
        // 테스트 옵션
    }
}

 

반응형
블로그 이미지

SKY STORY

,
반응형

성공과 실패

by netcanis

 

"성공 또는 실패의 반대말은 아무것도 하지 않는 것이다."

 

반응형
블로그 이미지

SKY STORY

,
반응형

AAR파일을 프로젝트에 추가 및 설정하는 방법에 대해 알아보도록 하겠습니다.

 

AAR 파일을 프로젝트에 추가

aar파일을 프로젝트의 libs 폴더에 복사합니다. 만약 폴더가 없다면 생성합니다.

your_project/
├── app/
│   ├── build.gradle.kts
│   ├── libs/
│   │   ├── MyTest-debug.aar
│   │   └── MyTest-release.aar
│   ├── src/
│   └── ...
├── build.gradle.kts
└── settings.gradle.kts

'

 

'settings.gradle.kts' 파일 수정

'settings.gradle.kts' 파일에서 'flatDir' repositories를 추가합니다:

pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        // 'libs' 폴더 설정  
        flatDir {
            dirs("libs")
        }
    }
}

rootProject.name = "your_project"
include(":app")

 

'build.gradle.kts' (Moduel :app) 파일 수정

... 생략 ...

dependencies {
    ... 생략 ...

    // AAR 파일 의존성 추가
    implementation(":MyTest-debug")
    releaseImplementation(":MyTest-release")
}

 

 

반응형
블로그 이미지

SKY STORY

,
반응형

개발중인 어플리케이션 프로젝트(.apk)를 라이브러리 모듈(.aar)로 변경해야 할 경우 설정방법을 알아보도록 하자.

프로젝트 이름은 'mytest'일 경우 다음과 같은 순서로 설정을 변경하도록 하자.

 

불필요한 소스 파일 제거

라이브러리 파일에 필요한 소스코드를 제외하고 나머지  파일들은 모두 제거하도록 한다.

 

AndroidManifest.xml 수정

application 요소와 앱 관련 설정을 제거하고, 라이브러리에서 필요한 설정만 남겨둡니다.

예를 들어, 권한이나 기본 설정 등을 유지할 수 있습니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.mytest">

    <!-- 필요한 권한 및 기타 설정을 여기에 추가 -->
    <!-- 예: INTERNET 권한 -->
    <uses-permission android:name="android.permission.INTERNET" />

    <!-- 필요하다면 다른 권한도 추가 가능 -->
    
    <!-- 라이브러리에서 제공하는 특정 기능을 위한 설정 -->
    <!-- 예: 서비스나 리시버 등 -->
    <!--
    <application>
        <service android:name=".MyService" />
        <receiver android:name=".MyReceiver">
            <intent-filter>
                <action android:name="com.example.mytest.SOME_ACTION" />
            </intent-filter>
        </receiver>
    </application>
    -->
</manifest>

 

'build.gradle.kts' (Project: MyTest)

// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
    alias(libs.plugins.android.application) apply false

    // 라이브러리 플러그인 추가
    alias(libs.plugins.android.library) apply false

    alias(libs.plugins.jetbrains.kotlin.android) apply false
}

 

'build.gradle.kts' (Module: MyTest)

plugins {
    // 어플리케이션 플러그인 제거
    //alias(libs.plugins.android.application)

	// 라이브러리 플러그인 추가
    alias(libs.plugins.android.library)

    alias(libs.plugins.jetbrains.kotlin.android)
}

android {
    namespace = "com.sample.mytest"
    compileSdk = 34

    defaultConfig {
        // applicationId 제거
        //applicationId = "com.sample.mytest"

        minSdk = 28

        // 버전정보 제거
        //versionCode = 1
        //versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }
	
	... 생략 ...

    lint {
        targetSdk = 34
    }
	
	... 생략 ...
    
}

dependencies {
	... 생략 ...
}

 

'settings.gradle.kts' (Project Settings)

... 생략 ...

rootProject.name = "MyTest"	// 프로젝트 루트 이름
include(":MyTest")			// 모듈이름 정의

... 생략 ...

 

'libs.versions.toml' (Version Catalog)

[versions]
agp = "8.4.1"
kotlin = "1.9.0"
coreKtx = "1.13.1"
... 생략 ...

[libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
junit = { group = "junit", name = "junit", version.ref = "junit" }
androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
... 생략 ...

[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
# 라이브러리 플러그인 버전정보 추가
android-library = { id = "com.android.library", version.ref = "agp" }
jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }

 

라이브러리 빌드 및 테스트

콘솔창에서 아래와 같이 아리브러리 빌드를 한다. 

./gradlew assembleRelease

 

 

반응형

'개발 > Android' 카테고리의 다른 글

Gradle 8.0 이상 주요 변경사항  (1) 2024.10.04
AAR 라이브러리 사용  (0) 2024.06.05
OpenCV 설정  (0) 2024.05.30
aab파일 apk파일로 변환  (0) 2020.08.21
안드로이드 원격 디버깅 방법  (0) 2020.07.19
블로그 이미지

SKY STORY

,