일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- gitignore작성법
- RxJava 스터디
- Service 팁
- Intent String 변환
- android network
- Dagger2란
- so파일 동적로딩
- 오픈소스라이선스
- ArrayMap
- Service관리
- java callstack
- APK 동적로딩
- gitignore
- lufs
- BlockingQueue Capacity
- 네트워크 디버깅
- enum performance
- convert string to intent
- RxJava Programming
- mitmproxy
- print callstack
- Replaygain
- MediaDataSource
- 음량표준화
- callstack 출력
- HashMap vs ArrayMap
- android enum
- corePoolSize
- convert Intent to string
- APK로딩
- Today
- Total
목록개발 (21)
일상&개발 로그
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..
개발 하다보면 디버깅을 할 수 없을 때가 있습니다~ 그러면 only 로깅만으로 디버그를 해야 하는데 아주 골치가 아픔ㅠ 그럴 때 CallStack을 한눈에 볼 수 있어 아주 편리합니다. StackTraceElement[] stes = new Throwable().getStackTrace(); for( StackTraceElement ste : stes ) { Log.e(TAG, "STACKTRACE - className : " + ste.getClassName() + ", methodName : " + ste.getMethodName() + ", line : " + ste.getLineNumber()); }
처음에 프로젝트 만들고 git에 업데이트 할 때 .gitignore파일 만드는 것도 아주 번거로운 일이다.지인이 알려준 아래 링크에서 아주 간단하게 생성이 가능하다. https://www.gitignore.io/
arm-eabi는 어플리케이션이 설치될 때 결정된다.만약 설치될 타이밍에 so파일을 가지고 있지 않으면, 단말 OS의 bit를 따라간다.(64bit단말에 설치 시 64bit모드로, 32bit단말에 설치 시 32bit모드로 실행된다.)혹시 64bit단말에서 32bit so파일을 동적로딩 할 일이 생기면, 32bit 더미 so파일을 추가하여 어플리케이션이 32bit모드로 실행되도록 해야 한다.