'2013/10'에 해당되는 글 2건

  1. 2013.10.24 app 재실행 하기
  2. 2013.10.23 빨간 테두리 나오는 현상

app 재실행 하기

Android 2013. 10. 24. 10:19

app 운용 중 app에서 문제가 감지되어 재실행이 필요할 때, 특히 종료 시 System.exit(?) 가 문제가 많았다.


System.exit 의 문제는 app 종료 시 Activity lifecycle(onPause onStop onDestroy)에 대한 보장이 없다는 것,


결국 아래와 같이 고치고 나니 굉장히 안정적이게 됨.


PendingIntent i = PendingIntent.getActivity(getApplicationContext(), 0, new Intent(getIntent()), getIntent().getFlags());

AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

am.set(AlarmManager.RTC, System.currentTimeMillis() + 5000, i);

//System.exit(2)

moveTaskToBack(true); 

finish();

android.os.Process.killProcess(android.os.Process.myPid());




<추가>


시스템 앱의 경우 무슨 짓을 해도 다시 살아나더이다..

일반적인 경우에는 문제가 없는데, 같이 실행된 서비스가 프로세스에는 안보이고 (exported="false" → :remote 로 안뜸)

종료할 때 서로 연결되어 있던 서비스가 깔끔하게 unbind 되지 않음.

이 상태로 앱이 재시작 되면 먼저 있던 서비스와 bind가 안되는 경우가 가끔 나타남(타겟 특성일 수도 있음)

결국 재부팅으로 해결.. 흑..

'Android' 카테고리의 다른 글

현재 파티션 정보 보기  (0) 2016.05.18
빨간 테두리 나오는 현상  (0) 2013.10.23
Ethernet 사용을 위한 Kernel 설정  (0) 2013.08.07
Android 빌드 시스템 (Make file 관련)  (0) 2013.08.05
System app 구분  (0) 2013.08.05
Posted by 독뽀
,

빨간 테두리는 릴리즈용이 아니라 디버깅용일 때 자동으로 켜져 있다.

검색 결과 세팅에 나오는 Strict mode는 꺼져 있어도 빌드 시 eng(engineer) 모드로 빌드 하니 자동으로 켜졌다.


https://groups.google.com/forum/#!topic/android-x86/xhUxzF4kTjU 쓰레드를 보면 여러 말들이 많은데,

build.prop 에서 ro.build.type 값을 eng에서 user나 user-debug로 바꿔라,

prop 값을 세팅해라 persist.sys.strictmode.visual=persist.sys.strictmode.disable=1

등등.. 실제로 젤리빈 소스를 뒤져보니 

frameworks/base/core/java/android/os/StrictMode.java 에서 위의 strictmode prop 값들은

0,1 이 아니라 true false로 비교하고 있었고(특정 타겟 보드라 다를 수도 있음)

과부하? 등이 걸릴 때 빨간 테두리가 나온다는데 '얼마나' 보다는 '무엇을' 하는지가 더 중요하지 않나 싶어 빨간 테두리를 아예 뺌.





frameworks/base/core/java/android/os/StrictMode.java 소스에 있는 conditionallyEnableDebugLogging() 메서드 안에서

빨간 줄만 안나오게 고쳐보자.

+는 추가된 줄 -는 뺀 줄이고 한글 주석은 취향 (git unified view 로그 그냥 올림.. ㅋㅋ)


     // remove red border flashing

     public static boolean conditionallyEnableDebugLogging() {

         boolean doFlashes = SystemProperties.getBoolean(VISUAL_PROPERTY, false)

                 && !amTheSystemServerProcess();

   // 아래 false 기본 값을 true로 바꾸자. 위의 VISUAL_PROPERTY는 ICECREAM 미만, DISABLE_PROPERTY는 ICEREAM 이상)

   // 둘의 값은 의미상으로 보아도 반대여야 한가지 옵션으로서 기본 값이 맞아진다.(visual-보이기, disable-안보이기 이므로)

-        final boolean suppress = SystemProperties.getBoolean(DISABLE_PROPERTY, false);

+        final boolean suppress = SystemProperties.getBoolean(DISABLE_PROPERTY, true); // default false -> true (disable)

 

         // For debug builds, log event loop stalls to dropbox for analysis.

         // Similar logic also appears in ActivityThread.java for system apps.

@@ -944,7 +945,8 @@ public final class StrictMode {

             threadPolicyMask |= StrictMode.PENALTY_DROPBOX;

         }

         if (doFlashes) {

             // threadPolicyMask 옵션에서 PENALTY_FLASH 옵션을 빼버렸다.

-            threadPolicyMask |= StrictMode.PENALTY_FLASH;

+//            threadPolicyMask |= StrictMode.PENALTY_FLASH;

+            threadPolicyMask &= ~StrictMode.PENALTY_FLASH;

         }

 

         StrictMode.setThreadPolicyMask(threadPolicyMask);


테스트 결과 사이드 이펙트는 발견되지 않았습니다.
혹시 문제 있으시면 말씀해주세요~


'Android' 카테고리의 다른 글

현재 파티션 정보 보기  (0) 2016.05.18
app 재실행 하기  (0) 2013.10.24
Ethernet 사용을 위한 Kernel 설정  (0) 2013.08.07
Android 빌드 시스템 (Make file 관련)  (0) 2013.08.05
System app 구분  (0) 2013.08.05
Posted by 독뽀
,