mirror of
https://github.com/Lakr233/vphone-cli.git
synced 2026-04-05 04:59:05 +08:00
Implement VM configuration manifest system compatible with security-pcc's
VMBundle.Config format, storing VM settings in config.plist.
**Manifest System:**
- Add VPhoneVirtualMachineManifest.swift with security-pcc compatible structure
- Add scripts/vm_manifest.py for manifest generation during vm_new
- Update VPhoneCLI to support --config option with CLI overrides
- Update vm_create.sh to generate config.plist with CPU/memory/screen settings
**Environment Variables:**
- CPU/MEMORY/DISK_SIZE now only used during vm_new (written to manifest)
- boot/boot_dfu automatically read from config.plist
- Remove unused CFW_INPUT variable (overridden by scripts internally)
- Document remaining variables with their usage scope
**Documentation:**
- Update README.md with VM configuration section
- Update docs/README_{zh,ja,ko}.md with translated VM configuration docs
- Update Makefile help output with vm_new options and config.plist usage
- Fix fw_patch_jb description: "dev + JB extensions"
- Fix restore_get_shsh description: "Dump SHSH response from Apple"
**Code Quality:**
- Add VPhoneVirtualMachineRefactored.swift demonstrating code-clarity principles
- Extract 200+ line init into focused configuration methods
- Improve naming: hardwareModel, graphicsConfiguration, soundDevice
- Add BatteryConnectivity enum for magic numbers
- Create research/manifest_and_refactoring_summary.md with full analysis
**Compatibility with security-pcc:**
- Platform type: Fixed vresearch101 (iPhone-only)
- Network: NAT only (no bridging/host-only needed)
- Added: ScreenConfig and SEP storage (iPhone-specific)
- Removed: VirtMesh plugin support (PCC-specific)
docs: add machineIdentifier storage analysis
Research and validate the integration of machineIdentifier into config.plist.
**Findings:**
- security-pcc stores machineIdentifier in config.plist (same approach)
- VZMacAuxiliaryStorage creation is independent of machineIdentifier
- VZMacMachineIdentifier only requires Data representation, not file source
- No binding or validation between components
**Conclusion:**
- ✅ No compatibility issues
- ✅ Matches security-pcc official implementation
- ✅ Proper handling of first-boot creation and data recovery
- ✅ Safe to use
Delete VPhoneVirtualMachineRefactored.swift
refactor: integrate machineIdentifier into config.plist
Move machineIdentifier storage from standalone machineIdentifier.bin file
into the central config.plist manifest for simpler VM configuration.
**Changes:**
- VPhoneVirtualMachineManifest: Remove machineIDFile field
- VPhoneVirtualMachine: Load/create machineIdentifier from manifest
- VPhoneCLI: Remove --machine-id parameter, require --config
- Makefile: Remove --machine-id from boot/boot_dfu targets
- vm_manifest.py: Remove machineIDFile from manifest structure
**Behavior:**
- First boot: Creates machineIdentifier and saves to config.plist
- Subsequent boots: Loads machineIdentifier from config.plist
- Invalid/empty machineIdentifier: Auto-regenerates and updates manifest
- All VM configuration now centralized in single config.plist file
**File cleanup:**
- Move VPhoneVirtualMachineRefactored.swift to research/ as reference
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
7.8 KiB
7.8 KiB
VPhone-CLI Manifest Implementation & Code Clarity Review
Summary
- Implemented VM manifest system compatible with security-pcc's VMBundle.Config format
- Cleaned up environment variables - removed unused
CFW_INPUT, documented remaining variables - Applied code-clarity framework to review and refactor core files
1. VM Manifest Implementation
Files Created
sources/vphone-cli/VPhoneVirtualMachineManifest.swift- Manifest structure (compatible with security-pcc)scripts/vm_manifest.py- Python script to generate config.plist
Changes Made
-
VPhoneVirtualMachineManifest.swift
- Structure mirrors security-pcc's
VMBundle.Config - Adds iPhone-specific configurations (screen, SEP storage)
- Simplified for single-purpose (virtual iPhone vs generic VM)
- Structure mirrors security-pcc's
-
vm_create.sh
- Now calls
vm_manifest.pyto generateconfig.plist - Accepts
CPUandMEMORYenvironment variables - Creates manifest at
[5/4]step
- Now calls
-
Makefile
vm_new: Passes CPU/MEMORY tovm_create.shboot/boot_dfu: Read from--config ./config.plistinstead of CLI args- Removed unused
CFW_INPUTvariable - Added documentation for remaining variables
-
VPhoneCLI.swift
- Added
--configoption to load manifest - CPU/memory/screen parameters now optional (overridden by manifest if provided)
resolveOptions()merges manifest with CLI overrides
- Added
-
VPhoneAppDelegate.swift
- Uses
resolveOptions()to load configuration - Removed direct CLI parameter access
- Uses
Manifest Structure
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>platformType</key>
<string>vresearch101</string>
<key>cpuCount</key>
<integer>8</integer>
<key>memorySize</key>
<integer>8589934592</integer>
<key>screenConfig</key>
<dict>
<key>width</key>
<integer>1290</integer>
<key>height</key>
<integer>2796</integer>
<key>pixelsPerInch</key>
<integer>460</integer>
<key>scale</key>
<real>3.0</real>
</dict>
<key>networkConfig</key>
<dict>
<key>mode</key>
<string>nat</string>
<key>macAddress</key>
<string></string>
</dict>
<!-- ... storage, ROMs, SEP ... -->
</dict>
</plist>
Compatibility with security-pcc
| Feature | security-pcc | vphone-cli | Notes |
|---|---|---|---|
| Platform type | Configurable | Fixed (vresearch101) | iPhone only needs one |
| Network modes | NAT, bridged, host-only | NAT only | Phone doesn't need bridging |
| VirtMesh plugin | Supported | Not supported | PCC-specific feature |
| Screen config | Not included | Included | iPhone-specific |
| SEP storage | Not included | Included | iPhone-specific |
2. Code Clarity Review
VPhoneVirtualMachine.swift
Current Score: 6/10 → Target: 9/10
Issues Found:
- 200+ line init method - Violates single responsibility
- Mixed abstraction levels - Configuration logic mixed with low-level Dynamic API calls
- Unclear abbreviations:
hwModel→hardwareModelgfx→graphicsConfigurationafg→soundDevice(completely meaningless)net→networkDevice
- Magic numbers:
1=charging, 2=disconnected→ Should be enum - Missing early returns - Disk check should use guard
- Nested conditionals - Serial port configuration
Refactored Version Created
sources/vphone-cli/VPhoneVirtualMachineRefactored.swift demonstrates:
-
Extracted configuration methods:
private func configurePlatform(...) private func configureDisplay(_ config: inout VZVirtualMachineConfiguration, screen: ScreenConfiguration) private func configureAudio(_ config: inout VZVirtualMachineConfiguration) // ... etc -
Better naming:
// Before let gfx = VZMacGraphicsDeviceConfiguration() let afg = VZVirtioSoundDeviceConfiguration() // After let graphicsConfiguration = VZMacGraphicsDeviceConfiguration() let soundDevice = VZVirtioSoundDeviceConfiguration() -
Battery connectivity enum:
private enum BatteryConnectivity { static let charging = 1 static let disconnected = 2 } -
Clearer method names:
// Before setBattery(charge: 100, connectivity: 1) // After updateBattery(charge: 100, isCharging: true)
VPhoneCLI.swift
Current Score: 7/10 → Target: 9/10
Issues Fixed:
-
Variable shadowing - Local variables now use distinct names:
// Before var screenWidth: Int = 1290 if let screenWidth = screenWidth { ... } // Shadowing! // After var resolvedScreenWidth: Int = 1290 if let screenWidthArg = screenWidth { resolvedScreenWidth = screenWidthArg } -
Manifest loading - Clean separation of concerns
VPhoneVirtualMachineManifest.swift
Current Score: 8/10 → Target: 9/10
Minor Issues:
-
Repetitive error handling - Can be extracted:
private static func withFile<T>(_ url: URL, _ operation: (inout Data) throws -> T) throws -> T -
Method naming -
resolve(path:in:)could be clearer:// Before manifest.resolve(path: "Disk.img", in: vmDirectory) // After manifest.path(for: "Disk.img", relativeTo: vmDirectory)
3. Environment Variable Cleanup
Removed Variables
| Variable | Previous Use | Why Removed |
|---|---|---|
CFW_INPUT |
CFW input directory | Overridden by all cfw_install scripts internally |
Documented Variables
| Variable | Current Use | When Used |
|---|---|---|
VM_DIR |
VM directory path | All operations |
CPU |
CPU core count | Only vm_new |
MEMORY |
Memory size (MB) | Only vm_new |
DISK_SIZE |
Disk size (GB) | Only vm_new |
RESTORE_UDID |
Device UDID | restore operations |
RESTORE_ECID |
Device ECID | restore operations |
IRECOVERY_ECID |
Device ECID | ramdisk_send |
4. Usage Changes
Before
# Every boot required specifying CPU/Memory
make boot CPU=8 MEMORY=8192
After
# Set configuration once during VM creation
make vm_new CPU=8 MEMORY=8192 DISK_SIZE=64
# Boot automatically reads from config.plist
make boot
Override Manifest (Optional)
# Still supports CLI overrides for testing
make boot
# Inside vphone-cli, can pass:
# --cpu 16 --memory 16384
5. Next Steps
- Apply refactoring - Review
VPhoneVirtualMachineRefactored.swiftand apply to main file - Extend manifest - Consider adding:
- Kernel boot args configuration
- Debug stub port configuration
- Custom NVRAM variables
- Validate manifest - Add schema validation on load
- Migration path - For existing VMs without config.plist
6. Testing Checklist
make vm_newcreates config.plistmake bootreads from config.plist- CLI overrides work:
vphone-cli --config ... --cpu 16 - Existing VMs without config.plist still work (backward compatibility)
- Manifest is valid plist and can be edited manually
- CPU/Memory/Screen settings are correctly applied from manifest