MuntashirAkon/AppManager · error · Resources.NotFoundException

Resource of type is not found in package

Error message

Resource ${name} of type ${type} is not found in package ${packageName}

What it means

After splitting 'package:type/name', getResourceFromName resolves the numeric ID via Resources#getIdentifier(name, type, packageName). When the remote package's Resources cannot map the name/type combination to an identifier (getIdentifier returns 0), it throws Resources.NotFoundException("Resource <name> of type <type> is not found in package <packageName>"). The name was well-formed; the resource simply does not exist in that package.

Solutions

  1. Verify the resource exists in the target package (aapt dump resources or decompile) before lookup
  2. Check the type segment spelling/case against the target package's R class
  3. Catch Resources.NotFoundException and fall back to a known-good resource in your own package
  4. Update to a target-app version whose resources match, or handle multiple candidate names

Example fix

// before
ParsedResource r = ResourceUtil.getResourceFromName(pm, "com.example.app:string/missing");
// after
try {
    r = ResourceUtil.getResourceFromName(pm, "com.example.app:string/missing");
} catch (Resources.NotFoundException e) {
    r = ResourceUtil.getResourceFromName(pm, "com.example.app:string/default_label");
}
Defensive patterns

Strategy: try-catch

Validate before calling

Resources res = pm.getResourcesForApplication(targetPackage);
if (res.getIdentifier(name, type, targetPackage) == 0) {
    // resource missing: use fallback before calling getResourceFromName
}

Type guard

boolean resourceExists(Resources res, String name, String type, String pkg) {
    return res.getIdentifier(name, type, pkg) != 0;
}

Try / catch

try {
    parsed = ResourceUtil.getResourceFromName(pm, qualifiedName);
} catch (Resources.NotFoundException e) {
    parsed = fallbackResource();
}

Prevention

When it happens

Trigger: Calling getResourceFromName(pm, 'pkg:string/foo') where package pkg is valid but has no string named foo, or the type segment is wrong (e.g. 'drawable' vs 'mipmap', 'raw' vs 'string').

Common situations: Targeting an app version that renamed or removed a resource; assuming a resource exists in a different app; typos in the type segment; resource only defined in a build variant/flavor not installed.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


AI-assisted analysis of MuntashirAkon/AppManager@0152f468fc (2026-09-12). Data as JSON: /api/errors/752acd3d7939279c. Report an issue: GitHub.

Appendix: source

Thrown at app/src/main/java/io/github/muntashirakon/AppManager/utils/ResourceUtil.java:76

     * package-name:type/res-name
     * </code>
     */
    @NonNull
    public static ParsedResource getResourceFromName(@NonNull PackageManager pm, @NonNull String resName)
            throws PackageManager.NameNotFoundException, Resources.NotFoundException {
        int indexOfColon = resName.indexOf(':');
        int indexOfSlash = resName.indexOf('/');
        if (indexOfColon == -1 || indexOfSlash == -1) {
            throw new Resources.NotFoundException("Resource " + resName + " is not found.");
        }
        String packageName = resName.substring(0, indexOfColon);
        String type = resName.substring(indexOfColon + 1, indexOfSlash);
        String name = resName.substring(indexOfSlash + 1);
        Resources res = pm.getResourcesForApplication(packageName);
        @SuppressLint("DiscouragedApi")
        int resId = res.getIdentifier(name, type, packageName);
        if (resId == 0) {
            throw new Resources.NotFoundException("Resource " + name + " of type " + type + " is not found in package " + packageName);
        }
        return new ParsedResource(packageName, res, resId);
    }

    @SuppressLint("DiscouragedApi")
    public static int getRawDataId(@NonNull Context context, @NonNull String name) {
        return context.getResources().getIdentifier(name, "raw", context.getPackageName());
    }

    @Nullable
    public String packageName;
    @Nullable
    public String className;
    @Nullable
    public Resources resources;

    public boolean loadResources(@NonNull PackageManager pm, @NonNull String packageName) {
        try {

View on GitHub (pinned to 0152f468fc)