SO-01D その5

zpakの解析

■ metadata.xml
当たり前の差分

■ manual
当たり前の差分

■ data
- image.ps
 rom image
 当たり前の差分
- ps1_rom.bin
 これ、biosのはずなんだけど差分が出てしまっている。
 いやぁ、なんか香ばしいな。

雑感として、なんちゅうか構造も然ることながら、全体的に混沌としています。
被ったリソースが幾重にも出現してくると反吐が出ますね。

FPseで遊ぶ方がよほど効率的だと思うのですが、ある意味、こちらも面白い。
面白いついでに、psxperiaでも読み解こうかなと思います。

boot log

10-14 07:02:42.375: I/ActivityManager(235): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.sony.playstation.NCJA10031_1/com.sony.android.psone.BootActivity bnds=[238,273][351,431] } from pid 345
10-14 07:02:42.435: I/ActivityManager(235): Start proc com.sony.playstation.NCJA10031_1 for activity com.sony.playstation.NCJA10031_1/com.sony.android.psone.BootActivity: pid=1327 uid=10088 gids={3003, 1015}
10-14 07:02:42.495: I/WindowManager(235): Setting rotation to 1, animFlags=1
10-14 07:02:42.515: I/ActivityManager(235): Config changed: { scale=1.0 imsi=0/0 loc=ja_JP touch=3 keys=1/1/2 nav=2/2 orien=2 layout=34 uiMode=17 theme=ComponentInfo{com.sonyericsson.defaultruntimethemes/com.sonyericsson.defaultruntimethemes.BlueThemeService} seq=4}
10-14 07:02:42.685: D/dalvikvm(1327): Trying to load lib /data/data/com.sony.playstation.NCJA10031_1/lib/libzplatform.so 0x2afc6fd8
10-14 07:02:42.755: D/dalvikvm(1327): Added shared lib /data/data/com.sony.playstation.NCJA10031_1/lib/libzplatform.so 0x2afc6fd8
10-14 07:02:42.755: D/dalvikvm(1327): No JNI_OnLoad found in /data/data/com.sony.playstation.NCJA10031_1/lib/libzplatform.so 0x2afc6fd8, skipping init
10-14 07:02:42.765: D/dalvikvm(1327): Trying to load lib /data/data/com.sony.playstation.NCJA10031_1/lib/libjava-activity.so 0x2afc6fd8
10-14 07:02:42.895: D/dalvikvm(1327): Added shared lib /data/data/com.sony.playstation.NCJA10031_1/lib/libjava-activity.so 0x2afc6fd8
10-14 07:02:42.915: E/Source/WhiteBox/TfitProtectedTransform.cpp(1327): TFIT_Engine_CreateTransform 7ED25480 2127713608 2CBFFC74 7ED25340
10-14 07:02:42.965: I/ActivityManager(235): Start proc com.sonyericsson.android.preinstalledservice for service com.sonyericsson.android.preinstalledservice/.PreinstalledLicensingService: pid=1335 uid=10131 gids={}
10-14 07:02:43.025: I/ActivityManager(235): Displayed com.sony.playstation.NCJA10031_1/com.sony.android.psone.BootActivity: +589ms
10-14 07:02:43.105: D/dalvikvm(1335): Trying to load lib /data/data/com.sonyericsson.android.preinstalledservice/lib/librsasigner.so 0x2afc6970
10-14 07:02:43.115: D/dalvikvm(1335): Added shared lib /data/data/com.sonyericsson.android.preinstalledservice/lib/librsasigner.so 0x2afc6970
10-14 07:02:43.115: I/native rsasigner(1335):  JNI_OnLoad!
10-14 07:02:43.115: I/native rsasigner(1335):  clazz is NOT NULL
10-14 07:02:43.195: W/IInputConnectionWrapper(345): showStatusIcon on inactive InputConnection
10-14 07:02:43.225: I/ActivityManager(235): Start proc com.sonyericsson.semcsuite for broadcast com.sonyericsson.semcsuite/.ui.PackageIntentReceiver: pid=1342 uid=1000 gids={3002, 3001, 3003, 1007, 1015}
10-14 07:02:43.225: I/ActivityManager(235): No longer want com.sonyericsson.androidapp.fbmusiclike (pid 1174): hidden #16
10-14 07:02:43.315: I/ActivityThread(1342): Pub com.sonyericsson.semcsuite.search.SuggestionProvider: com.sonyericsson.semcsuite.search.SearchSuggestion
10-14 07:02:43.315: I/ActivityThread(1342): Pub com.sonyericsson.semcsuite.data.GameContentProvider: com.sonyericsson.semcsuite.data.GameContentProvider
10-14 07:02:43.335: I/com.sonyericsson.semcsuite.data.PreferenceHandler(1342): DebugMode: false
10-14 07:02:43.335: I/com.sonyericsson.semcsuite.data.PreferenceHandler(1342): LaunchMode: 0
10-14 07:02:43.335: I/com.sonyericsson.semcsuite.data.PreferenceHandler(1342): PSNMode: 0
10-14 07:02:43.415: V/Z-System(1327): Application loaded: 
10-14 07:02:43.425: D/ContentUtil(1342): Adding content: com.gameloft.android.GAND.GloftAsp6.asphalt6
10-14 07:02:43.445: W/dalvikvm(1327): dvmFindClassByName rejecting 'com/sonyericsson/zsystem/jni/ZJavaActivityInput'
10-14 07:02:43.455: W/dalvikvm(1327): dvmFindClassByName rejecting 'com/sonyericsson/zsystem/jni/ZJavaActivitySensor'
10-14 07:02:43.465: W/KeyCharacterMap(1327): No keyboard for id 0
10-14 07:02:43.465: W/KeyCharacterMap(1327): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
10-14 07:02:43.465: W/KeyCharacterMap(1327): No keyboard for id 65539
10-14 07:02:43.465: W/KeyCharacterMap(1327): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
10-14 07:02:43.465: W/KeyCharacterMap(1327): Can't open keycharmap file
10-14 07:02:43.465: W/KeyCharacterMap(1327): Error loading keycharmap file '/system/usr/keychars/msm_pmic_pwr_key.kcm.bin'. hw.keyboards.65540.devname='msm_pmic_pwr_key'
10-14 07:02:43.465: W/KeyCharacterMap(1327): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
10-14 07:02:43.465: W/KeyCharacterMap(1327): No keyboard for id 65541
10-14 07:02:43.465: W/KeyCharacterMap(1327): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
10-14 07:02:43.465: W/KeyCharacterMap(1327): Can't open keycharmap file
10-14 07:02:43.465: W/KeyCharacterMap(1327): Error loading keycharmap file '/system/usr/keychars/atdaemon.kcm.bin'. hw.keyboards.65542.devname='atdaemon'
10-14 07:02:43.465: W/KeyCharacterMap(1327): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
10-14 07:02:43.465: W/KeyCharacterMap(1327): Can't open keycharmap file
10-14 07:02:43.465: W/KeyCharacterMap(1327): Error loading keycharmap file '/system/usr/keychars/simple_remote.kcm.bin'. hw.keyboards.196609.devname='simple_remote'
10-14 07:02:43.465: W/KeyCharacterMap(1327): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
10-14 07:02:43.465: I/Z-System input(1327):  O button is mapped with DPAD_CENTER! X and O are swapped!
10-14 07:02:43.495: D/ContentUtil(1342): Adding content: com.digitallegends.brucelee
10-14 07:02:43.525: D/ContentUtil(1342): Adding content: com.gameloft.android.GAND.GloftStsq.ML
10-14 07:02:43.555: I/PackageIntentReceiver(1342): Package com.sony.playstation.NCJA10031_1 Launched
10-14 07:02:43.555: I/ActivityManager(235): Start proc com.playstation.pssuite for broadcast com.playstation.pssuite/.ui.PackageIntentReceiver: pid=1351 uid=10073 gids={3003}
10-14 07:02:43.555: I/ActivityManager(235): No longer want com.google.android.apps.uploader (pid 1187): hidden #16
10-14 07:02:43.615: E/AudioPolicyManagerBase(143): unknown stream type
10-14 07:02:43.615: E/AudioPolicyManagerBase(143): unknown stream type
10-14 07:02:43.615: E/AudioPolicyManagerBase(143): unknown stream type
10-14 07:02:43.615: E/AudioPolicyManagerBase(143): unknown stream type
10-14 07:02:43.625: I/AudioHardwareMSM7X30(143): Routing audio to Speakerphone
10-14 07:02:43.625: I/AudioHardwareMSM7X30(143): Change routing audio to speaker for xLOUD
10-14 07:02:43.635: I/ActivityThread(1351): Pub com.playstation.pssuite.data.GameContentProvider: com.playstation.pssuite.data.GameContentProvider
10-14 07:02:43.645: D/AudioHardwareMSM7X30(143): value of device and enable is 32 1
10-14 07:02:43.655: D/kernel(122): [  277.195556] [msm7x30.c:msm_device_put] device xloud_speaker_stereo_rx set 1
10-14 07:02:43.655: D/kernel(122): [  277.195556] [msm7x30.c:msm_device_put] device freq =48000
10-14 07:02:43.655: D/kernel(122): [  277.198425] [adsp.c:msm_adsp_get] module AFETASK has been registered
10-14 07:02:43.655: D/kernel(122): [  277.198455] [adsp.c:msm_adsp_enable] enable 'AFETASK'state[0] id[17227119]
10-14 07:02:43.665: D/kernel(122): [  277.206481] [adsp.c:adsp_rtos_mtoa_cb] rpc event=0, proc_id=2, module=17227119, image=0
10-14 07:02:43.665: D/kernel(122): [  277.206481] [adsp.c:adsp_rtos_mtoa_cb] module AFETASK: READY
10-14 07:02:43.665: I/com.playstation.pssuite.data.PreferenceHandler(1351): DebugMode: false
10-14 07:02:43.665: I/com.playstation.pssuite.data.PreferenceHandler(1351): LaunchMode: 0
10-14 07:02:43.665: I/com.playstation.pssuite.data.PreferenceHandler(1351): PSNMode: 0
10-14 07:02:43.715: D/kernel(122): [  277.252899] msm_snddev_poweramp_on: power on amplifier
10-14 07:02:43.715: D/kernel(122): [  277.252960] [adsp.c:msm_adsp_get] module AUDPPTASK has been registered
10-14 07:02:43.715: D/kernel(122): [  277.252990] [adsp.c:msm_adsp_enable] enable 'AUDPPTASK'state[0] id[17227122]
10-14 07:02:43.715: D/kernel(122): [  277.256134] [adsp.c:adsp_rtos_mtoa_cb] rpc event=0, proc_id=2, module=17227122, image=0
10-14 07:02:43.715: D/kernel(122): [  277.256164] [adsp.c:adsp_rtos_mtoa_cb] module AUDPPTASK: READY
10-14 07:02:43.715: D/kernel(122): [  277.260314] [audpp.c:audpp_dsp_event] ENABLE
10-14 07:02:43.725: D/kernel(122): [  277.264648] [adsp.c:msm_adsp_write] AUDPPTASK command took 69 attempts: rc 0
10-14 07:02:43.935: I/PackageIntentReceiver(1351): Package com.sony.playstation.NCJA10031_1 Launched
10-14 07:02:43.985: W/dalvikvm(1327): dvmFindClassByName rejecting 'com/sonyericsson/zsystem/jni/ZJavaActivityGFX'
10-14 07:02:43.985: I/Z-System gfx(1327): eglInitialize() - Getting display
10-14 07:02:43.985: D/libEGL(1327): loaded /system/lib/egl/libGLES_android.so
10-14 07:02:43.995: D/libEGL(1327): loaded /system/lib/egl/libEGL_adreno200.so
10-14 07:02:43.995: D/libEGL(1327): loaded /system/lib/egl/libGLESv1_CM_adreno200.so
10-14 07:02:43.995: D/libEGL(1327): loaded /system/lib/egl/libGLESv2_adreno200.so
10-14 07:02:44.005: I/Z-System gfx(1327): eglInitialize() - disp =com.google.android.gles_jni.EGLDisplayImpl@2b000590
10-14 07:02:44.005: I/Z-System gfx(1327): eglInitialize() - Initializing EGL
10-14 07:02:44.005: I/Z-System gfx(1327): eglInitialize() - Major=1 Minor=0
10-14 07:02:44.005: I/Z-System gfx(1327): eglInitialize() - Getting config
10-14 07:02:44.005: I/Z-System gfx(1327): eglInitialize() - Choosing config
10-14 07:02:44.005: I/Z-System gfx(1327): eglInitialize() - config[0] = 5650 D:16 AF:16 AMS:0 SS:0 MSAA:0:0 BS:16 L:0 ST:1415
10-14 07:02:44.005: I/Z-System gfx(1327): eglInitialize() - MatchingConfigs=12
10-14 07:02:44.005: I/Z-System gfx(1327): eglInitialize() - Creating display surface. NativeWindow=android.view.SurfaceView$3@2afd4bf0
10-14 07:02:44.015: I/Z-System gfx(1327): eglInitialize() - Creating context
10-14 07:02:44.015: I/Z-System gfx(1327): eglInitialize() - Making context the current one
10-14 07:03:14.195: D/kernel(122): [  307.732604] max17040 0-0036: batt: 82%, 4048 mV

