방대한 문서보다 동작하는 소프트웨어

개발 53

중요 정보가 평문 으로 노출되지 않도록(메모리 덤프) 막기

중요한 정보를 String 타입에 할당하여 사용하면, 메모리 덤프에서 평문이 노출되게 된다. 비밀번호를 password라고 설정했다고 가정하자. 이를 변수에 그대로 할당 후 의도적으로 메모리를 덤프했을 때 password 가 Hex(16진수) 코드들 사이에 그대로 노출되는 것을 확인할 수 있다. String 변수에 담아 사용 후, 변수에 null을 할당한다고 해도 메모리에는 password 가 여전히 평문으로 남아있다. null은 새로운 메모리 주소에 할당되기 때문이다. 그러므로, 중요 정보는 String 타입에 담지 말고 Char형태를 배열에 담아 사용하도록 하자. 사용 후에는 반드시 다른 값으로 채워주자. fun overwrite() { val password = charArrayOf('p','a',..

개발 2022.03.11

[안드로이드] 테스트 광고가 나오지 않을 때

서론 갑작스럽게 테스트 광고가 나오지 않았다. 오프닝 광고도, 전면 광고도 나오지 않았다. 본론 로그는 아래와 같다. ad error: { "Code": 3, "Message": "No ad config.", "Domain": "com.google.android.gms.ads", "Cause": "null", "Response Info": { "Response ID": "null", "Mediation Adapter Class Name": "", "Adapter Responses": [] } } 구글에 Android No ad config 로 검색하면 수 많은 검색 결과를 볼 수 있고, 각 웹사이트는 해결책을 제시해 주고 있다. 대부분의 해결책으로서 테스트단말을 등록해주면 된다 라는 것이다. 구체적인 방..

개발 2022.03.06

[안드로이드 ] compileSdk 버전 vs. targetSdk 버전

두 SDK 버전(compileSdk와 targetSdk)의 역할 두 SDK 버전(compileSdk, targetSdk)은 Android 에서 호환성을 처리하는데 중요하다. compileSdk 과 targetSdk 는 완전히 다른 의미와 목적을 가지고 있다. compileSdk 버전 compileSdk 는 앱을 컴파일 하는데 사용할 SDK 버전을 말한다. compileSdk 를 최신으로 설정하면 최신 API를 액세스할 수 있다. compileSdk 는 컴파일 시에만 사용되며 aab, apk 파일이 포함되지 않는다. 때문에 compileSdk 를 항상 최신으로 유지하는 것이 좋다. 최신으로 유지한다면 3 가지이 이점이 있다. 새로운 API에 대한 컴파일 검사를 받을 수 있다. 새로운 API를 사용할 수 있..

개발 2022.02.07

[안드로이드] spotless 를 적용하자

spotless 란? spotless 는 코드를 흠 잡을데 없이 유지시켜주는 도구다. 적용하기 spotless는 ktlint 를 사용하고 있는 프로젝트 수준의 build.gradle.kts 에 아래의 코드를 삽입하자! plugins { id("com.diffplug.gradle.spotless") version "3.27.1" } subprojects { apply(plugin = "com.diffplug.gradle.spotless") val ktlintVer = "0.43.2" spotless { kotlin { target("**/*.kt") ktlint(ktlintVer).userData( mapOf("max_line_length" to "100", "disabled_rules" to "impor..

개발 2022.01.10

[안드로이드] 프로가드를 설정하는 세 가지 방법(Kotlin DSL)

안드로이드 프로젝트의 앱 수준 build.gradle 에서 프로가드를 적용하는 방법에는 대략 세 가지가 있다. 첫번째: proguardFile(file("proguard-rules.pro")) proguard-rules.pro 파일에 모든 라이브러리의 proguard rule 을 작성한다. 간편하다. 두번째: proguardFiles( files( "proguard-rules-retrofit.pro", "proguard-rules-glide.pro", "...", ) ) 라이브러리 별로 파일을 다르게 하여 작성한다. 라이브러리 하나에 대한 가독성이 높아진다. 다만 결국 여러 라인을 작성하게 된다. 세번째: // 아래 두 줄은 생략해도 무방하다. proguardFile(getDefaultProguardFi..

개발 2022.01.09

[깃허브] 새 저장소에 푸시 하기, 기존 저장소에 로컬 데이터 푸시 하기

깃허브의 새 저장소에 푸시하기 echo "# NewProject" >> README.md git init git add README.md git commit -m "first commit" git branch -M main git remote add origin ~~.git git push -u origin main 깃허브의 기존 저장소에 로컬 데이터 푸시하기 git init git add * git commit -m "first commit" git remote add origin ~~.git git branch -M main git push -u origin main git init 하면 .gitignore 파일이 만들어 진다. 곧바로 commit 한다면 불필요한 파일을 푸시 될 수 있다. 때문에 ...

개발 2021.12.09

Android Loopj, ez.msebera.android.httpclient.Header[] 문제

Android Loopj, ez.msebera.android.httpclient.Header[] 문제 서버 연동을 위해 Loopj를 사용하기로 결정했다. 'project stuructrue' 메뉴를 통해 build.gradle의 dependencies를 작성했다. 그러나 아래와 같은 문제가 발생했다. 결과 인자로 들어오는 Header[]를 불러오지 못하는 현상이다. 원인을 찾아보니 대~충 알 수 있었다. 안드로이드 API 지원이 중단되었기 때문이다. 더 이상은 알아보지 않았다. http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-apache-http-clienthttps://hc.apache.or..

개발 2015.11.19

안드로이드 스튜디오 AVD 크기(Scale, 스케일) 조절

AVD의 크기를 조절해 보자. 윈도우(8.1) 버전 안드로이드 스튜디오에서 에뮬레이터를 실행하면 크기가 너무 크게 나오는 경우가 있다. 이때는 Command에서 크기를 조절해 주면 된다. 방법을 살펴보자. 첫 번째, AVD를 실행한다. Telnet을 이용해 AVD에 접속해야 하기 때문이다. 두 번째, Command에서 Telnet을 사용하기 위해 Telnet을 활성화 한다. 텔넷 활성화는 제어판>프로그램>프로그래 및 기능>Windows 기능 켜기/끄기 에서 할 수 있다. 만약, Command에서 Telnet 명령어가 실행되면, 이미 활성화 된 것이니 별도로 활성화 할 필요가 없다. 세 번째, Command 창을 열고 명령어를 입력한다. 접속 : telnet localhost 5554크기 : window ..

개발 2015.08.31

안드로이드 노티피케이션(Android Notification) 긴글 표시

안드로이드 노티피케이션(Android Notification) 긴글 표시 노티피케이션에 나타나는 글의 길이가 길 때가 있다. 일반적으로 안드로이드에서는 긴글을 모두 나타내지 않는다. '...'으로 표시하고 있다. 긴 글을 모두 나타내기 위해서는 Style과 Priority를 반드시 적용 해야 한다. 아래는, 노티피케이션에서 긴 글을 표현하는 코드이다. 여기서 주의해야 할 점이 있다. Notification.Builder 나 BitTextStyle 은 젤리빈(Android API Level 16)부터 생겨났다는 점이다. 따라서, 앱의 버전 지원 정책이 젤리빈 이전을 포함한다면 버전에 따른 분기처리를 반드시 해줘야 한다. 그러지 않으면 Exception 발생후 앱이 죽게 된다. private void sen..

개발 2015.08.26

Android ExifInterface 의 기본

Android ExifInterface의 '기본'을 다루고자 한다. '기본'이라는 것은 Exif 정보를 쓰기, 읽기, 복사, 인코딩, 디코딩 하는 것을 말한다. 기본을 알기에 앞서, Exif의 뜻을 알아보고자 한다. Exif는 'Exchangeable image file format'의 줄임말이다. 우리나라 말로 '교환이미지 파일형식'이라는 의미를 갖고 있는다. 왜 이런 의미인지는 잘 모르겠다. 쉽게 생각해서 '사진정보'라고 알아두면 편하겠다. 사진정보라는 것은 사진의 위도.경도.시간.방향 등을 뜻한다. 이 글에서는 위도.경도를 기준으로 진행하고자 한다. Exif 쓰기 public void setExifInfo(Uri ImageUri){ // 전체 경로를 매개변수로 받는다.(/sdcard/DICM/xxx..

개발 2015.08.12

안드로이드 갤러리에서 이미지 주소 가져올 때(Android Gallery)

/external/images/media/38 안드로이드 기본 갤러리(Gallery)에서 이미지를 가져오게 되면 Uri의 경로가 위와 같다. 안드로이드 내부에서 갤러리 이미지를 따로 관리하기 때문이라고 생각한다. 개발할 때 안드로이드의 전체 경로를 가져와야 할 필요가 있다. 아래와 같은 방법으로 처리한다. 위의 경로를 인자로 받는 메서드이다. private Uri getGalleryImageFullPath(Uri uri) { String[] filePathColumn = {MediaStore.Images.Media.DATA}; Cursor cursor = mParentActivity.getContentResolver().query(uri, filePathColumn, null, null, null); c..

개발 2015.08.06

안드로이드 스튜디오(Android Studio) Rendering problems

MAC OSX Rendering problems.The following classes could not be instantiated: - android.support.v7.internal.widget.ActionBarOverlayLayout.. 안드로이드 스튜디오에서, 레이아웃을 Design 모드에서 열었을때 위와 같은 문제가 발생할 때가 있다. 이 문제는 스타일에서 테마를 변경하므로 해결할 수 있다. res/values/styles.xml 테마 변경으로 해결이 안될경우, 아래와 같이 디자인 모드에서 버전을 변경해 보도록 한다.

개발 2015.07.29

conversion to dalvik format failed with error 1

conversion to dalvik format failed with error 1(달빅 형식으로 변환 오류) APK를 만드는 과정에서 Finish버튼을 눌렀을때 위의 오류 팝업이 뜰 때가 있다. 그렇다면.. tool/proguard/bin/proguard.bat 편집 기존 : call %java_exe% -jar "%PROGUARD_HOME%"\lib\proguard.jar %* 변경 : call %java_exe% -jar "%PROGUARD_HOME%"\lib\proguard.jar %1 %2 %3 %4 %5 %6 %7 %8 %9 또는 기존으로 바꿔야 할때도 있다.

개발 2014.12.08

android webview youtube fullscreen error // 안드로이드 웹뷰 동영상 전체화면 클릭하면 발생하는 에러

웹뷰에서 유뷰브 동영상에서 전체화면을 클릭하면 발생하는 에러를 처리하는 방법입니다. 웹크롬 클라이언트를 오브라이딩해서 처리해주면 됩니다. 문제점은 모든 기종은 테스트해보지 않았지만 아이스크림샌드위치 이상버전에서는 잘 동작하지만 갤럭시 2같이 진저브레드 버전에서는 동영상이 확대된 상태로 실행이 되니 버전을 체크해서 적절하게 구현해주면 됩니다. 출처 : http://nanstrong.tistory.com/216import android.app.Activity; import android.content.Context; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.web..

개발 2014.11.13