안드로이드에서 무음/진동/벨소리 모드를 받아오거나 설정하는 방법은 아래와 같다.

 

AudioManager audioManager = (AudioManager) context.getSystemService(AUDIO_SERVICE);

if (audioManager.getRingerMode() == AudioManager.RINGER_MODE_NORMAL) {

// 벨소리 모드일 경우
}
else if (audioManager.getRingerMode() == AudioManager.RINGER_MODE_VIBRATE) {

// 진동 모드일 경우

}
else if (audioManager.getRingerMode() == AudioManager.RINGER_MODE_SILENT) {

// 무음 모드일 경우

}

AudioManager audioManager = (AudioManager) context.getSystemService(AUDIO_SERVICE);
audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL); // 벨소리 모드로 변경
audioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE); // 진동 모드로 변경
audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT); // 무음 모드로 변경

 

위의 코드는 벨소리, 진동 모드에서는 잘 동작하나 무음모드 설정/해제시에 에러가 발생

 

아래와 같이 방해금지 설정 변경 권한을 주어 해결 가능하다.

 

NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
if (!notificationManager.isNotificationPolicyAccessGranted()) {

context.startActivity(new Intent(android.provider.Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS));
}

 

 

 


 

 

기존의 apk파일을 별도의 프로그램 없이 리패키징하는 방법입니다.

 

 


 

먼저 apk파일의 확장자를 zip으로 변경 후 압축을 풀어줍니다.


파일의 확장자가 보이지 않는 경우, 


도구 - 폴더 옵션의 보기 탭에서 '알려진 파일 형식의 파일 확장명 숨기기' 항목을 선택 해제합니다.

 

 

 

 

 

압축을 풀고 나면 다음의 구성요소들을 확인할 수 있습니다.

 




 assets

 패키지 내에 포함된 비 리소스 파일 

 META-INF

 apk 배포시 서명한 내용. 

파일 변조 시 패키지 손상 오류가 뜨며 기기에 설치가 되지 않음

 res

 리소스 파일

 AndroidManifest.xml

 Manifest

 classes.dex

 달빅에서 동작하는 컴파일 된 실행 파일

 resouces.arsc

 컴파일 된 리소스 파일



assets과 res 폴더에는 파일이 그대로 들어있기 때문에 수정 및 변경이 가능합니다.


소스코드의 경우 별도의 디컴파일 툴들(Dex2jar, JD-GUI, Apk manager, Apktool 등)을

 

사용해야만 확인할 수 있습니다.

 

 

수정이 끝나면 기존 서명은 효력을 잃게 되기 때문에 


패키지 폴더 내의 'META-INF' 폴더를 삭제한 후 다시 zip파일로 압축해줍니다. 


이 때, 고급설정 - 압축방법 - 압축 안함 옵션을 선택해 압축합니다. (알집의 경우)

 

 

 

 

마지막으로, zip파일 확장자를 다시 apk로 변경 후 재서명하면 리패키징이 완료됩니다.


서명을 위해 JDK 내에 포함된 'jarsigner'를 사용합니다.


cmd창에서 다음의 명령어 입력 후 패스워드를 입력하면 서명이 완료됩니다.

 

> jarsigner -verbose -keystore [your keystore file] [your apk file.apk] [your keystore alias]

 


JDK가 설치되어 있지 않을 경우, 아래의 링크에서 사용하는 OS에 맞게 다운받아 설치합니다.


Download JDK



JDK 설치 이후에도 아래와 같은 문제 발생 시,


'고급 시스템 설정' 창에서 '환경 변수'를 클릭하여 시스템 변수 목록에서 Path를 찾습니다.

가장 끝에 ';[JDK 설치 경로]\bin'을 추가한 뒤 cmd를 재실행하면 해결됩니다.




 


 

리눅스에서 gcc, g++ 컴파일러를 이용하여 코드를 컴파일 시 다양한 최적화 옵션 사용이 가능하다.

 

 

$ g++ -(optimization options) test.cpp

 

 

각 옵션들은 매우 다양하기 때문에 일반적으로 이들을 묶어 간편하게 사용 가능한 '-O1', '-O2', '-O3' 옵션을 사용한다.

 

KLDP에서 설명하는 각 옵션의 최적화 방식은 다음과 같다.

 

 

'-O1'의 경우, 만들어지는 오브젝트, 또는 실행 파일을 가능한 작게 하면서, 컴파일 시간이 오래걸리지 않는 선에서 최적화를 수행.

'-O2'의 경우, 만들어지는 코드가 가능한 빠르게 수행되도록 하지만, 코드의 크기가 너무 커지지 않도록 하는 선에서 최적화를 수행.

'-O3'의 경우, 코드의 크기는 전혀 신경 쓰지 않고, 오직 빠른 코드를 만들어 내기 위해 최적화를 수행.

 


 

KLDP에서는 '-O2' 옵션과 '-O3' 옵션의 속도에 대해 아래와 같이 설명하는데, 직접 다양한 코드에 사용해 본 결과 속도는 '-O2'와 '-O3' 옵션이 비슷한 성능을 보인다.

 

 

'-O3'로 만들어낸 코드가 반드시 '-O2'를 써서 만들어낸 코드보다 빠르다는 보장은 없다는 것입니다.

왜냐하면, 보통 CPU가 기계어를 수행할 때, 일정한 분량만큼 먼저 CPU 내부의 cache(캐시)에 불러와서 수행하는데, '-O3'를 써서 만든 코드는 대개 크기가 커서, 이 cache에 들어갈 수 있는 명령의 양이 상대적으로 적어지기 때문에, 오히려 느려질 가능성도 있습니다.

 

 

하지만 최적화 옵션을 사용하고 안하고는 차이가 크니 컴파일시 꼭 사용하는 것을 추천한다.

 

 

 

+ Recent posts