日式就是在众多便利中的一点不便 -- Aleksanna

Aime - Amusement IC Card

街机卡,玩日服 maimai DX FES+ 时购入,用于保存成绩及个人设定。

I want the virtual anime babies to say welcome back not welcome
https://www.youtube.com/watch?v=eIbqhi5Ikq8

卡片长下图中的这个样子,对于支持 Aime 卡的街机游戏,第一局免费。

卡片到手后试着用 NFC Card Emulator Pro 尝试模拟,发现不支持该 NFC 类型。
进一步调查后发现了 NFC-F 标准,索尼的 FeliCa,在日本广泛使用。

FeliCa on Pixel 7 Pro

找到了此博客:Mobile FeliCa preinstalled on all Pixel 4 and later models
作者表示 Pixel 4 后的所有型号均已预装 Mobile FeliCa,但仅在日本 SKU 上才启用。

另外一篇博客:Mobile FeliCa evolution: FeliCa without the FeliCa chip
提到 Mobile FeliCa 4.0 (Pixel 4) 之后不必使用来自 FeliCa Networks 供应链的芯片。

进一步的搜索找到了下面这篇博客,作者在 eu MIUI 上移植了 JP SKU 使用 FeliCa 的能力:
【Felica 可能】Mi11Lite5G 向け MIUI13 stable(euROM)リリース インストール方法

从而找到了作者的 GitHub 主页 soralis0912,发现 TA 给许多型号都做了类似的移植。
我比较了 Pixel 7 Pro 的 JP 固件,没发现什么异常。但后续 adb 调试时发现了一些线索:

~
at xx:xx:xx fsh ❯ adb shell
cheetah:/ $ cat /product/etc/felica/common.cfg | grep Japan
00000014,content://com.google.android.pixelnfc.provider.DeviceInfoContentProvider/isJapanSku
cheetah:/ $

其中 com.google.android.pixelnfc.provider.DeviceInfoContentProvider/isJapanSku 指的应该是 com.google.android.pixelnfc app 里 DeviceInfoContentProvider 类中有一个 isJapanSku 方法。

使用 Apktool 进行 apk 拆包,使用 dex2jarjadx 来将 dex 反编译为 jar:

~/Downloads/Temp
at xx:xx:xx fsh ❯ apktool d -rs PixelNfc.apk
I: Using Apktool 2.6.1 on PixelNfc.apk
I: Copying raw resources...
I: Copying raw classes.dex file...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...

Downloads/Temp/PixelNfc
at xx:xx:xx fsh ❯ jadx PixelNfc/classes.dex
INFO  - loading ...
INFO  - processing ...
INFO  - done

看到了 isDeviceJapanSku#String 方法,在一个 SKU 列表里查参数 str 是否存在:

private boolean isDeviceJapanSku(String str) {
    ArrayList arrayList = new ArrayList();
    arrayList.add("G020N");
    arrayList.add("G020Q");
    arrayList.add("G025M");
    arrayList.add("G025H");
    arrayList.add("G5NZ6");
    arrayList.add("G4S1M");
    arrayList.add("GR1YH");
    arrayList.add("GF5KQ");
    arrayList.add("GPQ72");
    arrayList.add("GB17L");
    arrayList.add("G03Z5");
    arrayList.add("GFE4J");
    arrayList.add("G82U8");
    arrayList.add("G0B96");
    return arrayList.contains(str);
}

又看到该函数在该包里唯一调用处的代码,变量 str3ro.boot.hardware.sku 的值:

String str3 = SystemProperties.get("ro.boot.hardware.sku");
MatrixCursor matrixCursor = new MatrixCursor(new String[]{"is_japan_sku"});
matrixCursor.newRow().add(Integer.valueOf(isDeviceJapanSku(str3) ? 1 : 0));

后续在 adb shell 中 getprop ro.boot.hardware.sku 也验证了这一点:

~
at xx:xx:xx fsh ❯ adb shell
cheetah:/ $ getprop ro.boot.hardware.sku
GE2AE
cheetah:/ $

Xposed - Hook everything!

参考了上文所诉的 Magisk 模块,发现其确实设置了相关 Properties:
https://github.com/soralis0912/magisk-module-renoir-jp-felica/blob/master/system.prop

但我们都知道 JP 型号不能关闭相机快门声音(哈哈),而且 Pixel 修改此型号也较为麻烦:
https://forum.xda-developers.com/t/converting-japanese-pixel-6-to-global-version.4365275/

于是使用 Xposed(也可以使用 YukiHookAPI)写几行代码把函数改成永真:

XposedHelpers.findAndHookMethod(
    "com.google.android.pixelnfc.provider.DeviceInfoContentProvider",
    lpparam.classLoader, "isDeviceJapanSku", String::class.java,

    object : XC_MethodReplacement() {
        override fun replaceHookedMethod(param: MethodHookParam?): Any {
            return true
        }
    })

Suica

一种预付费、可充值的非接触式智能卡,作为日本火车线路票价卡使用的电子货币
该卡也越来越多地被接受为一种电子货币形式,用于在商店和售货亭购物

  1. 安装 Mobile FeliCa Client(Google Play Store 仍然不认 JP SKU,从 Apkpure 下一个就好)
  2. 使用 terminal_systemizer 将其安装进 system/priv-app 变为系统应用。
  3. 安装 モバイル Suica - いつもの Suica がスマホで便利に - app 即可。
    还需要 Osaifu-KeitaiOsaifu-Keitai Setting Application