SO-01D その4

apkの解析

■ AndroidManifest.xml

バンディクとみんごるの差分では、

<manifest package="com.sony.playstation.NCJA10031_1"
<manifest package="com.sony.playstation.NCJA10093_1"

これくらい。

■ パッケージ名

んで、まぁ、パッケージは被らなければ良いので良いのですけど、命名規則とか気になる。

http://forum.xda-developers.com/showpost.php?p=16520496

上記を読むと、ロケールに依存してバンディクパッケはこんな違いがあるらしい。

usa, r800x: com.sony.playstation.ncua94900_1.apk
europe, r800i: com.sony.playstation.ncea00344_1.apk

NC{ロケール文字}A{5桁}_1

クラッシュバンディクのプロダクトID

日本版はSCPS-10031
米版はSCUS-94900
欧版はSCES-00344

http://www.gamefaqs.com/ps/196986-crash-bandicoot/data

なるほどー

NC{ロケール文字}A{プロダクトID下5桁}_1

という規則ですね。

日本版でも、SCPSやSLPSがあるので、下5桁では被るものがあるかもしれませんが、気にするレベルではないですね。

ちゅう訳で、日本版で変換する場合は、

NCJA{プロダクトID下5桁}_1

というフォーマットで良いということ。

■ assets
- AndroidManifest.xml
- {package}_1.zpak

