Tencent/matrix · error · IllegalStateException

manufacturer is absent in result.info.

Error message

manufacturer is absent in result.info.

What it means

Same result.info parsing in CLIMain.doAnalyze: the 'manufacturer' key must be present so the analyzer can report which device leaked the activity. A missing manufacturer line aborts analysis with IllegalStateException after sdkVersion has been validated.

Solutions

  1. Regenerate the result bundle with a matching Matrix version so result.info includes manufacturer=<device maker>
  2. Manually add 'manufacturer=<value>' to result.info inside the zip
  3. Check for typos/key-case mismatches in result.info

Example fix

// before (result.info)
sdkVersion=33
// after (result.info)
sdkVersion=33
manufacturer=Google
Defensive patterns

Strategy: validation

Validate before calling

if (!info.containsKey("manufacturer")) throw new IllegalArgumentException("result.info missing manufacturer");

Type guard

null

Try / catch

try { doAnalyze(args); } catch (IllegalStateException e) { System.err.println("Invalid result bundle: " + e.getMessage()); System.exit(1); }

Prevention

When it happens

Trigger: Running the analyzer on a result zip whose result.info does not include the 'manufacturer' key (missing, misspelled, or empty line).

Common situations: Bundles edited by hand; older or third-party producers of the hprof report zip that omit manufacturer; copying a result.info template that drops the field.

Understand the failure class

Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.

Related errors


AI-assisted analysis of Tencent/matrix@3b8293bd65 (2026-09-08). Data as JSON: /api/errors/5983bca28b284137. Report an issue: GitHub.

Appendix: source

Thrown at matrix/matrix-android/matrix-resource-canary/matrix-resource-canary-analyzer-cli/src/main/java/com/tencent/matrix/resource/analyzer/CLIMain.java:230

                final String[] kvPair = confLine.split("\\s*=\\s*");
                if (kvPair.length != 2) {
                    // Skip bad config line.
                    continue;
                }
                final String key = kvPair[0].trim();
                final String value = kvPair[1].trim();
                resultInfoMap.put(key, value);
            }

            final String sdkVersionStr = resultInfoMap.get("sdkVersion");
            if (sdkVersionStr == null) {
                throw new IllegalStateException("sdkVersion is absent in result.info.");
            }
            final int sdkVersion = Integer.parseInt(sdkVersionStr);

            final String manufacturer = resultInfoMap.get("manufacturer");
            if (manufacturer == null) {
                throw new IllegalStateException("manufacturer is absent in result.info.");
            }

            final String hprofEntryName = resultInfoMap.get("hprofEntry");
            if (hprofEntryName == null) {
                throw new IllegalStateException("hprofEntry is absent in result.info.");
            }
            final ZipEntry hprofEntry = new ZipEntry(hprofEntryName);

            final String leakedActivityKey = resultInfoMap.get("leakedActivityKey");
            if (leakedActivityKey == null) {
                throw new IllegalStateException("leakedActivityKey is absent in result.info.");
            }

            // We would extract hprof entry into a temporary file.
            tempHprofFile = new File(new File("").getAbsoluteFile(), "temp_" + System.currentTimeMillis() + ".hprof");
            StreamUtil.extractZipEntry(zf, hprofEntry, tempHprofFile);

            // Parse extra info if exists.

View on GitHub (pinned to 3b8293bd65)