X-Git-Url: https://git.saurik.com/android/aapt.git/blobdiff_plain/7e029053aff869f4592a2a0cbf2fd98ad3651133..32a7e6a19abdfa613aa14c99bdabefc79eb4e821:/Command.cpp?ds=sidebyside diff --git a/Command.cpp b/Command.cpp index f4afd7f..537ae5e 100644 --- a/Command.cpp +++ b/Command.cpp @@ -233,7 +233,7 @@ static ssize_t indexOfAttribute(const ResXMLTree& tree, uint32_t attrRes) return -1; } -static String8 getAttribute(const ResXMLTree& tree, const char* ns, +String8 getAttribute(const ResXMLTree& tree, const char* ns, const char* attr, String8* outError) { ssize_t idx = tree.indexOfAttribute(ns, attr); @@ -401,7 +401,7 @@ int doDump(Bundle* bundle) ResXMLTree tree; asset = assets.openNonAsset(resname, Asset::ACCESS_BUFFER); if (asset == NULL) { - fprintf(stderr, "ERROR: dump failed because resource %p found\n", resname); + fprintf(stderr, "ERROR: dump failed because resource %s found\n", resname); goto bail; } @@ -412,6 +412,7 @@ int doDump(Bundle* bundle) } tree.restart(); printXMLBlock(&tree); + tree.uninit(); delete asset; asset = NULL; } @@ -427,7 +428,7 @@ int doDump(Bundle* bundle) ResXMLTree tree; asset = assets.openNonAsset(resname, Asset::ACCESS_BUFFER); if (asset == NULL) { - fprintf(stderr, "ERROR: dump failed because resource %p found\n", resname); + fprintf(stderr, "ERROR: dump failed because resource %s found\n", resname); goto bail; } @@ -524,6 +525,8 @@ int doDump(Bundle* bundle) bool actWallpaperService = false; bool specCameraFeature = false; bool hasCameraPermission = false; + bool specGpsFeature = false; + bool hasGpsPermission = false; int targetSdk = 0; int smallScreen = 1; int normalScreen = 1; @@ -678,7 +681,7 @@ int doDump(Bundle* bundle) REQ_NAVIGATION_ATTR, NULL, 0); int32_t reqFiveWayNav = getIntegerAttribute(tree, REQ_FIVE_WAY_NAV_ATTR, NULL, 0); - printf("uses-configuation:"); + printf("uses-configuration:"); if (reqTouchScreen != 0) { printf(" reqTouchScreen='%d'", reqTouchScreen); } @@ -712,11 +715,14 @@ int doDump(Bundle* bundle) LARGE_SCREEN_ATTR, NULL, 1); } else if (tag == "uses-feature") { String8 name = getAttribute(tree, NAME_ATTR, &error); - if (error == "") { + + if (name != "" && error == "") { int req = getIntegerAttribute(tree, REQUIRED_ATTR, NULL, 1); if (name == "android.hardware.camera") { specCameraFeature = true; + } else if (name == "android.hardware.location.gps") { + specGpsFeature = true; } printf("uses-feature%s:'%s'\n", req ? "" : "-not-required", name.string()); @@ -729,11 +735,11 @@ int doDump(Bundle* bundle) } } else if (tag == "uses-permission") { String8 name = getAttribute(tree, NAME_ATTR, &error); - if (error == "") { - int opt = getIntegerAttribute(tree, - REQUIRED_ATTR, NULL, 1); + if (name != "" && error == "") { if (name == "android.permission.CAMERA") { hasCameraPermission = true; + } else if (name == "android.permission.ACCESS_FINE_LOCATION") { + hasGpsPermission = true; } printf("uses-permission:'%s'\n", name.string()); } else { @@ -741,6 +747,15 @@ int doDump(Bundle* bundle) error.string()); goto bail; } + } else if (tag == "original-package") { + String8 name = getAttribute(tree, NAME_ATTR, &error); + if (name != "" && error == "") { + printf("original-package:'%s'\n", name.string()); + } else { + fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n", + error.string()); + goto bail; + } } } else if (depth == 3 && withinApplication) { withinActivity = false; @@ -772,7 +787,10 @@ int doDump(Bundle* bundle) fprintf(stderr, "ERROR getting 'android:name' attribute for uses-library: %s\n", error.string()); goto bail; } - printf("uses-library:'%s'\n", libraryName.string()); + int req = getIntegerAttribute(tree, + REQUIRED_ATTR, NULL, 1); + printf("uses-library%s:'%s'\n", + req ? "" : "-not-required", libraryName.string()); } else if (tag == "receiver") { withinReceiver = true; receiverName = getAttribute(tree, NAME_ATTR, &error); @@ -846,7 +864,15 @@ int doDump(Bundle* bundle) printf("uses-feature:'android.hardware.camera'\n"); printf("uses-feature:'android.hardware.camera.autofocus'\n"); } - + + if (!specGpsFeature && hasGpsPermission) { + // For applications that have not explicitly stated their + // GPS feature requirements, but have requested the "fine" (GPS) + // permission, we are going to give them compatibility treatment + // of requiring the equivalent to original android devices. + printf("uses-feature:'android.hardware.location.gps'\n"); + } + if (hasMainActivity) { printf("main\n"); } @@ -995,8 +1021,15 @@ int doAdd(Bundle* bundle) printf(" '%s'... (from gzip)\n", fileName); result = zip->addGzip(fileName, String8(fileName).getBasePath().string(), NULL); } else { - printf(" '%s'...\n", fileName); - result = zip->add(fileName, bundle->getCompressionMethod(), NULL); + if (bundle->getJunkPath()) { + String8 storageName = String8(fileName).getPathLeaf(); + printf(" '%s' as '%s'...\n", fileName, storageName.string()); + result = zip->add(fileName, storageName.string(), + bundle->getCompressionMethod(), NULL); + } else { + printf(" '%s'...\n", fileName); + result = zip->add(fileName, bundle->getCompressionMethod(), NULL); + } } if (result != NO_ERROR) { fprintf(stderr, "Unable to add '%s' to '%s'", bundle->getFileSpecEntry(i), zipFileName); @@ -1142,7 +1175,12 @@ int doPackage(Bundle* bundle) // Write out R.java constants if (assets->getPackage() == assets->getSymbolsPrivatePackage()) { - err = writeResourceSymbols(bundle, assets, assets->getPackage(), true); + if (bundle->getCustomPackage() == NULL) { + err = writeResourceSymbols(bundle, assets, assets->getPackage(), true); + } else { + const String8 customPkg(bundle->getCustomPackage()); + err = writeResourceSymbols(bundle, assets, customPkg, true); + } if (err < 0) { goto bail; } @@ -1157,6 +1195,12 @@ int doPackage(Bundle* bundle) } } + // Write out the ProGuard file + err = writeProguardFile(bundle, assets); + if (err < 0) { + goto bail; + } + // Write the apk if (outputAPKFile) { err = writeAPK(bundle, assets, String8(outputAPKFile));