일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- RxJava2
- deprecating the install_referrer
- java
- rxandroid
- Android
- 하드코드검색
- Rx자바
- andorid studio
- RX
- Switch to the Play Referrer API by March 1
- android P
- 안드로이드
- hardcoded string search
- Retrofit2
- RXjava
- Today
- Total
목록안드로이드 (39)
Lucky Dog
Switch to the Play Referrer API by March 1, 2020 기존에 사용하던 Referrer(INSTALL_REFERRER) 를 새로운 API 로 마이그레이션 하라는 것. 해당 기능 동작 안해도 앱 사용에는 지장이 없다. 그래도 가능하면 처리하도록 하자. 내 앱에서는 그런 기능 사용한 적 없는데? =>직접 정의하지 않아도 마케팅 SDK 나 Fireabse 등에 해당 기능이 포함되어 있을 수 있다. Referrer(INSTALL_REFERRER) 가 무엇인가? 간단하게 얘기하면 유입 경로를 분석/처리 하기 위한 기능으로, 직접 정의해서 사용하거나 마케팅 sdk, Firebase 등 에 해당 기능이 포함되어 있다. 예를들어 Firebase를 사용할 경우 앱 패키징(apk)을 디컴파..
Android 10 사용을 위해 androidx 로 마이그레이션 할 때, 보통 안드로이드 스튜디오 'Refactor' -> 'Migrate AndroidX..' 메뉴를 이용하게 된다. 문제는 build.gradle 의 implementation 은 AndroidX로 변경해주지만 XML 에 정의된 레이아웃들은 변경해주지 못할 때가 있다. 예를 들면 CoordinatorLayout 의 경우 위와 같이 사용하다가 AndroidX 로 전환하면 아래와 같이 자동 변경될 것으로 기대하지만 변경되지 않는다; 이러면 컴파일에러가 아니라 런타임 에러가 발생하기 때문에 제대로 테스트가 안되면 꽤나 문제가 된다. 안드로이드 스튜디오 자동 마이그레이션 툴을 너무 믿지 말고 마이그레이션 후 전체 검..
Retrofit2 Multiple base url Retrofit 에서 여러 개의 base url을 사용해야 하는 경우 아래와 같이 처리한다. RetrofitManager public class RetrofitManager { private static final String TAG = RetrofitManager.class.getSimpleName(); private static HttpLoggingInterceptor logging = new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY); private static class LazyHolder { static final RetrofitManager INSTANCE = ne..
DataBinding (데이터바인딩) 데이터 바인딩 라이브러리를 사용하여 선언적 레이아웃을 작성하고 애플리케이션 로직과 레이아웃을 바인딩하는데 필요한 글루 코드를 최소화할 수 있다. 데이터 바인딩 라이브러리는 유연성과 폭넓은 호환성을 모두 제공하는 지원 라이브러리로, Android 2.1(API 레벨 7 이상)까지 Android 플랫폼의 모든 이전 버전에서 사용할 수 있다. 데이터 바인딩을 사용하려면 Android Plugin for Gradle 1.5.0-alpha1 이상이 필요하다. [build.gradle] android { .... dataBinding { enabled = true } }[xml] ... ... [src] Activity @Override protected void onCreat..
Droid Knights 2019 Java vs Kotlin 실제 안드로이드 코드 사례. 발표자 박상권 2017년 Google I/O에서 공식 언어로 지정 Java Annotation 과 비교 var address: String? = null // @Nullable 과 같음 var id: String = "ted" // @NonNull 과 같음 var와 달리 val 은 get() 만 가능 물음표를 이용해서 null이 아니라면 다음 변수를 참조할 수 있도록 체이닝할 수 있습니다. 이러한 개념을 safe call이라고 합니다. ex) 순차적으로 null 체크 후 변수가 null 이라면 null 리턴 private fun getSelectedDealerName(car: Car?) : String? { retu..
RxAndroid + Retrofit2 + LazyHolder singleton (Initialization-on-demand holder idiom) 패턴을 이용한 네트워크 통신 예제 코드가 간결해지고 측정은 안해봤지만 왠지 속도도 빨라진 것 같은 느낌적인 느낌 :D build.gradle dependencies { ... implementation 'com.squareup.retrofit2:retrofit:2.4.0' implementation 'com.squareup.retrofit2:converter-gson:2.4.0' implementation 'com.squareup.okhttp3:okhttp:3.10.0' // Dependencies okio 1...
빌드 변형 구성을 통해 단일 프로젝트에서 다양한 버전의 앱을 생성할 수 있다. flavorDimensions 'mode' productFlavors { demo { dimension 'mode' buildConfigField("boolean", "IS_DEMO", "true") } full { dimension 'mode' buildConfigField("boolean", "IS_DEMO", "false") } }boolean isDemo = BuildConfig.IS_DEMO;
Room Persistence LibraryRoom은 SQLite의 추상 레이어를 제공하여 SQLite의 모든 기능을 활용하면서 유려하게 데이터베이스 액세스를 할 수 있습니다.구성요소1. Datbasedatabase의 holder를 만든다. annotation으로 entities(Table의 구조와 mapping되는 class)를 정의하고, 클래스 내부에 dao를 정의한다.@Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); } 인스턴스 생성AppDatabase db = Room.databaseBuilder(g..
SDK API 28 (9.0) 이상을 사용하면 Android X 마이그레이션이 필요하다.메뉴->Refactor> AndroidX 로 마이그레이션을 선택하면 자동으로 마이그레이션 됨
2019 년 8 월 1 일 부터 : 신규 앱 및 앱 업데이트는 Google Play에 게시 할 때 32 비트 버전 외에도 64 비트 버전을 제공해야합니다. 2021 년 8 월 1 일 부터 : Google Play는 64 비트 버전이 없는 기기에서 64 비트 버전이 지원되지 않는 앱의 게재를 중단합니다.즉, 해당 기기의 Play 스토어에서 더 이상 사용할 수 없습니다. The 64-bit requirement: what it means for developersStarting August 1, 2019:All new apps and app updates that include native code are required to provide 64-bit versions in addition to 32-bit..
CI 서버가 아니라면 명시할 필요 없는 옵션임. preDexLibraries 증분 빌드가 더 빨라지도록 라이브러리 종속성을 pre-dex할지 여부를 선언합니다. 이 기능은 클린 빌드를 느리게 만들 수도 있으므로, CI(Continuous Integration) 서버에서 이 기능을 비활성화하는 것이 좋습니다. Ex)android {... dexOptions { preDexLibraries = false }... MS에서의 증분 빌드(Incremental Build) 규모가 큰 프로젝트를 빌드하는 경우, 이전에 빌드된, 아직까지 최신 상태인 구성 요소는 다시 빌드하지 않는 것이 중요하다. 왜냐하면 매번 모든 대상을 빌드하려면 너무나 오랜 시간이 걸리기 때문이다. 따라서 증분 빌드가 필요하며, (추가적인 지식..
Android X com.android.support.* 또는 android.support.*와 Android Architecture Component에서 사용하던 android.arch.*의 패키지 명을 안드로이드 라이브러리 28.0.0부터 새로운 androidx.* 패키지 명으로 교체 변경하지 않으면 빌드시 에러가 발생할 수 있다. AndroidX 로 변경 Android Studio > Refactor Menu > Migrate to AndroidX... 또는 아래 방법으로 에러 회피 AndroidManifest.xml application 태그안에 아래 구문 추가 tools:replace="android:appComponentFactory"android:appComponentFactory="what..
투명한 배경의 흰색 아이콘으로 만들어야 한다. (White icon) 안드로이드 Pie (9.0 / API 28) 기기에서 일반 이미지 아이콘을 Notification smallIcon 으로 사용하면원래 이미지가 아니라 흰색 또는 회색 단색으로 푸시 아이콘이 표시된다. 투명한 배경의 흰색 아이콘을 만든 후 코드 상에서 분기하면 해결. if (android.os.Build.VERSION.SDK_INT >= 28) { // Android P icon = R.drawable.ic_white_noti;}Colored by Color Scriptercs 참고 제작도구 : Android studio > New > Image Assets > IconType(Notification)
참조 : https://developer.android.com/guide/topics/security/permissions#normal-dangerous
가급적 implementation 사용, 라이브러리는 api 사용 (기존 compile 과 동일) 새 구성지원 중단된 구성동작implementationcompile컴파일 타임에는 모듈에 종속성을 사용할 수 있으며, 런타임에만 모듈 소비자에게 종속성을 사용할 수 있습니다. 대규모의 다중 프로젝트 빌드에서 api/compile 대신 implementation을 사용하면 빌드 시스템이 재컴파일해야 하는 프로젝트의 크기가 줄어들기 때문에 빌드 시간이 상당히 개선될 수 있습니다. 대부분의 앱과 테스트 모듈은 이 구성을 사용해야 합니다.apicompile컴파일 타임에는 모듈에 종속성을 사용할 수 있으며, 컴파일 타임과 런타임에는 모듈 소비자에게도 종속성을 사용할 수 있습니다. 이 구성은 compile(지금은 지원 ..
Caused by: java.io.EOFException: \n not found: limit=0 content=… 1. 서버 방화벽 문제 =>접속 허용으로 해결 2. Tomcat keepAliveTimeout 문제 connectionTimeout 을 늘린다고 해결 안됨. (keepAliveTimeout 을 끄거나 늘려야 함) o 이슈 재현Tomcat7 server.xml 설정 keepAliveTimeout 시간을 줄이고 (ex 1~100)휴대폰에서 접속하면 에러 발생 maxThreads 초과하는 접속은 java.net.SocketTimeoutException: SSL handshake timed out 발생 o Retrofit2 error message java.io.IOException: unexpe..
중국에서 사용중인 앱 crash. Firebase 문제임 해당 모듈 제거 Fatal Exception: java.lang.SecurityExceptionFailed to find provider com.google.android.gsf.gservices for user 0; expected to find a valid ContentProvider for this authorityandroid.os.Parcel.readException (Parcel.java:1946)android.os.Parcel.readException (Parcel.java:1892)android.content.IContentService$Stub$Proxy.registerContentObserver (IContentService.j..
안드로이드 스튜디오 상단 메뉴에서 Analyze > Run Inspection By Name... (Ctrl+Alt+Shift+I) and type: Hardcoded Text to find the hardcoded strings in the .xml files; Hardcoded Strings to find the hardcoded strings in the .java files. Run it against the whole project, and you should get an inspection results panel that will show the hardcoded text instances. 참조 : [https://stackoverflow.com/questions/30799211/andro..
2017년 12월 구글 이슈 트레커에 등록되었지만 원인도 해결책도 없음 o 이슈트래커https://issuetracker.google.com/issues/70259031 o LogLGE Nexus 5X(bullhead), Android 8.1보고서 1/1*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***pid: 0, tid: 0 >>>
1) minifyEnabled true 확인 12345678910 buildTypes { debug { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } 2)프로가드 파일에 아래 구문이 있다면 삭제 -dontobfuscate
안드로이드 라이브러리 프로젝트를 AAR 로 만들면, AAR 안에는 종속 라이브러리들이 포함되지 않는다. 아래와 같이 라이브러리 프로젝트에서 retrofit 이 dependencies 걸려 있어도 aar 로 만들면 retrofit 은 제외하고 aar이 생성된다. "transitive=true" 옵션도 이 문제를 해결해 주지 못함. Ex) apply plugin: 'com.android.library' dependencies { implementation 'com.squareup.retrofit2:retrofit:2.4.0' }방법 1) Dependencies lib 를 jar 형태로 libs 폴더에 추가 후 AAR 생성 AAR 에 포함되어 배포된다. 방법 2) AAR 호출자가 ..
apk 설치 시 아래와 같은 문제 발생 "앱이 설치되지 않았습니다.""패키지가 손상된 것 같습니다." adb: failed to install app-debug.apk: Failure [INSTALL_FAILED_TEST_ONLY: install PackageLI] 해결책 Project root 'gradle.properties' 파일에 아래 구문 추가 android.injected.testOnly=false
Settings.Secure.ANDROID_ID 를 베이스로 UUID 생성 private static String getUUID(Context _context) { UUID uuid = null; String androidId = Settings.Secure.getString(_context.getContentResolver(), Settings.Secure.ANDROID_ID); if (androidId == null || androidId.isEmpty() || androidId.equals("9774d56d682e549c")) { uuid = UUID.randomUUID(); } else { try { uuid = UUID.nameUUIDFromBytes(androidId.getBytes("UTF8..
안드로이드 스튜디오 로그캣 불필요한 로그 제외 로그캣에 "Show only selected application" 항목을 선택하면 특정 패키지에 대한 로그를 볼 수 있지만 기타 시스템 로그도 포함되어 있어서 보기 불편하다. "Edit filter Configuration" 을 선택하고 "Log Tag" 란에 아래 구문을 넣으면 불필요한 시스템 로그가 제거 되어 보기 편해진다. 필터링 구문 ^(?!(WifiMulticast|WifiHW|MtpService|PushClient|ViewRootImpl|InputTransport|InputMethodManager|mali|TextView))
TEE : 신뢰 실행 환경 (Trusted Execution Environment) TEE 중 하나가 ARM Trustzone (즉 TEE가 상위개념)
1. 공통업데이트 하면 전체 공개에 보통 1~4시간 정도 소요 (늦어도 하루 안에 전세계 배포됨)versionName 은 상관없으나 versionCode는 반드시 업데이트 마다 숫자가 올라가야 함(프로덕션/베타 간 버전코드 관계 공유함. 무조건 숫자 올릴 것) 2. 베타 공개베타는 그룹 또는 특정 사용자에게만 url 형태로 공개 베타 테스트목록(테스터) 는 활성에 체크 하고 '업데이트 제출' 을 해야 실제로 베타테스터에게 활성/공개됨
Support Library 이전 안드로이드 버전을 사용하고 있는 기기에서 새로운 API를 사용 할수 있도록 도와주는 호환성 라이브러리이며 새로운 안드로이드 버전이 나올때 마다 업데이트 된다.v4 안드로이드 API4부터 사용이 가능한 라이브러리로 API 11에서 소개된 Fragment와 Loader등 주요 클래스의 구현을 지원하며 ViewPager, DrawerLayout등 포함 되어 있다.v7-AppCompat v4를 이용하여 확장한 라이브러리로 단순히 액션바(API 11), 툴바(API 21)등을 지원한다.이러한 서포트 라이브러리는 기본 SDK에서 제공하는 것과 대부분 동일하나 약간의 차이나 기능 축소가 있을 수 있다. 또한 기본 SDK와 라이브러리는 완전히 다르게 분리 시켰기 때문에 사용시 일관성이..
>adb shell getprop | grep cpu Galaxy S6 의 경우 아래와 같이 나온다. [ro.product.cpu.abi]: [arm64-v8a][ro.product.cpu.abilist32]: [armeabi-v7a,armeabi][ro.product.cpu.abilist64]: [arm64-v8a][ro.product.cpu.abilist]: [arm64-v8a,armeabi-v7a,armeabi]
버튼 백그라운드에 shape 속성만 있다면 getBackground()의 drawable은 GradientDrawable 이다.GradientDrawable d = (GradientDrawable) myView.getBackground();d.setColor(Color.YELLOW); 버튼 background가 selector 이면 getBackground()의 drawable은 StateListDrawable 이다.그러나 press등의 state를 가지지않을 때 변경을 시도했으나 변경되지않음. 추후에 더 테스트 해볼 것 StateListDrawable states = (StateListDrawable) myView.getBackground();states.addState(new int[]{android..
IntentFilter intentFilter_1 = new IntentFilter(); intentFilter_1.addAction(NfcAdapter.ACTION_NDEF_DISCOVERED); try { intentFilter_1.addDataType("*/*"); } catch (MalformedMimeTypeException e) { e.printStackTrace(); } IntentFilter intentFilter_2 = new IntentFilter(); intentFilter_2.addAction(NfcAdapter.ACTION_TECH_DISCOVERED); try { intentFilter_2.addDataType("*/*"); } catch (MalformedMimeTypeExce..