マニフェストはルートのものと同一。
zpakは、例えば、NCJA10031_1ならば、NCJA10031_1_1.zpakとなる。

zpakの中身は、
- metadata.xml
- assets
  - *.dds
  - editmaps
  - default
    - bitmaps
      - icon.png
- data
  - params.bin
など、わらわらとありますが、metadata.xmlにはゲーム名称やレーティングなど固有情報を埋める必要あり。icon.pngは勿論固有。ddsやparams.binは差分がないので流用可能です。

■ lib
- armeabi
 - libjava-activity.so
 - libzplatform.so

これは恐らくjniアクセスするpsoneネイティブエミュレータなんだろうけど、バンディクとみんごるで差分が出てしまっている。
このエミュで、rtypesは動作していたので問題はないと思うけど、psxperiaで色々と補正をしている節があるので要注意。

■ res
- drawable
 - icon.png 
- values
 - strings.xml
当たり前の差分ちゅうことで。

以上。

SO-01D その3

構想メモ

  1. [抽出]既存のapk(バンディクかみんごる)からpsone emulator(so含む)およびbiosを引っこ抜く機能(初回)
  2. [変換]付与されたパラメタおよびiconなどのリソースからapkを作成する機能
  3. [変換]psonegame imageを圧縮してbiosと各種パラメタを付与してzpakを作成する機能
  4. [転送]zpakを転送する機能
  5. [転送]adb使ってapkをインストールする機能

