Tab S6를 산 가장 큰 이유중 하나가 삼성 갤럭시 전용 데스크톱 모드인 Dex 위에서 리눅스를 돌릴 수 있는 기능인 Linux On Dex를 사용하기 위해서였다.

하지만, Tab S6와 Note 10 시리즈는 아직 지원이 안되며, 마지막 업데이트가 4월인 걸로 봐선… 아무래도 지원을 그만하려는 느낌인 것 같다… Dex도 결국 안드로이드 10에서 데스크톱 모드가 지원되니까 왠만한 혁신이 없는 이상 사라질 것 같기도 하다…

일단 너무 쓰고싶어서 어떻게든 한 번 해보려고 한다. 결국엔 못할 것 같지만, 실패도 경험이라 생각하며 해보려고 한다.

Linux On Dex Term Of Use 8.2 그리고 10.2 위반입니다만… 일단 한 번만 뜯어보겠습니다.

삼성맨 형님들 정말 죄송합니다 ㅠㅠ 내려달라면 내려드리겠습니다.

물론 보실일도 없겠지만.. 혹시 보신다면 메일 주세요.

Linux On Dex apk를 찾자

이건 고민할 필요도 없이 apkmirror.com 에서 다운 받으면 끝.

APK를 까자

apk를 까는 방법은 여러가지 있는데 내가 본 봐로는 apktool 이라는 프로그램을 써서 뜯는 방법이 있다. 간결하게 뽑아낼 수 있어서 참 좋은 것 같다.

apktool -r -f lod.apk

파일을 까보니 smali 형식의 파일들이 뽑혀나오는데, 이거 보니까 Dex(Samsung Dex 아님 ㅎ) 바이너리를 사람이 어느정도 읽을만 하게 보여주는 파일 형식이라고 한다.

그냥 지원되는게 TABS5였길레 TABS5 라고 검색했는데 바로 떳다… 역시 난 천재인듯 하다.

저쪽에 보면 :cond_2 라고 되어있는게 위에 코드들과 함께 보니까 switch 문이나 if문으로 타고 내려오는 것 같은데, 저 부분을 else문에 대입하면 안되는 기기들도 뚫고 들어올 수 있을 것 같아서, 한 번 복붙해보았다.

cond_7이 마지막이니까 else 일 수 있을 것 같아서 옮겨보았다.

:cond_7
    const-string p0, "TABS5"

    return-object p0

근데 이걸 하는 도중에 인터넷 글을 보니까 JAVA파일로도 뽑히던데, 이걸 어떻게 하나 몇개 봤는데 가장 편한건 그냥 인터넷에서 디컴파일 해오는 것이다… 세상 참 좋은 것 같다. 인터넷에서 코딩도해 디컴파일도해 못하는게 없는 것 같다. ㄷㄷ

https://www.apkdecompilers.com/ 여기서 디컴파일 해서 뽑아 갖고왔다. 이제 소스를 대조해서 눈대중으로 수정할 수 있는 환경이 갖춰졌다.

위의 작업을 완료하고 내가 마주한 부분은 아래와 같다.

이 부분도 어떻게든 건너뛸 수 있을 것 같다. 검색을 해보니 JAVA와 SMALI에서는 아래의 부분이 떳다.

JAVA

else if (!o.o()) {
            l.a("017", String.valueOf(1701));
            Log.e(b, "non SupportedBinary: ");
            a.a().a((a) this).a((int) R.string.update_your_software_title).b((int) R.string.update_your_software_body).c((int) R.string.ok).a((OnClickListener) new OnClickListener() {
                public void onClick(DialogInterface dialogInterface, int i) {
                    Log.e(EntryActivity.b, "onClick SupportedBinary: ");
                    o.r();
                }
            }).a(false).e();
        }

