새소식

Android/[Android] Annotations

[Android Annotation] @Keep

  • -

@Keep 

@Keep 어노테이션은 Android 애플리케이션에서 ProGuard나 R8 같은 코드 난독화 도구를 사용할 때 특정 클래스, 메서드, 필드 등을 난독화하지 않도록 지시하는 어노테이션입니다.

 

언제 사용하면 될까?

  1. reflection를 사용하는 경우: 리플렉션을 통해 접근해야 하는 클래스나 메서드, 필드는 난독화되면 안됩니다. ProGuard나 R8이 난독화할 경우, 리플렉션 코드가 올바르게 동작하지 않을 수 있습니다.
  2. 네이티브 코드와의 상호작용: JNI(Java Native Interface)를 통해 네이티브 코드와 상호작용하는 경우, 해당 네이티브 코드에서 참조하는 Java 메서드나 클래스는 난독화되면 안됩니다.
  3. 외부 라이브러리와의 상호작용: 외부 라이브러리에서 특정 클래스나 메서드를 직접 호출하는 경우, 이들도 난독화되면 안됩니다.
  4. 특정 API를 외부에 노출해야 하는 경우: 특정 API를 외부 애플리케이션이나 모듈에서 사용해야 하는 경우, 해당 API는 난독화되지 않아야 합니다.

 


[참고]

1. 난독화 (obfuscation)

난독화(obfuscation)는 소스 코드를 읽기 어렵게 만드는 과정을 의미합니다. 
주로 코드의 가독성을 떨어뜨려서 코드의 기능을 이해하기 어렵게 만들기 위해 사용됩니다.

  • 보안: 코드 난독화는 소스 코드를 해킹하거나 리버스 엔지니어링하는 것을 어렵게 만듭니다. 이를 통해 애플리케이션의 보안을 강화할 수 있습니다.
  • 파일 크기 축소: 난독화는 클래스, 메서드, 필드의 이름을 짧게 변경하여 APK 파일 크기를 줄이는 데 도움을 줄 수 있습니다.

Android 개발에서 난독화는 ProGuard나 R8 같은 도구를 사용합니다.

  • ProGuard: Android 앱에 기본적으로 포함된 난독화 도구로, 클래스, 메서드, 필드의 이름을 변경하고 최적화하여 APK 파일 크기를 줄입니다.
  • R8: ProGuard의 대체 도구로, 더 빠르고 효율적인 난독화 및 최적화를 제공합니다. Android Gradle Plugin 3.4.0 이상에서는 기본적으로 R8이 사용됩니다.

 

2. JNI(Java Native Interface)

JNI(Java Native Interface)는 Java와 네이티브 코드(C, C++ 등으로 작성된 코드) 간의 상호작용을 가능하게 하는 인터페이스입니다. 이를 통해 Java 애플리케이션에서 네이티브 라이브러리를 호출하거나 네이티브 코드에서 Java 메서드를 호출할 수 있습니다. Android 앱에서도 JNI를 사용하여 성능이 중요한 부분이나 기존의 네이티브 라이브러리를 활용할 수 있습니다.

 

ex) Android에서 openCV를 사용하는 경우

 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.