TODO
  1. apkパッケージ構造解析
  2. apkパラメタ解析
  3. zpakパッケージ構造解析
  4. zpakパラメタ解析
理想
  1. リップ機能も付与
SO-01Dを接続し、タイトルとアイコンだけ設定したら、CDがちゃんこしてスタートすると、リップ->ID生成->apk/zpak生成->転送/インストールまで終える感じ。
そういや、IDがpspの時と違って、SLPSとかああいうのでは無いんだよな。いまいちルールを把握していない。和のバンディクだと"NCJA10031_1"こんなの。

SO-01D その2

いきなり道を外れてしまいますが、自炊プレイの検証。

手順

  1. プレイしたいps1 discをリップ
  2. psxperiaで変換(色々と長いので割愛)
  3. 作成されたapkとzpakをsdへ複写
  4. apkをインストール

雑感

  • ゲーム単体を一つのアプリとしてカテゴライズする方式みたい
  • apkインストールのワンクッションが怠い
  • psxperiaは海外の方が作成し、グロのSO-01Dをベースにしているため、psxperiaの改修が必要。
  • psxperiaはオープン
  • javaで開発されている。guiはswingを使用。


とりあえず、細かいことは置いておき、動作確認。



何か特別というか、ちょっとした時(売女が割れた時とか)に変換しようと温めておいたRTYPESちゃんです。素晴らしき100円プライシング。


