일쿠페스는 v3.1.1 버전부터 데이터 경로 관련 C언어 코드가 변경되어서 적용 안됩니다.
아래 'v3.1.1 수정 추가 내역 (2016/01/25)'를 참고하시기 바랍니다.
SD카드 버전 스쿠페스 APK 를 자동으로 만들어주는 프로그램입니다.
항상 제가 수작업으로 만들었는데요.
제가 바쁘거나 한동안 PC에 손 댈 수 없을 때에는 하염없이 기다려야 하는 상황이 되었기 때문에,
시간 내서 만들어봤습니다.
참고로.. 퀄리티 보장 못합니다.
사실 매번 하기도 번거롭고 점점 손을 뗄까 싶었는데요.
찾는 사람도 많아서 방법을 공개할까 후계자를 둘까 고민도 했는데,
이렇게라도 만들어두는게 제일 깔끔하지 않을까 싶어서 작업했네요.
PC 버전 [다운로드]
특징
1. 사용하기 어려움.
2. JAVA라서 대부분 OS에서 사용 가능. (확인 안해봤으나 아마도...?)
3. 변환시간 빠름 (1분 이내)
사용법
1. Java가 설치된 환경의 콘솔창에서 다음과 같이 입력
java -jar SDSukufesMaker.jar 앱구분코드 원본APK경로
앱구분코드?
국가별 스쿠페스 구분 코드입니다.
J : 일본판, K : 한글판, E : 영문판, T : 대만판
실행 예
java -jar SDSukufesMaker.jar J lovelive.apk
안드로이드 버전 [다운로드]
특징
1. 사용하기 편함.
2. 밖에서 갑작스런 업데이트 소식에 당황하지 않고 바로 변환할 수 있음.
3. 변환 시간 심하게 느림. (노트3 기준 10분)
4. 저사양 기기에서는 메모리 부족으로 튕김.
사용법
1. /sdcard/SukufesApk 디렉토리에 원본APK 파일을 넣고 실행
2. APK 파일을 선택하고 변환 시작 버튼을 클릭
3. 완료될 때까지 기다림.
----------------------------------------------------------------------------------------------------------------------------
혹시나 추후 클라이언트가 변경되어 작동하지 않을 경우를 위해
직접 수정하는 방법을 알려드립니다.
안드로이드 어플 제작과 디컴파일에 익숙하신 분만 참고하시고, 질문은 받지 않습니다.
이쪽 지식이 없으신 분은 무슨 소린지 알기 힘들것이고, 공부하려고 해도 얼마나 걸릴지 모릅니다.
아무튼 그런 분들은 손대지 않는 걸 추천합니다.
1. 소스 분석
수정해야할 클래스는 klb.android.GameEngine.GameEngineActivity 입니다.
일단 PlaygroundOSS 프레임워크의 소스를 참고하시길 바랍니다. (링크)
실제 스쿠페스 소스는 여기에서 변형되었으나 크게 바뀌진 않았습니다.
- 스쿠페스 데이터 경로 지정 과정
중간의 onCreate 메소드의 178 라인을 봅니다.
if( USE_SD_CARD==true ) { if( Environment.MEDIA_MOUNTED.equals(state) ) {// SDがマウントされている // 容量チェック // 容量が十分空いている install_sd = true; if( Environment.MEDIA_MOUNTED_READ_ONLY.equals(state) ) {// マウントされているが、READ_ONLY install_sd = false; } } else { install_sd = false; } } |
USE_SD_CARD 가 true 이면서, SD카드가 삽입되어 있고, 남은 용량이 충분하고,
SD카드가 쓰기 가능일 때에 SD카드에 설치하도록 되어있습니다.
하지만 용량 확인은 안합니다. 쓰다만 코드라고 보시면 됩니다.
게다가 USE_SD_CARD가 false 로 선언되어 있기 때문에 이 부분은 사용되지 않는 코드입니다.
소스를 수정할 때 true 로 변경하면 되지만, 저는 그렇게 안했기에 다음도 확인합시다.
if( install_sd==true ) { c_path_base = this.getExternalFilesDir(null).getAbsolutePath(); if( c_path_base==null ) {// これでいけるか…? c_path_base = this.getFilesDir().getAbsolutePath(); } } else { c_path_base = this.getFilesDir().getAbsolutePath(); } |
c_path_base 변수를 지정하는 코드입니다.
c_path_base 는 스쿠페스 데이터가 존재하는 경로를 뜻합니다.
install_sd 가 true 인 경우와 아닌 경우에 따라 동작하게 되는데,
install_sd 는 false 로 선언한 뒤에 변경되지 않았기 때문에 true 가 아닌 경우의 코드만 동작합니다.
즉 208 라인을 통해 스쿠페스 데이터 경로가 결정됩니다.
- 루팅 기기 검사 과정
초반의 isSuBinaryPresent 메소드에서 검사합니다.
루팅 관련 파일이 존재하면 true를 반환합니다.
각각 경로에 su 파일이 존재하는지, /system/app/Superuser.apk 가 존재하는지 확인합니다.
2. 소스 수정
여기서 부터는 java 파일이 아닌 classes.dex 파일을 디컴파일 한 파일인 smali 파일을 수정합니다.
smali 파일은 java 파일과 달리 가독성이 현저히 떨어지기 때문에,
되도록이면 간단간단하게 수정할 수 있게 설명합니다. (실제로 제가 그렇게 수정했습니다.)
여기선 GameEngineActivity.smali 파일을 수정합니다.
- 스쿠페스 데이터 경로 SD카드 설정
onCreate 메소드를 찾아갑니다. 다음과 같이 시작하는 부분입니다.
.method protected onCreate(Landroid/os/Bundle;)V |
일단 먼저 이 메소드 초반에 추가해야할 내용이 있습니다.
처음 실행하는 유저를 위해 데이터 경로 중에 한 디렉토리를 수동으로 생성해주어야 합니다.
invoke-super 로 시작하는 라인 바로 다음에 다음 내용을 추가합니다.
new-instance v0, Ljava/io/File; const-string v1, "/sdcard/data/klb.android.lovelive/external" invoke-direct {v0, v1}, Ljava/io/File;->(Ljava/lang/String;)V invoke-virtual {v0}, Ljava/io/File;->mkdirs()Z |
두번째 줄에 새로 생성하는 디렉토리의 전체 경로가 있는데,
이는 일본판 기준이므로 클라이언트 언어에 따라 'klb.android.lovelive'는 해당 어플 패키지명으로 변경해주어야 합니다.
이제 실제 데이터 경로를 SD카드로 지정해야하는데,
java와 달리 smali는 구조파악이 힘들기 때문에,,
단순히 변수 c_path_base 에 경로를 설정하는 도중에 가로채서 SD카드의 경로를 하드코딩할겁니다.
iput-object v7, p0, Lklb/android/GameEngine/GameEngineActivity;->c_path_base:Ljava/lang/String; |
위와 이렇게 표시된 부분이 세군데 있을 겁니다.
v7은 클라이언트에 따라 예를 들어 v9가 될 수도 있고 각각 다릅니다. 검색할 때 유의하시길 바랍니다.
iget-object 로 시작하는 코드도 있는데, 그게 아니라 iput-object 를 찾아야 합니다.
v7의 값을 c_path_base 에 넣겠다는 의미입니다.
바로 윗 줄에 다음과 같은 내용을 입력합니다.
const-string v7, "/sdcard/data/klb.android.lovelive" |
v7은 방금 삽입한 내용의 바로 아래줄의 그것과 같은 번호로 해야합니다. 만약 iput-object v9,... 라고 되어있었다면 v9로 합니다.
klb.android.lovelive 부분 역시 일본판이 아니라면 클라이언트 언어에 따라 해당 어플 패키지명으로 변경합니다.
위 작업을 나머지 두군데에도 적용합니다.
- 루팅 우회
역시 smali 파일을 수정하는 중이니 가장 단순한 방법으로 합니다.
'/su' 를 검색해서 '/--s--u' 뭐 이렇게 변경합니다.
'/Superuser.apk' 를 검색해서 '/--S--uperuser.apk' 정도로 변경합니다.
여기까지 했으면 소스 수정은 끝났습니다.
다시 classes.dex 파일로 컴파일 하고, APK 파일에 삽입한 뒤에 Sign 과정을 하면 모든 작업이 끝납니다.
컴파일 할때 오류가 발생하면 smali 파일을 잘못 수정해서 소스를 해석할 수 없는 것입니다.
다시 한번 잘못 수정한 부분이 있는지 확인하고 컴파일을 하면 됩니다.
v3.1.1 수정 추가 내역 (2016/01/25)
v3.1 에서 v3.1.1 로 업데이트 되면서 C언어 코드가 변경되었습니다.
그.. 바뀐건 흔히 있던 일인데, 바뀌면서 데이터 경로를 SD카드로 변경해도 C언어 코드에서는 이전 경로를 계속 찾는 문제가 생겼습니다.
이번에 자동 변환 프로그램을 통해 아무리 Java 코드에서 데이터 경로를 바꿔도 오류가 뜨면서 실행이 안되는게 이 문제 때문입니다.
아무래도 데이터 경로가 하드코딩이 되어있는 것 같은데, 안타깝게도 C언어 코드는 제가 수정할 수 없습니다.
이전 버전인 v3.1의 C언어 코드를 그대로 삽입하고 새롭게 생긴 C언어 코드를 호출하는 부분을 막았더니 실행은 됩니다.
그래도 이대로는 문제가 발생할 수도 있으니 해결됐다고 보긴 어렵습니다.
기기 문제로 SD카드버전 밖에 할 수 없는 분만 적용해보시고, 왠만해선 오리지널 APK를 이용하시길 바랍니다.
알려진 문제
1. 스쿠페스가 켜진 상태로 화면을 끄면 백화현상 (스쿠페스를 내렸다가 화면을 끄면 괜찮음)
적용 방법
1. lib 디렉토리를 v3.1 버전 파일로 전부 교체
2. 위의 수정 내역을 그대로 적용
3. 소스 추가 수정
새롭게 추가된 JNI 메소드(setLoadAppPath(String))의 정의 및 호출 코드를 삭제
- GameEngineActivity.smali 에서 다음 항목 삭제
invoke-virtual {v7, v8}, Lklb/android/GameEngine/PFInterface;->setLoadAppPath(Ljava/lang/String;)V
- PFInterface.smali 에서 다음 항목 삭제
.method public native setLoadAppPath(Ljava/lang/String;)V
.end method
(IP보기클릭).***.***
(IP보기클릭).***.***
(IP보기클릭).***.***
(IP보기클릭).***.***
(IP보기클릭).***.***