iFIT's fork of gurecn/YuyanIme, the Rime-based
Chinese input method (keyboard) shipped on iFIT China consoles. For the upstream project's
feature list and design notes, see the original repository.
iFIT ships the offline release APK: com.yuyan.pinyin.offline.release.
CLAUDE.mdis the canonical build & release runbook (and the reference for AI agents). The steps below are the same process for humans; if the two ever differ,CLAUDE.mdwins.
- Modules:
app(the IME app) +yuyansdk(the IME engine, a git submodule →ifit/yuyansdk). - Package:
com.yuyan.pinyin.<flavor>.release. Flavors:online,offline. iFIT shipsoffline. - Default branch:
main. No CI — this is a manual local Gradle build. - Version is auto-derived from build time in GMT+8:
versionName = yyyyMMdd.HH,versionCode = yyyyMMddHH(seeapp/build.gradle).
- JDK 17. Building with JDK 21 fails with
Inconsistent JVM-target compatibilityonkspOnlineReleaseKotlin. If your default JDK is not 17, point Gradle at a JDK 17 by adding this togradle.properties(do not commit the line):org.gradle.java.home=/opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk/Contents/Home - Android SDK installed; create
local.propertieswithsdk.dir=/path/to/Android/sdk.
git clone --recurse-submodules git@github.com:ifit/YuyanIme.git
# or, in an existing clone:
git submodule update --init --recursiveThe signing keystore and its properties file live in 1Password → Valinor Vault. There is
no op automation — download both items manually.
- From the Valinor Vault, download the Yuyan keystore file and the
yuyanime.propertiesfile. - Place the keystore somewhere stable, e.g.
~/.gradle/yuyanime_keystore. - Put the properties at
~/.gradle/yuyanime.properties(the pathapp/build.gradlereads). Setyuyanime_app_keystore_fileto the absolute path of the keystore:yuyanime_app_keystore_file=/Users/<you>/.gradle/yuyanime_keystore yuyanime_app_keystore_password=<from 1Password> yuyanime_app_keystore_key_alias=ifit_yuyanime yuyanime_app_keystore_key_password=<from 1Password>
Never commit the keystore or properties.
*.jks,yuyanime_keystore, andlocal.propertiesare gitignored — keep credentials out of the repo. - (Optional) confirm the keystore opens — expect a
PrivateKeyEntrywith an O=iFIT cert:keytool -list -keystore ~/.gradle/yuyanime_keystore -alias ifit_yuyanime
./gradlew :app:assembleOfflineReleaseGotcha:
build.gradlelists the Aliyun maven mirror first. It throws intermittent502 Bad Gatewayerrors that disable the repo for the rest of the build. If you hit a dependency-resolution failure mentioningmaven.aliyun.com, just re-run — it's transient.
Output: app/build/outputs/apk/offline/release/yuyanIme_<versionCode>_offline_release.apk
# signature — expect v1 + v2 = true
$ANDROID_HOME/build-tools/<latest>/apksigner verify --verbose <apk>
# package + version
$ANDROID_HOME/build-tools/<latest>/aapt2 dump badging <apk> | grep -E "^package:"Admin/CDN require the filename format com.xx.xxx-versionname.versioncode.apk:
cp app/build/outputs/apk/offline/release/yuyanIme_<versionCode>_offline_release.apk \
com.yuyan.pinyin.offline.release-<versionName>.<versionCode>.apk
# e.g. com.yuyan.pinyin.offline.release-20260701.05.2026070105.apkPer the WOLF doc "How To Update 3rd Party Apps":
- Log into the Admin Portal →
Wolf Updates→App Updates. - Click
Create(top right). - On the
Upload Filetab, upload the renamed APK (filename must becom.yuyan.pinyin.offline.release-<versionName>.<versionCode>.apk). - On the
Generaltab, fill in the app info — the FQN and versionCode must match the uploaded APK — thenSave.
The APK must also be uploaded to the China CDN, served at
https://ifit-wolf.svc.ifit.cn/android/builds/public/. Steps 1–7 follow the VC1 doc
"Pulling Customer Logs from China S3":
- Get the necessary AWS permissions from Platform.
- Do not be on the VPN.
- Visit https://ifitsso.awsapps.com/start/#/?tab=applications
- Click AWS China SSO Portal.
- Click gateway-cn-production to expand.
- Click the
ifit-mobile-team-role-productionurl. - Find the S3 service and click into it.
- Click into the
ifit-china-proxy-svc-production-ifit-wolfbucket. - Click into
android→builds→public. - Click Upload and upload the renamed APK.
Built on gurecn/YuyanIme and the
RIME engine.