안드로이드 리눅스 커널 상에 구축 리눅스의 보안 기능 이용
설치된 앱마다 UID GID를 부여(리눅스 상의 기능) 데이터 각각 사용
$adb shell 
$cd /data/data/
$ls -al | grep com.advanced (uid,gid 확인)

UID, GID가 같으면 저장소 공유 가능 sharedUserId 서명이 같아야 함
매니페스트 android:sharedUserId="com.advanced_android.uid"도 같아야 함
sharedUserId 릴리즈 된 앱에서 추가되면 업데이트 불가 삭제후 재설치
그럴 경우는 contentprovider를 사용

adb shell ps 프로세스 확인 앱이 독립되어 있는지 보기 위해

퍼미션
ContextCompat.checkSelfPermission() 퍼미션 허용여부 검사
ActivityCompat.requestPermissions() 퍼미션 요청
ActivityCompat.shouldShowRequestPermissionRationale() 트루면 설명이 필요

앱 내에 퍼미션 사용 (같은 서명 사용 필요)
앱 A의 액티비티를 퍼미션으로 보호


...
앱 B에서 앱 A를 사용하기 위해 퍼미션을 사용

퍼미션 스틸링 대응
$keytool -list -v -keystore ~/.android/debug.keystore -storepass android 해시값
1. 출력된 Hash(sha1)에서 콜론(:)을 제거한 값을 검사

2. getCallingActivity().getPackageName() 호출원의 패키지명 확인 해시 검출
public static String hash(Context ctx, String pkgName){
if(pkgname==null)return null;
try{
PackageManager pm = ctx.getPackageManager();
PackageInfo pkginfo = pm.getPackageInfo(pkgname, PackageManager.GET_SIGNATURES);
if(pkginfo.signatures.length != 1) return null;
Signature sig = pkginfo.signatures[0];
byte[] cert = sig.toByteArray();
byte[] sha1 = computeSha1(cert);
return byte2hex(sha1);
}catch (NameNotFoundException e){} 
return null;}
1과 2의 해시값이 같을때만 허용

AES 암호화
public static byte[] cipherEncrypt(byte[] buf, String key, String iv){
try{ SecretKeySpec sksSpec = new SecretKeySpec(key.getBytes(), "AES");비밀키
IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());초기화 벡터
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
cipher.init(Cipher.ENCRYPT_MODE, sksSpec, ivSpec);
return cipher.doFinal(buf);
} catch(Exception e){} finally{} 
return null;
}
sharedPreference 난독화 키를 난독화하고 상수로 사용
네트워크에서 native라이브러리 로드X 앱내에서만O 자바 동적코드로딩X

자바스크립트 인터페이스 사용은 개발사, 협력사 도메인만
@JavascriptInterface 어노테이션을 붙여야 함(17이상 호출가능 4.2 없으면 에러)

https SSLHandshakeException 인증서 검증 오류 우회하지 말고 제대로 처리할 것

webview file:// 스킴 취약성 http 와 https만 허용하도록

시스템 취약성 해소는 SecureRandom
SecureRandom의 취약성은 아래 사이트에서 대처
https://android-developers.googleblog.com/2013/08/some-securerandom-thoughts.html

보안 팁 페이지 https://developer.android.com/training/articles/security-tips


블로그 이미지

dev김

안드로이드 개발자로 만 4년이 좀 안되게 근무했었고 그 이상의 공백을 가지고 있다. 다시 현업에 복귀하기 위한 노력의 흔적을 담으려고 한다.

,

values-v21 vaules에 각각 styles등록하여 버전별 동작가능하게


머티리얼 디자인 지원 라이브러리 appbarlayout collapsingtoolbarlayout 

coordinatorlayout floatingactionbutton navigatorview snackbar tablayout 

textinputlayout


5.0롤리팝api21↑ Theme.Material 지원 <style name="AppTheme" 

parent="android:Theme.Material">...</style>


v7 appcompat Theme.AppCompat 테마 이용시 머티리얼 디자인 테마 적용

(edittext spinner checkbox radiobutton checkedtextview switchcompat)


api21 미만 불가한 기능

(액티비티 전환, reveal애니메이션, elevation shadow, ripple event, 곡선 모션)


Theme.Material 사용시 Ripple Effect 적용됨 

android:selectableItemBackground도 마찬가지


Drawable에 리플 이펙트 적용

<ripple xmlns~ android:color="@color/accent_dark"><item>

<shape android:shape="oval">

<solid android:color="?android:colorAsscent"/>

</shape></item></ripple>


터치 포인트에 리플 이펙트 시작 

drawableHotspotChanged콜백 Drawable에 터치 위치 전달


오픈소스 리플 이펙트

https://github.com/traex/RippleEffect

https://github.com/balysv/material-ripple


팔레트 Pallette p = Pallette.from(bitmap).generate(); 

p.getVibrantSwatch().getRgb();

vibrant 선명한 muted 부드러운


support design 

implementation 'com.android.support:design:23.2.1'


NavigationView(좌측 메뉴) 

tablayout(탭레이아웃 viewpager와 사용권장)

toolbar(상단액션바) 

coordinatorlayout(스크롤 뷰 위치 크기 동적 관리 ex콜랩스 툴바)


<coordinatorlayout><appbarlayout><collapsingtoolbarlayout> 

<toolbar/> <include layout""/>

</collapsingtoolbarlayout></appbarlayout></coordinatorlayout>


appbarlayout의 자식요소(collapsingtoolbarlayout)에는 app:layout_scrollFlags를 설정하여 스크롤 시 동작 지정가능(tech12/coordinatorLayout02)

scroll|exitUntilCollapsed 아래로 minHeight까지 작아짐 위로 maxHeight까지

scroll|enterAlways 아래로 minHeight관계없이 사라짐 위로 바로 표시(퀵 리턴)

scroll|enterAlwaysCollapsed 아래로 minHeight관계없이 사라짐 위에서 당기면 표시


floatingactionbutton(둥근버튼) snackbar(하단 팝업 토스트)

floatingactionbutton 

app:layout_anchor="@id/app_bar" 

app:layout_anchorGravity="bottom|end" 위치 지정

앱바가 최소 크기에 가까워지면 fab도 숨겨짐

블로그 이미지

dev김

안드로이드 개발자로 만 4년이 좀 안되게 근무했었고 그 이상의 공백을 가지고 있다. 다시 현업에 복귀하기 위한 노력의 흔적을 담으려고 한다.

,

머티리얼 디자인 가이드 https://material.io/design/introduction


https://material.io/design/layout/component-behavior.html#


버튼 Flat(고정)/Raised(컨텐츠 속)/FloatingAction/Dropdown(스피너 대신)


인터랙션 RippleDrawable(탭 물결),

ViewAnimationUtils.createCircularReveal(화면 전환물결),


SharedElements(뷰 전체화면),

ActivityTransitionAnimation(5.0롤리팝API21이후)

블로그 이미지

dev김

안드로이드 개발자로 만 4년이 좀 안되게 근무했었고 그 이상의 공백을 가지고 있다. 다시 현업에 복귀하기 위한 노력의 흔적을 담으려고 한다.

,