おぉ?


拍子抜けなくらい、正常に動作しています。

という訳で、root奪取しないと、バンディクのapkを確保出来ないので一度は必要ですね。

SO-01Dはちょっと薄いので、アクションやシューティングは微妙かもな。
フィット感では、PSPの方がやはりゲーミング特化しているので良いです。

興味が湧いてきたので、apk/zpakの配置、インストールも自動化するよう作ってみよう。

SO-01D その1

SO-01D祭りに参加し無事に獲得。

PS1愛好者であれば、PSPストックでSO-01Dは不要と思われるのですが、
一番の魅力は、物理ゲームパッド。
巷にある、青歯によるパッドアタッチメントと言う選択肢もありますが、なかなかの価格です。
何気に今回のSO-01D購入金額に相当したり。
おまけに、パッドって良し悪しがあって、ハズレ引いた日には凹むこと請け合い。

PlayStation Certifiedな端末が欲しかったというのも購入を後押し。

とりあえずデフォルトを舐めてみます。





PlayStation Pocket発見。


惚れ惚れするくらいに糞アプリ満載です。
キャリアコンテンツなんて、誰が欲しがるのでしょうかね。
キャリアの横暴ですよ。
キャリアは大人しく安定したインフラだけ提供していれば良いと思いますよ。



RAMが死活問題ちゅうことです。

サービスモード:*#*#7378423#*#*



さて、舐め回したので、デフォルトでのフルバックアップに入ります。


  1. root奪取
  2. cwmインストール
  3. reboot
  4. /dev/input/event1(VolDown)押下
  5. cwm起動
  6. backup
  7. sdのbackupセットを母艦へcopy
次回は、psxperia使ってimage作成/起動まで(要は自炊)。

https://github.com/yifanlu/PSXperia/wiki/Compatibility

なんだか、上記動作リストを眺めていると、pspocketは相当やっかいな代物っぽいですね。
popsの例があるので、泥向け謹製エミュは掛けている工数も凄いから精度も高いと踏んでいたのですが。
苦労するなら、有志開発の泥向けpsemuを活用させてもらった方が良いかも。

言われてみると、

http://www.jp.playstation.com/info/release/nr_20111208_pssuite_xperia.html

結局、これらしかテストしていないのかもな。
売女も当初は、旧suiteのしか遊べなかったんだけど、pops突っ込んだのか、後に対応され。
もはや、旧suiteのps1群は、これ以降増殖したのような記憶もないので、無かったことにされているのかな?