public ResPackage getOnePackage() throws AndrolibException { if (mPackages.length <= 0) { throw new AndrolibException("Arsc file contains zero packages"); } else if (mPackages.length != 1) { int id = findPackageWithMostResSpecs(); LOGGER.info("Arsc file contains multiple packages. Using package " + mPackages[id].getName() + " as default."); return mPackages[id]; } return mPackages[0]; }
public void addPackage(ResPackage pkg, boolean main) throws AndrolibException { Integer id = pkg.getId(); if (mPackagesById.containsKey(id)) { throw new AndrolibException("Multiple packages: id=" + id.toString()); } String name = pkg.getName(); if (mPackagesByName.containsKey(name)) { throw new AndrolibException("Multiple packages: name=" + name); } mPackagesById.put(id, pkg); mPackagesByName.put(name, pkg); if (main) { mMainPackages.add(pkg); } else { mFramePackages.add(pkg); } }
public ResPackage selectPkgWithMostResSpecs(ResPackage[] pkgs) throws AndrolibException { int id = 0; int value = 0; for (ResPackage resPackage : pkgs) { if (resPackage.getResSpecCount() > value && ! resPackage.getName().equalsIgnoreCase("android")) { value = resPackage.getResSpecCount(); id = resPackage.getId(); } } // if id is still 0, we only have one pkgId which is "android" -> 1 return (id == 0) ? pkgs[0] : pkgs[1]; }
public ResPackage loadMainPkg(ResTable resTable, ExtFile apkFile) throws AndrolibException { LOGGER.info("Loading resource table..."); ResPackage[] pkgs = getResPackagesFromApk(apkFile, resTable, sKeepBroken); ResPackage pkg = null; switch (pkgs.length) { case 1: pkg = pkgs[0]; break; case 2: if (pkgs[0].getName().equals("android")) { LOGGER.warning("Skipping \"android\" package group"); pkg = pkgs[1]; break; } else if (pkgs[0].getName().equals("com.htc")) { LOGGER.warning("Skipping \"htc\" package group"); pkg = pkgs[1]; break; } default: pkg = selectPkgWithMostResSpecs(pkgs); break; } if (pkg == null) { throw new AndrolibException("arsc files with zero packages or no arsc file found."); } resTable.addPackage(pkg, true); return pkg; }
public void adjustPackageManifest(ResTable resTable, String filePath) throws AndrolibException { // compare resources.arsc package name to the one present in AndroidManifest ResPackage resPackage = resTable.getCurrentResPackage(); String packageOriginal = resPackage.getName(); mPackageRenamed = resTable.getPackageRenamed(); resTable.setPackageId(resPackage.getId()); resTable.setPackageOriginal(packageOriginal); // 1) Check if packageOriginal === mPackageRenamed // 2) Check if packageOriginal is ignored via IGNORED_PACKAGES // 2a) If its ignored, make sure the mPackageRenamed isn't explicitly allowed if (packageOriginal.equalsIgnoreCase(mPackageRenamed) || (Arrays.asList(IGNORED_PACKAGES).contains(packageOriginal) && ! Arrays.asList(ALLOWED_PACKAGES).contains(mPackageRenamed))) { LOGGER.info("Regular manifest package..."); } else { LOGGER.info("Renamed manifest package found! Replacing " + mPackageRenamed + " with " + packageOriginal); ResXmlPatcher.renameManifestPackage(new File(filePath), packageOriginal); } }
public ResPackage getHighestSpecPackage() throws AndrolibException { int id = 0; int value = 0; for (ResPackage resPackage : mPackagesById.values()) { if (resPackage.getResSpecCount() > value && !resPackage.getName().equalsIgnoreCase("android")) { value = resPackage.getResSpecCount(); id = resPackage.getId(); } } // if id is still 0, we only have one pkgId which is "android" -> 1 return (id == 0) ? getPackage(1) : getPackage(id); }
public String getFullName(boolean excludePackage, boolean excludeType) { return (excludePackage ? "" : getPackage().getName() + ":") + (excludeType ? "" : getType().getName() + "/") + getName(); }