Android

Android

Android Material Library Update Story(feat. BottomNavigationView)

글 작성 배경이 글을 적게 된 배경은 뭘까? 나는 시간이 어느 정도 지난 개인 프로젝트를 오랜만에 다시 만지고 있었다. 이 때, Material 라이브러리 버전과 targetSdk 버전을 동시에 올리면서BottomNavigationView 배경 색상이 내가 사용하지 않는 기본 색상으로 적용이 되었다. 샘플 앱을 대충 만들면 나오는 그 보라색 말이다. 나는 Material 라이브러리의 Color system을 사용하고 있었는데도 이런 현상이 발생했다. 문제 지점 찾기분명 라이브러리에서 BottomNavigationView의 background color를 정의하는 부분이 있을 것이라 생각했다. 그럼 라이브러리에서 어떤 color를 사용할까? 바로 Material 공식 사이트에서 확인할 수 있었다. 스크린샷..

Android

Android Library Manifest Attributes Replace

필요해진 배경이번 기능은 왜 필요했을까? QR코드 스캐너 라이브러리를 사용하는데 알고보니 화면 방향이 가로 고정이었다. 하지만, 내가 필요로 하는 화면 방향은 세로 고정이었다. 해결 방법내가 사용했던 라이브러리를 예시로 보여주겠다. https://github.com/journeyapps/zxing-android-embedded GitHub - journeyapps/zxing-android-embedded: Barcode scanner library for Android, based on the ZXing decoderBarcode scanner library for Android, based on the ZXing decoder - journeyapps/zxing-android-embeddedgithub..

Android

Android Talkback Ordinal Number(ScreenReader 서수 읽기)

이번 기능은 상당히 어이없는 해결책을 가져왔다.(그런걸 왜 가져왔냐..?고 하면 할 말은 없다 ㅋㅋㅋ😂) 문제의 시작요구사항은 이렇다. RecyclerView 각 아이템에 포커스를 주면 해당 아이템이 총 몇 개 중 몇번 째인지 읽어주는 것이었다. 정말 간단한 기능이다. 나는 onBindViewHolder에서 setContentDescription을 통해 해당 문자열을 설정해주었다. 그런데 스크린리더가 읽는 텍스트는 약간 달랐다.예를 들면, 총 10개 중 일번 째라고 읽는 것이 아니겠는가? 이상한 점을 찾았을 지 모르겠다. 첫번째, 두번째, 세번째가 아닌 일번 째, 이번 째, 삼번 째와 같은 형식으로 읽어버리는 것이었다. 문제 발생 지점나는 나름 수동으로 문자열 리터럴을 만들어 설정해주었는데 여기서 정말..

Android

Android Room 오적용기(misapplied)

먼저 이번 글에서는 코드가 등장하지 않는다. 이번 오적용기가 나에겐 나름 Room을 제대로 사용해본 경험이라 작성해둔 코드가 아쉽기도 하다. 하지만, 언젠가는 갈아엎어야 될 코드가 되어버렸다. 왜 그렇게 됐을까? 현재 상황 파악의 중요성내가 연동해야할 백엔드는 어떤 상황인가?를 너무 간과했다. 대부분 앱 서비스는 회사에서 서버를 두고 앱이 해당 서버와 통신하게 된다. 그리고 해당 백엔드에서 가져온 데이터로 로컬 DB를 구성해 앱에서 사용한다. 하지만, 나의 경우는 각각 지역의 로컬 서버가 존재하고해당 서버에서 DB 파일을 다운로드받아 Room으로 사용하는 것이었다. 더욱 심화되는 문제와 해결 불가능한 상황까지각 로컬 서버는 모두 같은 Table 버전을 갖고 있을 것이라 생각했었다. 하지만 로컬 서버들은 ..

Android

Android AES-128 Encryption with Random IV in Java

사실 이 문제는 회사에 들어와 가장 먼저 고민했던 문제였다. 로그인 시, 아이디와 패스워드를 암호화해 전송해야 했기 때문이다. 전에 Google Play Console 여기저기를 누르다보니 SHA 방식의 암호화를 지나치듯 본 기억이 있었다. 짧은 AES 방식 소개하지만 SHA는 복호화할 수 없는 방식이기에 AES 방식을 사용하기로 했다. AES 암호화 방식은 key 값의 길이에 따라 바뀌는데 16바이트이면 AES-128, 32바이트이면 AES-256이 된다. 대신 IV(Initialization Vector)의 길이는 AES-128, AES-256 둘 모두 16바이트로 동일하다. Random IV를 적용해보기여기서 재밌는 기능을 하나 추가해보자. 바로 IV를 매번 random하게 생성하는 것이다. 그리고..

