일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 하드코드검색
- Retrofit2
- 안드로이드
- RX
- Rx자바
- android P
- deprecating the install_referrer
- Switch to the Play Referrer API by March 1
- hardcoded string search
- RxJava2
- andorid studio
- java
- rxandroid
- RXjava
- Android
- Today
- Total
목록안드로이드 (29)
Lucky Dog
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)
에러발생 원인 안드로이드 P 버전(9.0) 에서 'HTTP' 를 사용하면 발생. - java.net.UnknownServiceException : CLEARTEXT communication to xx.xxx.xxx.xx not permitted by network security policy - java.io.IOException: Cleartext HTTP traffic to www.google.com not permitted 해결방법 1. AndroidManifest.xml 수정 android:usesCleartextTraffic="true" 추가 2. HTTPS 사용
가급적 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..
구글 플레이 스토어에 다운받은 앱은 권한 ON 상태 (Android 7.0, 8.0 test)사설 스토어(apk) 를 통해 설치한 앱은 권한 Off 상태 테스트한 바로는 sdk target 버전과는 상관없음 일부 중국폰에서 해당 권한이 불필요함에도 권한을 manifest에 명시안하면 앱이 실행안되는 문제가 있었음(on/off 무관)
안드로이드 스튜디오 상단 메뉴에서 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..
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
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))
* 프로가드 유무는 리패키징 자체에 영향을 주지않고 난독화 유지 프로가드 미적용 1. apk tool 다운로드https://code.google.com/p/apktool/downloads/ 2. 기기에 설치된 apk 파일 가져오기 2-1. adb shell 진입>adb shell 2-2. 설치된 앱 확인$>pm list packages -f | more 2-3. apk 가져오기$>exit>adb pull "apk경로" "저장할경로"ex) adb pull /data/app/com.test.reversetest-1.apk C:\apk_tool 3. 디컴파일>java -jar apktool.jar d com.test.reversetest-1.apk output 4.smali 파일 분석 및 수정> output ..
1. Activity 의 경우 1-1. manifest 1-2. xml file (nfc_tech_filter.xml) android.nfc.tech.IsoDep android.nfc.tech.NfcA android.nfc.tech.NfcB android.nfc.tech.NfcF android.nfc.tech.NfcV android.nfc.tech.Ndef android.nfc.tech.NdefFormatable android.nfc.tech.MifareClassic android.nfc.tech.MifareUltralight org.nfcforum.ndef.type2 2. foreground에서 NFC 수신 2-1. onResume() PendingIntent pIntent = PendingIntent..
1. 콘솔 사이닝 1-1. Unsinged apk 생성- 이클립스 -> Android tool -> export unsinged application package 로 사인안된 apk 생성 1-2. keysotre 생성 keytool -genkey -v -keystore my-release-key.keystore - alias alias_name -keyalg RSA -keysize 2048 -validity 1000010000->(day) 1-3. 사이닝 jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name 1-4. 검증1) $ jarsigner ..
drawable-ldpi : 32x32 drawable-mdpi : 48x48 drawable-hdpi : 72x72 drawable-xhdpi : 96x96 drawable-xxhdpi : 144x144 drawable-xxxhdpi : 192x192 http://developer.android.com/design/style/iconography.html
안드로이드 https 통신 인증서 생성 완전한 상호인증은 클라이언트에서 서버 인증서를 검사하고, 서버에서는 클라이언트 인증서를 검사하는 것서버, 클라이언트에서 각각 keystore 생성 후 인증서(cer) 를 export하고 해당 인증서를 각자의 키스토어에 추가한다. 1. 인증서 생성서버 : keytool -genkey -keystore server.jks -alias server클라이언트 : keytool -genkey -keystore client.jks -alias client 2. 인증서 Export서버 : keytool -export -keystore server.jks -alias server -file server.cer클라이언트 : keytool -export -keystore client..
네이티브 앱일반적인 안드로이드 플랫폼에서 개발된 앱 모바일 웹웹페이지를 모바일에 맞게 조절한 것. 모바일에선 브라우저를 통해 화면처리 모바일 웹앱웹페이지를 모바일앱 형태로 만들어 네이티브앱을 이용하는 것처럼 처리 앱내부 브라우저에서 native 적인 기능을 혼용해서 쓰는 방식 가능.(ex. webview를 통해 화면을 보며 native 기능활용 + 서버통신) 하이브리드앱웹언어를 이용하여 프로그래밍 후 폰갭 등을 이용하여 android, ios app으로 추출한다.