아래는 어떤 문자열에 GSM7 문자셋에 포함되어 있지 않은 문자가 존재하는지 체크하는 메소드입니다. 프레임워크 라이브러리에 포함된 GsmAlphabet 클래스를 이용하고 있습니다.

    /**
     * GSM 이외의 문자가 포함되어 있는가?
     */
    public static boolean isNonGsmAlphabetExists(CharSequence  v) {
        try {
            com.android.internal.telephony.GsmAlphabet.countGsmSeptets(v, true);
        } catch (Exception e) {
            return true;
        }

        return false;
    }

Exception이 던져지는지 여부로 판단을 하기 때문에 성능상 좋은 소스는 아닙니다만, 저는 단순함을 좋아하기 때문에 별로 신경안씁니다.^^
더 효과적인 방법이 있는지는 모르겠습니다. 참고만 하세요.

Posted by 에코지오
,
안드로이드용 JVM인 Dalvik VM에는 여러가지 실행 옵션이 있습니다. dalvikvm -help 명령으로 가능한 옵션들을 볼 수 있습니다.

$ adb shell
# dalvikvm -help
dalvikvm -help

dalvikvm: [options] class [argument ...]
dalvikvm: [options] -jar file.jar [argument ...]

The following standard options are recognized:
  -classpath classpath
  -Dproperty=value
  -verbose:tag  ('gc', 'jni', or 'class')
  -ea[:<package name>... |:<class name>]
  -da[:<package name>... |:<class name>]
   (-enableassertions, -disableassertions)
  -esa
  -dsa
   (-enablesystemassertions, -disablesystemassertions)
  -showversion
  -help

The following extended options are recognized:
  -Xrunjdwp:<options>
  -Xbootclasspath:bootclasspath
  -Xcheck:tag  (e.g. 'jni')
  -XmsN  (min heap, must be multiple of 1K, >= 1MB)
  -XmxN  (max heap, must be multiple of 1K, >= 2MB)
  -XssN  (stack size, >= 1KB, <= 256KB)
  -Xverify:{none,remote,all}
  -Xrs
  -Xint  (extended to accept ':portable' and ':fast')

These are unique to Dalvik:
  -Xzygote
  -Xdexopt:{none,verified,all}
  -Xnoquithandler
  -Xjnigreflimit:N  (must be multiple of 100, >= 200)
  -Xjniopts:{warnonly,forcecopy}
  -Xdeadlockpredict:{off,warn,err,abort}
  -Xstacktracefile:<filename>
  -Xgc:[no]precise
  -Xgenregmap
  -Xcheckdexsum

Configured with: debugger profiler hprof show_exception=1

Dalvik VM init failed (check log file)

안드로이드 환경에서 우리는 dalvikvm 명령어를 실행하여 직접 애플리케이션 프로세스를 띄우지는 않습니다. 때문에 달빅 VM에 직접적으로 옵션을 전달할 수가 없습니다. 
그대신 안드로이드는 시스템 프로퍼티(system properties)를 설정하여 달빅 VM 실행옵션을 바꾸는 방법을 제공합니다. 간단하게는 setprop 명령어로 실행옵션을 바꿀 수 있습니다.
adb shell setprop dalvik.vm.[옵션명] [옵션값]

위와 같은 형식으로 달빅VM 관련 프로퍼티를 설정한 후, zygote 프로세스를 재시작하면(adb shell stop;adb shell start) 새로 런치되는 앱 프로세스에 변경사항이 적용됩니다.

VM 옵션에 대응하는 dalvik.vm.* 형식의 프로퍼티명이 정확히 무엇인지는 framework/base/core/jin/AndroidRuntime.cpp 소스를 참조하면 알 수 있습니다. 일단 제가 찾아낸 프로퍼티명과 프로퍼티값 샘플은 다음과 같습니다.

# -Xmx
dalvik.vm.heapsize

# -Xstacktracefile (기본값 /data/anr/traces.txt)
dalvik.vm.stack-trace-file 

# -Xcheck:jni (값은 true or false)
dalvik.vm.checkjni 

# -Xjniopts
dalvik.vm.jniopts

# -ea (값은 all, ?, ...)
dalvik.vm.enableassertions

# v=a,o=v와 같은 형식으로 값 설정
# v=a는 -Xverify:all, v=n은 -Xverify:none, v=r은 -Xverify:remote에 해당
# o=a는 -Xdexopt:all, o=v는 -Xdexopt:verified, o=n은 -Xdexopt:none에 해당
# m=y는 -Xgenregmap -Xgc:precise에 해당
dalvik.vm.dexopt-flags

# -Xint (값은 int:portable or int:fast or int:jit)
dalvik.vm.execution-mode 

# -Xdeadlockpredict
dalvik.vm.deadlock-predict

# -Xcheckdexsum (값은 true or false)
dalvik.vm.check-dex-sum 

# -Xthreshold
dalvik.vm.jit.threshold

# -Xjitop
dalvik.vm.jit.op

# -Xincludeselectedop
dalvik.vm.jit.includeop

# -Xjitmethod
dalvik.vm.jit.method 

# -Xincludeselectedmethod
dalvik.vm.jit.includemethod 

# -Xjitprofile
dalvik.vm.jit.profile  

* 자세한 내용은 다음 문서를 참조하시기 바랍니다.
Posted by 에코지오
,
가끔씩 마주치게 되는 "OutOfMemoryError : bitmap size exceeds VM budget" 에러는 메모리 누수가 주요 원인입니다. 이와 관련된 링크를 모아봤습니다.

* 액티비티가 멈출 때 비트맵을 재활용(즉 GC)되게 하라

- bitmap 이미지인 경우 recycle() 호출
- onPause에서 수행하는게 좋음
- ((BitmapDrawable)imageView.getDrawable()).getBitmap().recycle();

* 이미지를 미리 줄여서 읽어들여라

- BitmapFactory.Options.inSampleSize 활용

* Activity Context에 대한 참조(reference)를 오랫동안 유지하지 말아라

- Drawable.setCallback(null) 사용
- WeakReference를 가진 static 내부 클래스
- 이미지를 static 변수로 처리하지 마라

* 외부(outer) 클래스의 상태에 의존하지 않는 내부(inner) 클래스는 static으로 선언하라
- 내부클래스는 외부 클래스 인스턴스를 크게 만들며 또한 외부클래스 객체가 필요이상으로 오래 살아있게 되어 메모리를 더 차지할 수 있음
- 외부클래스의 상태 필드에 접근하지 않는(즉 외부 객체의 상태에 의존하지 않는) 내부클래스는 static으로 선언

* Attacking memory problems on Android

Posted by 에코지오
,