Android

Android Progressbar not spinning(not animated)

오늘은 저번 글에 이어 저사양 디바이스를 타겟팅해 앱을 개발하던 중 발견하게 된 증상을 공유해본다.(갤럭시와 같은 휴대폰 중 저사양 디바이스가 아닌 안드로이드 TV용 박스를 가지고 개발했다.) 나는 이 증상을 처음 보고 적잖이 당황했었다. 뭐랄까.. 지금까지 알던 세상이 부정당한 느낌..? 항상 되던 것이 안되니 말이다. 원인이런 끔찍한 현상이 생긴 원인이 뭘까? 바로 Animation 길이 배율 설정(Animator duration scale)이다. 평소에는 신경도 안 쓸 설정 메뉴이지만, 저사양 기기에서는 성능을 올리기 위해서인지 꺼져 있었다. 이거... 어디 있는 메뉴일까? 정답은 개발자 옵션에 있다. 기본 설정이 1x로 되어있는 디바이스가 대부분일텐데 내가 개발했던 녀석은 사용 안함이 기본이었다...

Android

Android White Screen Before Splash Screen Resolved

이번 글은 저사양 기기를 타겟팅하여 개발하던중 발견하게된 이슈이다.문제의 시작권한 처리를 위해 회사 로고가 중앙에 들어간 스플래시 화면을 추가했다.해당 앱은 기기 설정에 상관없이 다크 테마 색상이 적용된 것처럼 color resource가 설정되어 있었다.(스플래시 화면도 마찬가지이다.)그런데 앱을 시작하면 흰색 화면이 보이고 나서 스플래시 화면이 보였다.문제 해결가장 먼저 해결법을 찾게된 글은 아래 링크였다.https://github.com/crazycodeboy/react-native-splash-screen/issues/338 White screen before splash screen · Issue #338 · crazycodeboy/react-native-splash-screenAfter sev..

Android

Android APK Decompile(Proguard 적용 확인)

필요해진 배경“요즘 다 앱 번들(.aab)로 배포하고 테스터 초대하지 않나?”라고 생각할 수 있지만 나는 이번에 APK 형태로 업체에 설치파일로만 배포하는 상황이 생겼다.그래서 스플래시 화면에서 설치 비밀번호가 없으면 다음 화면으로 넘어가지 않도록 했고이와 더불어 멋대로 Decompile 되지 않도록 Proguard 난독화를 사용했다.물론 난독화 설정을 켜고 릴리즈 빌드를 하면 적용이 될 거라 생각했지만 혹시 모르니 확인하는 과정을 거쳤다.이제 시작해보자.가장 먼저 내가 참고한 블로그 링크를 첨부한다.https://chelsea-kbj.tistory.com/9 [Mac] 안드로이드 APK 파일 Decompile 하기저는 주로 쇼핑몰 앱 개발 및 운영을 하는 아이폰/안드로이드 앱 개발자입니다. 요즘 보안에..

Android

Android UDP 통신해보기 in Kotlin

이번 기능은 사실 이전에 생각조차 해보지 않은 기능이었다. 기존 HTTP, TCP 기반 통신에 익숙해져 있었기 때문이다. 그리고 내가 연동해야할 센서는 0으로 1바이트를 보내면 지속적으로 특정값을 형식에 맞게 보내주는 녀석이었다. 그럼 바로 코드를 공유해보도록 하겠다. private fun fetchUdpData() = CoroutineScope(Dispatchers.Default).launch { println("started fetch") val socket = DatagramSocket() val address = InetAddress.getByName(someIp.split(":")[0]) val packet = DatagramPacket( "0".toByteArray(), "0".toByteAr..

Android

Android ListAdapter submitList not refreshing

문제의 발단 최근 프로젝트에서 요즘 많이 쓰이는 ListAdapter(feat.DiffUtil)을 사용해보게 되었다. 나는 멤버변수로 MutableList를 가지고 있었고, 해당 리스트를 add, remove로 수정하고 submitList의 파라미터로 전달했다. 그런데 RecyclerView가 새로고침되지 않았다. 발생 원인 ListAdapter에게 submitList로 리스트를 전달하면 ListAdapter 내부의 AsyncListDiffer 멤버변수의 submitList를 호출한다. 해당 메소드는 멤버로 이전에 전달받은 list를 가지고 있고, 기존 멤버변수와 전달받은 파라미터의 list를 비교한다. 만약 두 리스트가 같다면 함수를 리턴한다. (여기서 같다는 의미는 메모리 주소가 같다는 것을 의미한다..

BonusTrack02.dev
'Android' 카테고리의 글 목록