반응형

이전 프로젝트를 AndroidX로 변경하고 그에 따른 아티팩트들과 최신 안드로이드 스튜디오에 맞게 Gradle 등 빌드 환경을 조정해주고 빌드한 것 실행해보니 몇가지 런타임 오류가 발생하였습니다.

 

[오류 #1 ]

 java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/appcompat/R$drawable;

 

먼저 오류 해결하는데 시간이 제일 많이 걸린 androidx/appcompat/R$drawable 클래스를 찾지 못하는 문제는 결론적으로 Realm 쪽 문제였습니다.

AndroidX 적용시 이전 버전의 Realm에서 발생하는 문제

일반적으로 새로운 버전이 나오면 Lint에서 체크해서 하이라이트해서 보여주는데 Realm은 하이라이트가 되어 있지 않아서 이게 문제될 거라고는 생각하지 못했습니다.

 

나중에 문제 재확인차 이전 버전으로 돌리니 그제서야 아래처럼 하이라이트되어서 표시되네요.

build.gradle (project 레벨)에서 realm 플러그인을 7.0.0 버전으로 변경해주면 문제가 해결됩니다.

newer version lint check / realm

[오류 #2]

java.lang.NoSuchMethodError: No static method metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; in class Ljava/lang/invoke/LambdaMetafactory; or its super classes (declaration of java.lang.invoke.LambdaMetafactory' appears in /apex/com.android.art/javalib/core-oj.jar)

 

이번에는 메서드를 찾지 못해서 발생한 문제였는데, 오류 메시지에 Lambda 가 보이는 걸로 봐서 JAVA 1.8 지원하지 안하서 발생한 것으로 판단이 되었습니다.

이 런타임오류는 아래 compileOPtions를 build.gradle (app 레벨)에 추가해주면 해결됩니다.

주의할 점

오류 수정한 코드에 해당하는 build.gradle 파일에서 Sync now(또는 File-Sync Project with Gradle Files)를 해준 후에 Build-Clean Project 후 빌드하시면 됩니다. (정리하면 Sync - Clean - Build)

 

이상입니다. 도움이 되셨기를...

반응형

얼마 전 삼성개발자사이트에 들어가서 둘러보다가 아래와 같이 삼성 카메라 SDK 지원 중단이 된다는 공지를 보았습니다.

 

As of Dec. 1, 2019, the Camera SDK(v1.0.0 - v1.3.2) is deprecated on all devices. We reget any inconvenience.

그 아래에 몇 개월 전 배포된 SDK 버전이 처량하게 보입니다.

 

 

외부 개발자들을 참여시켜서 기존 Android 카메라 API에서 지원하지 않는 삼성 폰의 카메라 확장기능을 지원하고자 시작한 것 같은데 아쉽다는 생각이 들었습니다.

 

SDK가 별거 아니라고 생각하는 분도 계실 수 있지만, SDK 개발하고 검증하고 배포한 이후 유지 보수하는 데는 많은 시간이 걸립니다.

 

왜 지원을 중단했는지 나름대로 생각을 해보니 구글에서 발표한 CameraX와 연관이 있는 것 같습니다.

 

관련한 근거로 SDC(삼성 개발자 컨퍼런스)에 발표된 아래 영상이 19.11월 초에 올라왔습니다.

 

제목이 Introducing the CameraX with Samsung인데, 구글의 안드로이드 카메라 프레임워크쪽 PM이 등장합니다.

 

CameraX 기능도 삼성 카메라 SDK와 중복되는 것이 많습니다.

 

향후 2개가 동시에 존재하는 것이 불가능한 것이 "카메라 확장 기능"을 위해서 삼성 카메라 SDK보다 여러 단말 벤더들도 지원할 수 있는 CameraX를 개발자들이 선호하게 될 것이기에 어쩔 수 없는 선택이었다고 생각됩니다.

 

삼성 입장에서는 아쉬울 수도 있지만, 뻔한 결과가 보이는 것을 계속 붙잡고 있을 수는 없는 거니깐요.

 

구글 입장에서 삼성은 아주 고마운 존재일 것 입니다.

 

새로운 기술이나 하드웨어에 대해서 삼성이 앞장서서 나가주고 검증을 해주니깐요.

 

일례로 지금은 당연히 카메라가 2개 이상 지원하지만 전에는 안드로이드 초기에는 Camera API에서 1개의 카메라만 지원했습니다.

 

(제가 기억하기로는) 삼성이 먼저 피처폰에서처럼 전면 카메라를 넣어주었죠. 이후 구글은 Camera API에 다수 카메라 지원하도록 적용하였고요.

 

작년 갤럭시 폴드 개발 시에는 폴더블 API 지원이 되도록 구글에서 많은 공조가 있었을 것입니다.

 

이번 글은 여기까지입니다. 읽어주셔서 감사합니다. 

 

반응형

Camera API를 어떻게 사용하는지 궁금할 때 참조할 수 있는 좋은 방법을 알려 드리겠습니다.

 

안드로이드 단말이 GMS를 탑재하고 구글의 승인을 받으려면 구글의 요구하는 조건을 만족시켜줘야 합니다.

 

기본적으로 CDD부터 프레임워크 호환성 확인을 위한 CTS 등 여러 테스트를 거치게 됩니다.

 

이중 CTS는 안드로이드 플랫폼에서 프레임워크 동작의 신뢰성을 위한 각종 API를 테스트합니다.

 

이 테스트 코드는 구글에서 작성하였고 소스가 오픈되어 있습니다.

 

예를 들어보겠습니다.

 

Camera API 중에서 setFocusMode를 어떻게 사용하는지 궁금하면 구글 검색으로 stackoverflow.com에 참고할 수 있는 대부분의 답변이 나옵니다.

 

아래의 경우는 setFocusMode가 동작하지 않는다는 문의와 답변입니다.

(관련 링크: https://stackoverflow.com/questions/11623266/camera-parameters-setfocusmode-is-not-working)

  

 

 

 

 

간결하고 문제 해결을 위한 무난한 답변입니다.

 

위의 문제는 지원하지 않는 Camera Focus mode를 사용하려고 해서 발생하는 문제였습니다.

 

답변에서는 지원 여부를 체크(getSupportedFocusModes)해서 지원하면 설정(setFocusMode)하게 처리되어 있습니다.

 

그럼, CTS 쪽에서는 어떻게 사용하고 있는지 볼까요?

 

여기에서도 체크(getSupportedFocusModes)후 지원하면 설정(setFocusMode)하게 처리되어 있습니다.

 

 

stackoverflow나 cts 모두 setFocusMode 사용하는 방법에 대해서 가리키는 것은 argument인 focus mode가 지원하는지 getSupportedFocusModes로 체크해서 지원하면 사용하도록 처리해야 한다는 것을 알 수 있습니다.

 

CTS 쪽 검색은 구글에서 아래와 같이 해주면 됩니다. (검색창에 "API명 site:android.googlesource.com/platform/cts")

 

 

CTS에 있는 모든 코드가 무결하다고 할 수는 없지만, 아무래도 구글에서 작성한 코드이기에 일정 수준이 상의 신뢰성이 보장된다고 볼 수 있습니다. stackoverflow.com에 나와 있지 않거나 거기 있는 코드가 신뢰 되지 않는다면 CTS에서 코드를 찾아보실 것을 권장해 드립니다.

 

이번 글은 여기까지입니다. 도움이 되셨기를 바랍니다.

반응형

기본적으로 uses-permission과 사용하는 의미가 동일합니다. 즉, 앱에서 이러한 권한을 사용한다고 알려주는 것입니다.

 

먼저 AndroidManifest.xml 에서 아래 형식을 가지고 있습니다.

<uses-permission-sdk-23 android:name="string"
       
android:maxSdkVersion="integer" />

 

이전에는 uses-permission-sdk-m을 사용했지만, 현재 Deprecated 되어서 uses-permission-sdk-23을 사용합니다.

 

그냥 uses-permission을 사용하면 되는데 왜 uses-permission-sdk-23이 필요할까요?

 

그리고, uses-permission-sdk-22나 uses-permission-sdk-24는 왜 존재하지 않고 23만 존재할까요?

 

uses-permission-sdk-23은 API version 23 (Android 6.0) 이상이 설치된 디바이스에서 권한을 사용한다는 의미입니다.

 

이는 API version 23인 Android 6.0에서 새롭게 추가된 Runtime permission 때문입니다.

 

앱이 필요한 권한의 수준이 위험(Dangerous)인 경우 보안을 위해서 실행중 필요시 사용자에 권한 허용여부를 결정하도록 하는 기능입니다. 자세한 내용은 아래글 참조하세요.

2019/02/07 - 안드로이드 런타임 권한 확인 및 요청 처리하기 (Android Runtime permission check and request)

 

위험 권한을 사용한 새로운 기능을 추가했습니다. 그런데, 그 기능이 [Android 6.0 이상에만 유효하거나] 앱을 동작하는데 [필수적인 기능이 아니다]라고 한다면, Runtime permission을 지원하는 Android 6.0 이상에는 해당 기능 사용을 실행중 발생하는 권한 요청시 사용자가 결정할 수 있습니다. 

 

반면, 설치시 권한 승인을 해야 하는 Android 6.0 미만 디바이스에는 사용하지 않는데 권한 승인을 해줘야 하거나 필수적인 기능이 아님에도 강제로 추가됩니다.

 

이런 문제를 해결하기 위해서 [use-permission-sdk-23]을 사용하게 되면 Android 6.0 이상 디바이스에만 권한을 추가하며 그 미만 디바이스에서는 권한이 추가되지 않기에 설치시 권한 승인 및 강제로 기능이 추가되지 않습니다.

 

주로 Android 6.0 미만 디바이스까지 지원하는 앱에서 신규 기능을 추가하면서 겪게 될 수 있는 부분입니다.

 

참고로 maxSdkVersion의 경우 향후 최신 API 버전을 가진 디바이스에서 권한이 없어서 되는 경우에 그 직전 API 버전을 적어주면 됩니다.

 

여기까지 입니다. 도움이 되셨기를...

반응형

갑자기 안드로이드 스튜디오에서 소스의 텍스트가 깨져 보이는 현상이 나타났습니다.

 

 

이전에도 이런 현상이 있어서 가까스로 해결한 적이 있었는데 따로 북마크를 해두지 않아서 다시 검색해서 겨우 찾았습니다.

 

다음에도 똑같은 현상이 나올 수 있을 것 같아서 여기에 기록을 남깁니다.

 

일단 "구글 이슈 트래커"에 해당 현상에 대한 오류 보고( https://issuetracker.google.com/issues/119638289  ← 구글계정 로그인 필요)가 되어 있습니다.

 

아직 해당 현상에 대한 안드로이드 스튜디오의 정식 패치는 나오지 않았고, Workaround 만 올라와 있습니다.

 

정식 패치가 나오기까지 임시로 해결은 가능하니 참조하시길 바랍니다.

 

첫 번째 방법 (https://stackoverflow.com/a/54509482)

- 열려있는 안드로이드 스튜디오 닫기

- c:\사용자\"사용자 계정명"\system\caches\ 로 이동

- caches 폴더 안에 있는 모든 폴더 및 파일들 삭제

- 안드로이드 스튜디오 재실행

 

두 번째 방법 (https://stackoverflow.com/a/53262101)

- 열려있는 안드로이드 스튜디오 닫기

- c:\사용자\"사용자 계정명"\ 으로 이동

- ".AndroidStudio3.x" 폴더의 이름을 ".AndroidStudio3.xBackup" 이름으로 변경

- 안드로이드 스튜디오 실행

- 이전의 설정값을 유지하려면 .AndroidStudio3.xBackup 폴더로 되어 있는 곳에서 가져오도록 하고 아니면 "Do not import settings" 선택

 

보통은 첫 번째 방법으로 캐시를 초기화해줌으로써 해결되지만, 혹시 이 방법으로 해결되지 않으면 두 번째 방법으로 하면 좀 더 넓은 의미의 초기화로 웬만하면 다 해결이 됩니다. 

 

도움이 되셨길 바랍니다.

반응형

이전에 빌드가 잘 되던 프로젝트 소스에서 갑자기 제목과 같은 오류가 발생해서 주말에 몇 시간을 날렸습니다.

 

근데 원인을 찾고 보니 좀 허탈하였습니다. 요건 나중에 말씀드리고요.

 

먼저 해당 소스는 몇 달 전에 작업하다가 둔 것으로 당시에 빌드가 잘 되었습니다.

 

주말에 그 소스를 가지고 테스트할 일이 있어서 코드 변경 후 빌드했는데 갑자기 오류가 발생한 것입니다.

 

아래처럼 app:mergeDebugResources 빌드 중에 Android resource compilation failed 오류 메시지가 나오면서 빌드가 멈추었습니다.

 

 

일단 리소스쪽은 건드린 것이 없어서 이상하다고 생각하고 있었습니다.

 

코드 외에 그동안 패치된 라이브러리 아티팩트 버전을 업데이트해서 빌드한 것이지만 버전을 롤백해도 현상은 동일했습니다.

 

스택오버플로우에서 제시한 여러 방법을 적용해봐도 해결이 되지 않았습니다.

최후의 방법으로는 안드로이드 스튜디오 등 빌드환경 재설치를 염두에 두고 해결책에 대해서 계속 찾아보았습니다.

- Build 폴더 삭제 후 빌드

- 파일 메뉴의 Invalidate Cashes / Restart 실행

- SDK 버전 변경

- Build Tools 버전 변경

 

소스의 문제가 아니다?

 

이쯤 되니 소스의 문제는 아닌 것 같다는 생각이 들어서 Empty Activity로 새 프로젝트를 만들고 바로 빌드를 했는데 역시나 오류가 발생했습니다.

 

그런데, 갑자기 아래와 같은 팝업이 동시에 발생하였습니다.

 

 

 

지난 주중에 랜섬웨어 대비해서 Bitdefender 설정 변경한 것이 있었는데 이것때문에 aapt2쪽에 동작이 멈춘것 같다는 느낌이 들었습니다. 생각해보니 app:mergeDebugResources 빌드때 오류 메시지를 발생시킨 것도 Aapt2Exception이었습니다. 

 

aapt2가 보안 프로그램에 의해서 차단되었다?

 

랜섬웨어 설정 관련한 옵션에 들어가서 보니 역시나 aapt2의 접근이 차단되어 있었습니다.

  

 

위의 위젯 스위치를 On 해주고 다시 빌드를 해주니 오류없이 빌드가 되었습니다.

 

빌드 오류 해결 :)

 

제가 사용중인 Bitdefender Total Security는 랜섬웨어에 대한 보호하는 기능이 있는데 시스템이 느려질까봐 초기에는 이 기능을 사용하지 않았습니다. 최근에 랜섬웨어 대비하고자 자료 정리하면서 백업도 하고 중요한 폴더들에 대해서는 이 기능도 활성화한 건데 이걸로 인하여 빌드 오류가 발생하였습니다.

 

최초 빌드오류 이슈가 된 프로젝트 소스에는 왜 Bitdefender 팝업 발생하지 않았는지 모르겠지만, 저처럼 혹시 원인을 알 수 없는 Android resource compilation failed 오류 메시지가 발생하였다면 보안 프로그램에 의해 aapt2가 차단된 건 아닌지 점검해보세요.

+ Recent posts