private void putPackageInfo(MetaInfo meta) throws AndrolibException { String renamed = getResTable().getPackageRenamed(); String original = getResTable().getPackageOriginal(); int id = getResTable().getPackageId(); try { id = getResTable().getPackage(renamed).getId(); } catch (UndefinedResObject ignored) {} if (Strings.isNullOrEmpty(original)) { return; } meta.packageInfo = new PackageInfo(); // only put rename-manifest-package into apktool.yml, if the change will be required if (!renamed.equalsIgnoreCase(original)) { meta.packageInfo.renameManifestPackage = renamed; } meta.packageInfo.forcedPackageId = String.valueOf(id); }
public ResResSpec getResSpec(int resID) throws AndrolibException { // The pkgId is 0x00. That means a shared library is using its // own resource, so lie to the caller replacing with its own // packageId if (resID >> 24 == 0) { int pkgId = (mPackageId == 0 ? 2 : mPackageId); resID = (0xFF000000 & (pkgId << 24)) | resID; } return getResSpec(new ResID(resID)); }
public void setTargetSdkVersion() throws AndrolibException, IOException { if (mResTable == null) { mResTable = mAndrolib.getResTable(mApkFile); } Map<String, String> sdkInfo = mResTable.getSdkInfo(); if (sdkInfo.get("targetSdkVersion") != null) { mApi = Integer.parseInt(sdkInfo.get("targetSdkVersion")); } }
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); } }
if (mResTable.getPackageOriginal() == null && mResTable.getPackageRenamed() == null) { mResTable.setSharedLibrary(true);
public void decodeManifestWithResources(ResTable resTable, ExtFile apkFile, File outDir) throws AndrolibException { Duo<ResFileDecoder, AXmlResourceParser> duo = getResFileDecoder(); ResFileDecoder fileDecoder = duo.m1; ResAttrDecoder attrDecoder = duo.m2.getAttrDecoder(); attrDecoder.setCurrentPackage(resTable.listMainPackages().iterator().next()); Directory inApk, in = null, out; try { inApk = apkFile.getDirectory(); out = new FileDirectory(outDir); LOGGER.info("Decoding AndroidManifest.xml with resources..."); fileDecoder.decodeManifest(inApk, "AndroidManifest.xml", out, "AndroidManifest.xml"); // Remove versionName / versionCode (aapt API 16) if (!resTable.getAnalysisMode()) { // check for a mismatch between resources.arsc package and the package listed in AndroidManifest // also remove the android::versionCode / versionName from manifest for rebuild // this is a required change to prevent aapt warning about conflicting versions // it will be passed as a parameter to aapt like "--min-sdk-version" via apktool.yml adjustPackageManifest(resTable, outDir.getAbsolutePath() + File.separator + "AndroidManifest.xml"); ResXmlPatcher.removeManifestVersions(new File( outDir.getAbsolutePath() + File.separator + "AndroidManifest.xml")); mPackageId = String.valueOf(resTable.getPackageId()); } } catch (DirectoryException ex) { throw new AndrolibException(ex); } }
public ResResSpec getResSpec(ResID resID) throws AndrolibException { return getPackage(resID.package_).getResSpec(resID); }
public void setAnalysisMode(boolean mode, boolean pass) throws AndrolibException{ mAnalysisMode = mode; // only set mResTable, once it exists if (pass) { if (mResTable == null) { mResTable = getResTable(); } mResTable.setAnalysisMode(mode); } }
private void putVersionInfo(MetaInfo meta) throws AndrolibException { VersionInfo info = getResTable().getVersionInfo(); String refValue = ResXmlPatcher.pullValueFromStrings(mOutDir, info.versionName); if (refValue != null) { info.versionName = refValue; } meta.versionInfo = info; }
private void putSharedLibraryInfo(MetaInfo meta) throws AndrolibException { meta.sharedLibrary = mResTable.getSharedLibrary(); }
private void putUsesFramework(MetaInfo meta) throws AndrolibException { Set<ResPackage> pkgs = getResTable().listFramePackages(); if (pkgs.isEmpty()) { return; } Integer[] ids = new Integer[pkgs.size()]; int i = 0; for (ResPackage pkg : pkgs) { ids[i++] = pkg.getId(); } Arrays.sort(ids); meta.usesFramework = new UsesFramework(); meta.usesFramework.ids = Arrays.asList(ids); if (mAndrolib.apkOptions.frameworkTag != null) { meta.usesFramework.tag = mAndrolib.apkOptions.frameworkTag; } }
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 void setAnalysisMode(boolean mode, boolean pass) throws AndrolibException { mAnalysisMode = mode; // only set mResTable, once it exists if (pass) { if (mResTable == null) { mResTable = getResTable(); } mResTable.setAnalysisMode(mode); } }
private void putVersionInfo(MetaInfo meta) throws AndrolibException { VersionInfo info = getResTable().getVersionInfo(); String refValue = ResXmlPatcher.pullValueFromStrings(mOutDir, info.versionName); if (refValue != null) { info.versionName = refValue; } meta.versionInfo = info; }
private void putSharedLibraryInfo(MetaInfo meta) throws AndrolibException { meta.sharedLibrary = mResTable.getSharedLibrary(); } }
private void putUsesFramework(MetaInfo meta) throws AndrolibException { Set<ResPackage> pkgs = getResTable().listFramePackages(); if (pkgs.isEmpty()) { return; } Integer[] ids = new Integer[pkgs.size()]; int i = 0; for (ResPackage pkg : pkgs) { ids[i++] = pkg.getId(); } Arrays.sort(ids); meta.usesFramework = new UsesFramework(); meta.usesFramework.ids = Arrays.asList(ids); if (mAndrolib.apkOptions.frameworkTag != null) { meta.usesFramework.tag = mAndrolib.apkOptions.frameworkTag; } }
private void putPackageInfo(MetaInfo meta) throws AndrolibException { String renamed = getResTable().getPackageRenamed(); String original = getResTable().getPackageOriginal(); int id = getResTable().getPackageId(); try { id = getResTable().getPackage(renamed).getId(); } catch (UndefinedResObject ignored) { } if (original != null || original.isEmpty()) { return; } meta.packageInfo = new PackageInfo(); // only put rename-droidefense.sdk.manifest-package into apktool.yml, if the change will be required if (!renamed.equalsIgnoreCase(original)) { meta.packageInfo.renameManifestPackage = renamed; } meta.packageInfo.forcedPackageId = String.valueOf(id); }
public ResResSpec getReferent() throws AndrolibException { try { return mPackage.getResTable().getResSpec(getValue()); } catch (UndefinedResObject ex) { return null; } }
public ResValue getValue(String package_, String type, String name) throws AndrolibException { return getPackage(package_).getType(type).getResSpec(name).getDefaultResource().getValue(); }
private void putSdkInfo(MetaInfo meta) throws AndrolibException { Map<String, String> info = getResTable().getSdkInfo(); if (info.size() > 0) { meta.sdkInfo = info; } }