The MyPeugeot companion app (static inventory)¶
What the phone-side MyPeugeot app (APKPure XAPK, version 1.55.1) contains at the archive level, and which SMEG+ research tracks it could inform once decompiled. No behaviour is claimed here: every entry below is either read from archive metadata or an inference from entry names, and the page says which.
The package¶
| fact | value | tier |
|---|---|---|
| package | com.psa.mym.mypeugeot |
read — XAPK manifest.json |
| version | 1.55.1 (versionCode 2656) |
read — XAPK manifest.json |
| SDK range | min 28, target 35 |
read — XAPK manifest.json |
| distribution | APKPure XAPK v2, 94,538,026 bytes | read — local file metadata |
| splits | config.arm64_v8a, config.mdpi |
read — XAPK manifest.json |
XAPK members (all sizes read from the local file's zip central directory):
| member | bytes |
|---|---|
com.psa.mym.mypeugeot.apk (base) |
87,680,440 |
config.arm64_v8a.apk |
5,014,104 |
config.mdpi.apk |
1,805,569 |
icon.png |
31,420 |
manifest.json |
5,849 |
The base APK holds 4,599 entries: 19 DEX files (classes.dex plus classes2–classes19,
largest classes7.dex at ~11.7 MB), 3,590 res/ entries, 696 com/ entries and 42
assets/ entries. There is no lib/ in the base APK; the native libraries ship in the
arm64_v8a split (libbarhopper_v3.so, libimage_processing_util_jni.so,
libsurface_util_jni.so — barcode-scanner dependencies, not car code). Signing follows
the v2/v3 scheme (no META-INF/*.RSA files; stamp-cert-sha256 present, binary, not
reproduced here).
Phone-side permissions relevant to the car (read from manifest.json, not observed in
use): BLUETOOTH, BLUETOOTH_ADMIN, BLUETOOTH_CONNECT, BLUETOOTH_SCAN,
BLUETOOTH_ADVERTISE, coarse and fine location, NFC, CAMERA, plus the app-defined
com.psa.mym.mypeugeot.permission.IMPORT_TRIPS and EXPORT_TRIPS. There is no USB
accessory permission in the manifest list.
Entry-name triage (inference only)¶
Counts of base-APK entry names matching substrings. These locate where to look with a decompiler; they do not establish behaviour:
| area | matches | SMEG+ track it could inform |
|---|---|---|
ble |
1,724 | Bluetooth LE / connected services |
trip |
91 | trip import/export permissions above |
map |
47 | Cartography |
poi |
46 | user-POI import (record layout unknown) |
navig |
36 | navigation / routing to the head unit |
bluetooth |
28 | pairing, phone-side call audio |
vehicle |
26 | VIN / vehicle state |
pan / tether |
21 / 0 | Bluetooth PAN tethering + onboard browser |
mqtt |
19 | connected-services transport |
vin |
12 | vehicle identity |
usb / accessory |
0 / 4 | no USB-accessory manifest permission; 4 accessory-named entries to inspect |
Notable assets/ entries (names read, contents not inspected): per-brand env*/apps.json
and configuration.json files (envAmi20, envKx, envLinkAndDrive, envRockse,
envSmartCar, envTopolino), mediaSource*.json, stations.json, program_names.json
and localizable.json (~7.1 MB). Whether any of these mirror head-unit concepts (media
sources, station lists) is not known until the code that reads them is decompiled.
What this does not say¶
- No API endpoint, hostname, credential, token, certificate or key material is claimed or reproduced here.
- The phone app talks to Stellantis servers and to the car over Bluetooth; nothing here says which of the below code paths touch the SMEG+ generation specifically (2012–2017 Magneti Marelli units) as opposed to newer head units. The app targets current vehicles — treat every lead below as a phone-side pattern to check against SMEG+, not as a SMEG+ behaviour.
Decompiled with JADX (read tier)¶
Engine: jadx-headless-mcp 0.7.1 (audited artifact SHA-256
6e5eacf500b64292bfb73c49797c1958f6ee44646e43e868039ae7feb573ff75,
source revision 5844800a), run on Temurin JDK 21.0.13 (jdk.compiler present),
via inspect_android_package → search_android_classes → inspect_android_class →
inspect_android_method → trace_android_references. Package identity confirmed from
the decoded manifest: com.psa.mym.mypeugeot, 1.55.1 (2656), minSdk 28, targetSdk 35;
33,119 classes, 4,599 resources, manifest coverage complete. The APK was never
launched; per the engine's own limits, display names may be aliases, overload indices
are engine-local, and incoming-reference totals cover JADX using-nodes only (not every
possible dynamic or reflective call site). Nothing below establishes runtime behaviour.
Send-to-navigation is a VIN-keyed server round-trip¶
The destination flow is a clean-architecture stack, all read from decompiled bodies:
com.psa.mym.activity.send2nav.SendToNavActivity/SendToNavFragment(UI) →com.base.view.viewmodel.SendToNavFragmentViewModel→com.base.domain.usecases.sendtonav.SaveSendToNavDestinationUseCase.invoke(lat: double, lon: double, label: String)→SendToNavRepositoryImpl→DBSendToNavDataSourceImpl→ RoomSendToNavDestinationDAO(local persistence).- Retrieval is VIN-keyed and remote:
com.inetpsa.pims.sendtonav.interactors.GetDestinationByVinStoredInteractor.execute(vin)callsrepository.retrieveDestinationLoginVin(vin)and resumes withStoredDestinationLoginVin.Success(NavigationLocation)orFailed(error). trace_android_referencesonSaveSendToNavDestinationUseCase(class-level, 8 using nodes) confirms the callers:SendToNavFragmentViewModel(+ inner class), theSendToNavModulesKtDI module, and — reused —com.psa.mym.evrouting.domain.usecases.EVSendDestinationUseCase(+ inner, viaEVRoutingModulesKt).- Component metadata:
com.inetpsa.pims.sendtonav.SendToNavigationComponentcarriesname/serviceName/version/repositoryfields — a plugin-style descriptor, not the transport.
SMEG+ relevance (inferred): destination entry is phone-side plus server-side; there
is no head-unit-push protocol in this chain. Useful only as the shape of the
NavigationLocation model if a SMEG+ POI/destination import is ever attempted.
O2X dongle flow is eligibility-gated per car¶
com.psa.mym.activity.dongle.*:DiscoverDongleActivity→ActivateDongleActivity→ConnectionSuccessDongleActivity, driven byDongleViewModel, which startsStartO2xServiceWithTimeOut.invoke(requireVin, timeOut): Flow<Result<O2XVehicleInformationMYM>>and stops viastopO2XServiceUseCasewithstopO2xAlreadyCalled/isStopO2XCalledOnErrorguards (read from decompiledstartO2XServiceWithTimer,startService,invokebodies).- The gate is server-side, not a local VIN-pattern check (read):
com.base.domain.usecases.IsVinO2XVehicleUseCase.invoke()returnsmymUserCarBOEligibilityRepository.hasEligibility(selectedCar, "o2x"). - Related names seen but not decompiled (not known tier, leads only):
SetConnectedVinUseCase,GetUserDataForVinUseCase,MyNavDecryptVinUseCase,ImportTripCategoriesByVinUseCase,com.inetpsa.pims.vehicleinformation.commands.SetVinCommand.
SMEG+ relevance (inferred): the O2X path is the same family as the USB "connected
key" dongle work cited in Sources & prior art (Mwyann/psakey).
The eligibility flag means a SMEG+-era car will almost certainly report ineligible —
confirming that would need a logged-in account session, which was not attempted.
Bluetooth phone↔car channel is bidirectional — but not SMEG+¶
com.inetpsa.cd2.careasyapps.kernel.transport.bluetooth.BluetoothConnectionManager
implements ITransportManager with both client threads (phone connects out) and
server threads (phone listens), plus connect/disconnect, discover, data /
connect / disconnect / endpoint-found / error callbacks, and sendData(byte[]) →
write() (read from the decompiled bodies). The RFCOMM UUID is chosen per brand
(read from getUUIDForBrand): CEA_PEUGEOT, CEA_CITROEN, CEA_DS, CEA_OPEL,
CEA_VAUXHALL, CEA_ABARTH, CEA_ALFA_ROMEO, CEA_CHRYSLER, CEA_DODGE,
CEA_FIAT, CEA_JEEP, CEA_LANCIA, CEA_MASERATI, CEA_RAM.
Observed users of the channel (read from class/member inventory): navigation status
(VCSendNavigationStatus, CeaNavigation* callbacks), smart-audio triggers
(SmartAudioConnectedBluetoothReceiver), BLE car-key enrolment
(CarKeyBluetoothTuto*), dongle discovery over BLE
(DiscoverDongleActivity.showEligibilityBluetoothLowEnergy), connection events
(BluetoothDeviceReceiver), and StartAllBluetoothServicesUseCase /
StopAllBluetoothServicesUseCase lifecycle hooks with a dedicated permission helper.
Send-to-nav notably does not use it — destinations travel phone → server → car.
SMEG+ relevance (inferred): the 2012–2017 unit exposes Bluetooth for handsfree and A2DP only — no CarEasyApps data endpoint — which is why the piggyback feeds audio via AUX. This channel targets newer CEA-capable head units. Bluetooth PAN tethering as a back door stays research, unproven.
Transport and remaining leads (inferred / not known)¶
- MQTT is vendored Paho (
com.inetpsa.mmx.foundation.mqtt.*, incl.MqttAndroidClient,MqttService) — the app's connected-services transport, but no SMEG+-relevant topic was traced. Which topics carry vehicle data is not known. - First-party
Poi/Navighits are EV-routing and CarEasyApps navigation components (FetchEVChargingPointsAndRouteUseCase,CarEasyAppsNavigationComponent,CeaNavigation*,VCSendNavigationStatus,NavigationUtils) — navigation to new head units, not SMEG+ map tiles. The user-POI import record layout stays unknown; Cartography remains the SMEG+ map reference. Dongle(10 classes),Bluetooth(43),Mqtt(71),Trip(340),Vehicle(306),Map(628) andCharg(153) match counts are class-name search totals over all 33,119 classes (third-party libraries included) — triage only, not behaviour.