[jsoup 사용시 오류] Caused by java.lang.NumberFormatException: For input string: “000C6
org.jsoup.nodes.Entities.load 하는 과정 중에 Entities.java line 314에서 오류가 발생하였다. 6번의 오류 보고가 있었고 모든 동일한 사람으로 부터 발생한 오류였다. 확인결과 알 수 없는 제조사의 GCE x86 phone 이며, 운영체제는 Android 9이고 루팅된 폰이다. 루팅된 폰에서는 앱을 사용할 수 없도록 루팅폰 체크 로직을 추가하였으나 통과한 케이스이다.
현재 사용중인 루팅폰 체크 로직이 100%루팅폰을 걸러낼 수 없음을 알고 있다. ISMS인증 심사를 통과하기 위한 목적으로 사용될 뿐 그 이상의 의미는 없는 것 같다.
참고) 모바일기기 취약점진단 가이드 (M-T06 발췌)
※ 안드로이드에서 루팅을 감지하는 방법은 여러가지가 있다. 그중 파일 이름 기반의 탐지, su 명령어를 실행해서 확인하는 방법으로 감지하는데 일반적으로 su 파일이나 superuser.apk 등 루팅 시 생성되는 파일 이름을 기반으로 탐지한다. Su 명령어의 경우 일반적으로 루팅되지 않은 안드로이드 디바이스에서는 su 명령어가 존재하지 않는다. 이때 su 명령을 직접 실행 시켜서 Exception이 발생여부에 따라 해당 디바이스의 루팅 여부를 감지할 수 있다.
루팅폰 체크 로직은 아래 코드 스니펫에 보는 코드를 사용중에 있다.
import java.io.File;
/**
* Created by pjs0429 on 2017-11-03.
*
참고) 모바일기기 취약점진단 가이드 (M-T06 발췌)
※ 안드로이드에서 루팅을 감지하는 방법은 여러가지가 있다. 그중 파일 이름 기반의 탐지, su 명령어를 실행해서 확인하는 방법으로 감지하는데 일반적으로 su 파일이나 superuser.apk 등 루팅 시
생성되는 파일 이름을 기반으로 탐지한다. Su 명령어의 경우 일반적으로 루팅되지 않은 안드로이드 디바이스에서는 su 명령어가 존재하지 않는다.
이때 su 명령을 직접 실행 시켜서 Exception이 발생여부에 따라 해당 디바이스의 루팅 여부를 감지할 수 있다.
*
*/
public class CellphoneRoutingCheck {
public static boolean checkSuperUser(){
return (checkRootedFiles() == true || checkSuperUserCommand() == true) ? true : false;
}
private static boolean checkRootedFiles(){
final String[] files = {
"/sbin/su",
"/system/su",
"/system/bin/su",
"/system/sbin/su",
"/system/xbin/su",
"/system/xbin/mu",
"/system/bin/.ext/.su",
"/system/usr/su-backup",
"/data/data/com.noshufou.android.su",
"/system/app/Superuser.apk",
"/system/app/su.apk",
"/system/bin/.ext",
"/system/xbin/.ext"};
for(int i = 0; i<files.length; i++){
File file = new File(files[i]);
if(null != file && file.exists()){
ULog.d(CellphoneRoutingCheck.class.getSimpleName(),"Rooted File : " + file.getAbsolutePath() + " : " + file.getName());
return true;
}
}
return false;
}
private static boolean checkSuperUserCommand(){
try {
Runtime.getRuntime().exec("su");
ULog.d(CellphoneRoutingCheck.class.getSimpleName(), "device has super user");
return true;
} catch (Error e){
} catch (Exception e){
}
return false;
}
}
오류 내용은 다음과 같다.
Fatal Exception: java.lang.ExceptionInInitializerError
at org.jsoup.nodes.Document$OutputSettings.<init>(Document.java:372)
at org.jsoup.nodes.Document.<init>(Document.java:19)
at org.jsoup.parser.TreeBuilder.initialiseParse(TreeBuilder.java:32)
at org.jsoup.parser.TreeBuilder.parse(TreeBuilder.java:42)
at org.jsoup.parser.HtmlTreeBuilder.parse(HtmlTreeBuilder.java:56)
at org.jsoup.parser.Parser.parse(Parser.java:100)
at org.jsoup.Jsoup.parse(Jsoup.java:58)
at network.NetworkManagement$1.onResponse(NetworkManagement.java:116)
at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:68)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by java.lang.NumberFormatException: For input string: "000C6
AMP=00026
Aacute=000C1
Acirc=000C2
Agrave=000C0
Aring=000C5
Atilde=000C3
Auml=000C4
COPY=000A9
Ccedil=000C7
ETH=000D0
Eacute=000C9
Ecirc=000CA
Egrave=000C8
Euml=000CB
GT=0003E
Iacute=000CD
Icirc=000CE
Igrave=000CC
Iuml=000CF
LT=0003C
Ntilde=000D1
Oacute=000D3
Ocirc=000D4
Ograve=000D2
Oslash=000D8
Otilde=000D5
Ouml=000D6
QUOT=00022
REG=000AE
THORN=000DE
Uacute=000DA
Ucirc=000DB
Ugrave=000D9
Uuml=000DC
Yacute=000DD
aacute=000E1
acirc=000E2
acute=000B4
aelig=000E6
agrave=000E0
amp=00026
aring=000E5
atilde=000E3
auml=000E4
brvbar=000A6
ccedil=000E7
cedil=000B8
cent=000A2
copy=000A9
curren=000A4
deg=000B0
divide=000F7
eacute=000E9
ecirc=000EA
egrave=000E8
eth=000F0
euml=000EB
frac12=000BD
frac14=000BC
frac34=000BE
gt=0003E
iacute=000ED
icirc=000EE
iexcl=000A1
igrave=000EC
iquest=000BF
iuml=000EF
laquo=000AB
lt=0003C
macr=000AF
micro=000B5
middot=000B7
nbsp=000A0
not=000AC
ntilde=000F1
oacute=000F3
ocirc=000F4
ograve=000F2
ordf=000AA
ordm=000BA
oslash=000F8
otilde=000F5
ouml=000F6
para=000B6
plusmn=000B1
pound=000A3
quot=00022
raquo=000BB
reg=000AE
sect=000A7
shy=000AD
sup1=000B9
sup2=000B2
sup3=000B3
szlig=000DF
thorn=000FE
times=000D7
uacute=000FA
ucirc=000FB
ugrave=000F9
uml=000A8
uuml=000FC
yacute=000FD
yen=000A5
yuml=000FF
"
at java.lang.Integer.parseInt(Integer.java:615)
at org.jsoup.nodes.Entities.load(Entities.java:314)
at org.jsoup.nodes.Entities.access$000(Entities.java:25)
at org.jsoup.nodes.Entities$EscapeMode.<init>(Entities.java:53)
at org.jsoup.nodes.Entities$EscapeMode.<clinit>(Entities.java:38)
at org.jsoup.nodes.Document$OutputSettings.<init>(Document.java:372)
at org.jsoup.nodes.Document.<init>(Document.java:19)
at org.jsoup.parser.TreeBuilder.initialiseParse(TreeBuilder.java:32)
at org.jsoup.parser.TreeBuilder.parse(TreeBuilder.java:42)
at org.jsoup.parser.HtmlTreeBuilder.parse(HtmlTreeBuilder.java:56)
at org.jsoup.parser.Parser.parse(Parser.java:100)
at org.jsoup.Jsoup.parse(Jsoup.java:58)
at tttttttttttttt.network.NetworkManagement$1.onResponse(NetworkManagement.java:116)
at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:68)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
나와 동일한 오류가 발생한 개발자가 gitHub에 올린 글이 있지만 해결책은 없다.
github.com/wordpress-mobile/AztecEditor-Android/issues/805