일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- RxJava Programming
- java callstack
- Dagger2란
- 음량표준화
- Service 팁
- Replaygain
- Service관리
- 네트워크 디버깅
- gitignore작성법
- callstack 출력
- android network
- corePoolSize
- print callstack
- enum performance
- convert Intent to string
- BlockingQueue Capacity
- android enum
- APK로딩
- ArrayMap
- lufs
- so파일 동적로딩
- gitignore
- RxJava 스터디
- convert string to intent
- HashMap vs ArrayMap
- mitmproxy
- APK 동적로딩
- Intent String 변환
- 오픈소스라이선스
- MediaDataSource
- Today
- Total
목록개발/안드로이드 개발 (14)
일상&개발 로그
네트워크 디버깅(http/https)을 위해 솔루션을 찾아보다 mitmproxy를 찾았습니다. stetho 같은 라이브러리도 확인해봤는데, 소스를 삽입하고 interceptor를 끼워넣어야 해서 패스. 사용이 간편하고, proxy를 사용해서 따로 코드를 삽입하거나 로딩할 필요 없고, 라이브러리에서 쏘는 패킷도 확인 가능한 장점이 있습니다. Proxy에 사용할 PC(Proxy서버)와 같은 WiFi 망에 물려있어야 하며, 프로세스/스레드/앱 별로 분류가 안되는 단점이 있겠습니다. Mac환경에서 homebrew를 이용해서 간단히 설치가 가능합니다. 1. 설치 brew install mitmproxy 2. 단말 WiFi Proxy 설정- 프록시: 수동 - 프록시 호스트 이름: PC(Proxy서버) IP주소 - ..
미디어 음량 표준화 방법을 찾던 중 ReplayGain이라는 것을 발견 했습니다.실시간 서비스에서 단말자원으로 다시 encoding을 하는 것이 사실상 불가능하기 때문에 볼륨만 사용해서 음량을 조절하는 ReplayGain은 괜찮은 솔루션으로 생각됩니다. 적용 배경여러 미디어를 재생하는 상황에서 각 미디어의 음량이 다르기 때문에 사용자가 수시로 볼륨을 조절해야 하는 불편을 겪게 됨음량이 다른 원인: https://www.seeko.co.kr/zboard4/zboard.php?id=faq&no=7975용어 정의 LUFS(Loudness Unit relative to Full Scale) 인간이 소리를 듣는 행위에 대한 특성들을 수치화 하여 나타내는 단위로, 실제 사람이 '어느정도로 크게 느끼는가'를 표현하는..
Android에서 제공하는 기본 MediaPlayer는 Uri, FilePath, FileDescriptor만 dataSource로 지정 가능 했습니다.또 내부로직이 거의 native로 구현되어 reflection의 여지도 없었습니다.그래서 다운로드와 동시에 재생하는 버퍼링을 외부에서 구현할 수 없었습니다.(setDataSource를 이용하면 MediaPlayer내부에서 버퍼링하긴 합니다.)MarshMallow부터 제공되는 MediaDataSource를 이용하면 외부에서도 버퍼링처럼 동작하도록 구현이 가능합니다.프로그레시브 다운로드 정보 링크(주의: 제공되는 음원포맷이 프로그레시브 다운로드를 지원해야합니다.) @RequiresApi(api = Build.VERSION_CODES.M)public class..
# Enum 단점 1. dex크기가 커진다.- 동일한 기능 int를 썼을때 vs enum을 썼을 때 dex크기 차이 비교 기존 int 추가 enum 추가 dex사이즈 2556bytes 2680bytes 4188bytes int: 124bytes 추가enum: 1632bytes 추가 약 13배 가까이 차이남 dex크기가 앱 성능에 직접적인 영향을 미치지는 않는다. 그러나 앱 실행을 위해서는 Heap 메모리에 dex파일을 로딩해야 하는데 Heap메모리가 부족하게되면 System Memory에 압박이 가해지고, 메모리 공간을 확보하기위해 앱이 종료될 수도 있다. 단점 2. Runtime 오버헤드가 추가된다.뿐만 아니라, enum이 선언될 때마다 16 + 20bytes 정도 Runtime 메모리 오버헤드가 추가..
HashMap Key값의 hashCode를 index로 Array에 값을 저장함. 기본적으로 배열이 커야 충돌확률이 줄어들기때문에 큰 배열을 사용한다. 따라서 검색 속도는 O(1)로 매우 빠르다. (hash값이 겹칠 경우 chaining등의 방법을 이용한다.) ArrayMap 두 개의 배열을 이용한다. 1번 배열에는 HashCode를 순서대로 저장한다. 2번 배열에는 Key/Value를 순서대로 저장한다. 값을 가져올 때는 1번 배열을 HashCode로 이진탐색하여 2번 배열의 index를 구한다. 2번 배열의 index 다음 값을 가져온다.(hashIndex * 2, hashIndex * 2 + 1) 검색속도는 O(logN) 이다. 요약: HashMap은 속도는 빠르지만 메모리를 많이 먹는다. Arra..
1. 서비스는 UIThread에서 동작하기 때문에 서비스 작업때문에 프레임 누락이 발생할 수 있다. 2. 서비스를 되도록이면 쓰지마라. GCM이나 BroadcastReceiver를 이용해서 업데이트하던가 아니면 IntentService, HandlerThread, AsyncTaskLoader를 사용해라 3. Service에는 StartedService와 BoundService가 있다.# StartedService는 startService-stopService(or stopSelf)로 이루어졌으며 종료시키기 전까지 계속 살아남아 리소스를 잡아먹는다.# BoundService는 unbind되거나 종료시키기 전까지 리소스를 잡아먹는다.# 두 가지 서비스를 섞어쓰면, unbindService()를 호출해도 st..
안드로이드 개발 하다보면 각종 라이브러리들을 사용해야 할 경우가 발생합니다. 그러다 보면 각 라이브러리 내부에서 사용하는 라이브러리들을 파악하지 못해 충돌하는 경우가 빈번한데요. 내 프로젝트의 라이브러리라면 정리하기 쉽겠지만, 라이브러리가 사용하는 라이브러리까지 관리하기는 힘듭니다. 그럴 때 아래와 같은 방법을 이용하시면 편리합니다. 1. 라이브러리에서 특정 라이브러리를 제외하고 빌드 compile ('com.jakewharton:butterknife:8.5.1'){ exclude group:'com.android.support', module: 'support-compat' } 어떤 라이브러리가 충돌난 라이브러리를 사용하고 있는지 알고 있을 때 사용하면 좋습니다만, 파악하기가 쉽지 않습니다. 2. 전체..
APK 동적 로딩 방법을 찾아보았습니다. 오픈소스로 공개된 라이브러리를 사용했으며 소스 출처는 아래와 같습니다.DL: Dynamic Load Framework for Android - https://github.com/singwhatiwanna/dynamic-load-apkCode FlowDexClassLoader를 이용해서 APK의 클래스를 로드Reflection을 이용해서 AssetManager에 Path를 추가한 뒤 AssetManager에서 APK의 Resources를 가져옴DexClassLoader로 CalleeActivity를 인스턴스화 한 뒤 ProxyActivity의 생명주기에 맞춰 CalleeActivity의 메소드에 맵핑ProxyActivity와 CalleeActivity를 연결할 때 ..
# AsyncTask와 Thread-Handler 중 선택 시 참고하려고 포스팅 1. AsyncTask의 단점 Memory leak 발생 가능 AsyncTask를 execute한 Activity가 destroy되는 경우 메모리 릭 발생 발생하지 않게 하려면 cancel을 해줘야 함(cancel하지 않을 경우 onPostExecute, cancel할 경우 onCanceled를 탐) 디바이스의 화면회전 화면 회전 시 Activity를 destroy시키고 다시 생성하기 때문에 AsyncTask를 수행 후 화면 회전 시 destroy된 Activity의 UI변경을 시도, IllegalArgumentException발생 또한 이미 destroy된 Activity를 참조하기 때문에 메모리 릭이 발생할 수 있음 2...
안드로이드 Intent를 String으로 저장하는 방법 로직이 자주 변경되고, 대부분의 동작이 Intent로 이루어지는 앱의 경우 서버에서 String으로 변환된 Intent를 내려주는 방법이 유용하다. 물론 내려받은 IntentString은 Intent로 다시 변환이 가능하다. 방법은 아래와 같다. private void convertIntentAndString() { try { Intent intent = new Intent(); intent.setAction(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setPackage("co..