SMALI

 const-string p1, "017"

    const/16 v2, 0x6a5

    .line 74
    invoke-static {v2}, Ljava/lang/String;->valueOf(I)Ljava/lang/String;

    move-result-object v2

    .line 73
    invoke-static {p1, v2}, Lcom/samsung/android/lxd/a/l;->a(Ljava/lang/String;Ljava/lang/String;)V

    .line 76
    sget-object p1, Lcom/samsung/android/lxd/EntryActivity;->b:Ljava/lang/String;

    const-string v2, "non SupportedBinary: "

    invoke-static {p1, v2}, Lcom/samsung/android/lxd/processor/utils/log/Log;->e(Ljava/lang/String;Ljava/lang/String;)V

    .line 77
    invoke-static {}, Lcom/samsung/android/lxd/fragment/a;->a()Lcom/samsung/android/lxd/fragment/a;

    move-result-object p1

    .line 79
    invoke-virtual {p1, p0}, Lcom/samsung/android/lxd/fragment/a;->a(Lcom/samsung/android/lxd/a;)Lcom/samsung/android/lxd/fragment/a;

    move-result-object p1

    const v2, 0x7f0e0139

    .line 80
    invoke-virtual {p1, v2}, Lcom/samsung/android/lxd/fragment/a;->a(I)Lcom/samsung/android/lxd/fragment/a;

    move-result-object p1

    const v2, 0x7f0e0138

    .line 81
    invoke-virtual {p1, v2}, Lcom/samsung/android/lxd/fragment/a;->b(I)Lcom/samsung/android/lxd/fragment/a;

    move-result-object p1

    .line 82
    invoke-virtual {p1, v1}, Lcom/samsung/android/lxd/fragment/a;->c(I)Lcom/samsung/android/lxd/fragment/a;

    move-result-object p1

    new-instance v1, Lcom/samsung/android/lxd/EntryActivity$5;

    invoke-direct {v1, p0}, Lcom/samsung/android/lxd/EntryActivity$5;-><init>(Lcom/samsung/android/lxd/EntryActivity;)V

    .line 83
    invoke-virtual {p1, v1}, Lcom/samsung/android/lxd/fragment/a;->a(Landroid/content/DialogInterface$OnClickListener;)Lcom/samsung/android/lxd/fragment/a;

    move-result-object p0

    .line 90
    invoke-virtual {p0, v0}, Lcom/samsung/android/lxd/fragment/a;->a(Z)Lcom/samsung/android/lxd/fragment/a;

    move-result-object p0

    .line 91
    invoke-virtual {p0}, Lcom/samsung/android/lxd/fragment/a;->e()Lcom/samsung/android/lxd/fragment/a;

    return-void

역시 else 부분을 보니 S() 함수로 그냥 바로 보내버리는 거 보니까 저게 PASS 될 경우 본방으로 진입하는 것 같다 이 부분도 바꿔버리자.

end method가 함수 끝을 설명하는 부분인 것 같으니까 위에꺼 2줄 배끼면 될 것같다.

잘 박아넣고 다시 컴파일을 해주자.

apktool -r -f b lod -o lod.apk (lod_Modified.apk 로 바꿈 ㅎ)

암튼 이렇게 컴파일하면 apk가 뽑혀 나올텐데 이제 이걸 갤탭에 넣고 깔면! apk에 cert나 시그니처가 없어서 깔리지가 않는다.

마켓에서 apk-signer 깔고 앱을 넣으면, 알아서 시그니처랑 키를 넣어서 패키징을 해주는 것 같다.

자 이제 진짜 깔고 해보면!

오!!!! 되는건가!?@:!$?!

는 어림도 없지! 바로 팅겨버린다.

이 이후는 에뮬레이터를 돌려서 로그를 뽑아 보면서 봐야할 것 같다.

Android Studio 깔고 시간날 때 다시 해봐야겠다.

아 근데 TOU 위반인 걸 알고하니까 왤케 가슴 한켠이 묵직하냐…. 삼성맨 형님들 한 번만 봐주세요…ㅠ