Command.cpp revision a2ef5c0d4fb863c0382e77ae00f986a019b11cbe
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Copyright 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Android Asset Packaging Tool main entry point. 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "Main.h" 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "Bundle.h" 8e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn#include "ResourceFilter.h" 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "ResourceTable.h" 10b1f6ad82dd8d1702617a757a88430604b3131facXavier Ducrohet#include "Images.h" 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "XMLNode.h" 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 133b4062eeb01be33951ba214e027da523cf09f8b1Mathias Agopian#include <utils/Log.h> 143b4062eeb01be33951ba214e027da523cf09f8b1Mathias Agopian#include <utils/threads.h> 153b4062eeb01be33951ba214e027da523cf09f8b1Mathias Agopian#include <utils/List.h> 163b4062eeb01be33951ba214e027da523cf09f8b1Mathias Agopian#include <utils/Errors.h> 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <fcntl.h> 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <errno.h> 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Show version info. All the cool kids do it. 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint doVersion(Bundle* bundle) 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bundle->getFileSpecCount() != 0) 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("(ignoring extra arguments)\n"); 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("Android Asset Packaging Tool, v0.2\n"); 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Open the file read only. The call fails if the file doesn't exist. 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns NULL on failure. 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectZipFile* openReadOnly(const char* fileName) 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ZipFile* zip; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t result; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project zip = new ZipFile; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = zip->open(fileName, ZipFile::kOpenReadOnly); 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result != NO_ERROR) { 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result == NAME_NOT_FOUND) 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: '%s' not found\n", fileName); 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (result == PERMISSION_DENIED) 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: '%s' access denied\n", fileName); 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: failed opening '%s' as Zip file\n", 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fileName); 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete zip; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return zip; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Open the file read-write. The file will be created if it doesn't 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * already exist and "okayToCreate" is set. 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns NULL on failure. 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectZipFile* openReadWrite(const char* fileName, bool okayToCreate) 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ZipFile* zip = NULL; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t result; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flags = ZipFile::kOpenReadWrite; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (okayToCreate) 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flags |= ZipFile::kOpenCreate; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project zip = new ZipFile; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = zip->open(fileName, flags); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result != NO_ERROR) { 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete zip; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project zip = NULL; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbail: 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return zip; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a short string describing the compression method. 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char* compressionName(int method) 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (method == ZipEntry::kCompressStored) 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Stored"; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (method == ZipEntry::kCompressDeflated) 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Deflated"; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Unknown"; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the percent reduction in size (0% == no compression). 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint calcPercent(long uncompressedLen, long compressedLen) 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!uncompressedLen) 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (int) (100.0 - (compressedLen * 100.0) / uncompressedLen + 0.5); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Handle the "list" command, which can be a simple file dump or 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a verbose listing. 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The verbose listing closely matches the output of the Info-ZIP "unzip" 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * command. 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint doList(Bundle* bundle) 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result = 1; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ZipFile* zip = NULL; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ZipEntry* entry; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long totalUncLen, totalCompLen; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* zipFileName; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bundle->getFileSpecCount() != 1) { 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: specify zip file name (only)\n"); 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project zipFileName = bundle->getFileSpecEntry(0); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project zip = openReadOnly(zipFileName); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (zip == NULL) 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count, i; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bundle->getVerbose()) { 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("Archive: %s\n", zipFileName); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf( 146fb2a9467ad77336edbf2a1a272dbe6ec30ef8a1bKenny Root " Length Method Size Ratio Offset Date Time CRC-32 Name\n"); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf( 148fb2a9467ad77336edbf2a1a272dbe6ec30ef8a1bKenny Root "-------- ------ ------- ----- ------- ---- ---- ------ ----\n"); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project totalUncLen = totalCompLen = 0; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count = zip->getNumEntries(); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i = 0; i < count; i++) { 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project entry = zip->getEntryByIndex(i); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bundle->getVerbose()) { 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char dateBuf[32]; 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project time_t when; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project when = entry->getModWhen(); 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project strftime(dateBuf, sizeof(dateBuf), "%m-%d-%y %H:%M", 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project localtime(&when)); 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 164fb2a9467ad77336edbf2a1a272dbe6ec30ef8a1bKenny Root printf("%8ld %-7.7s %7ld %3d%% %8zd %s %08lx %s\n", 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (long) entry->getUncompressedLen(), 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project compressionName(entry->getCompressionMethod()), 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (long) entry->getCompressedLen(), 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project calcPercent(entry->getUncompressedLen(), 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project entry->getCompressedLen()), 170fb2a9467ad77336edbf2a1a272dbe6ec30ef8a1bKenny Root (size_t) entry->getLFHOffset(), 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dateBuf, 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project entry->getCRC32(), 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project entry->getFileName()); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("%s\n", entry->getFileName()); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project totalUncLen += entry->getUncompressedLen(); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project totalCompLen += entry->getCompressedLen(); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bundle->getVerbose()) { 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf( 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "-------- ------- --- -------\n"); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("%8ld %7ld %2d%% %d files\n", 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project totalUncLen, 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project totalCompLen, 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project calcPercent(totalUncLen, totalCompLen), 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project zip->getNumEntries()); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bundle->getAndroidList()) { 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager assets; 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!assets.addAssetPath(String8(zipFileName), NULL)) { 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: list -a failed because assets could not be loaded\n"); 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1987ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable& res = assets.getResources(false); 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (&res == NULL) { 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("\nNo resource table found.\n"); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 203f1ff21ac62a51f5ba8ca0821ea8a90f70957e25dSteve Block#ifndef HAVE_ANDROID_OS 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("\nResource table:\n"); 205e17086ba346009a26cc2299b133a0fe602acb6ecDianne Hackborn res.print(false); 206f1ff21ac62a51f5ba8ca0821ea8a90f70957e25dSteve Block#endif 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2087ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset* manifestAsset = assets.openNonAsset("AndroidManifest.xml", 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset::ACCESS_BUFFER); 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (manifestAsset == NULL) { 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("\nNo AndroidManifest.xml found.\n"); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("\nAndroid manifest:\n"); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResXMLTree tree; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tree.setTo(manifestAsset->getBuffer(true), 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project manifestAsset->getLength()); 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printXMLBlock(&tree); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete manifestAsset; 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2227ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = 0; 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbail: 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete zip; 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic ssize_t indexOfAttribute(const ResXMLTree& tree, uint32_t attrRes) 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t N = tree.getAttributeCount(); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t i=0; i<N; i++) { 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tree.getAttributeNameResID(i) == attrRes) { 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (ssize_t)i; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2411553c82e084ac5763fb393857224145506771b99Joe OnoratoString8 getAttribute(const ResXMLTree& tree, const char* ns, 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* attr, String8* outError) 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t idx = tree.indexOfAttribute(ns, attr); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (idx < 0) { 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return String8(); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Res_value value; 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tree.getAttributeValue(idx, &value) != NO_ERROR) { 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.dataType != Res_value::TYPE_STRING) { 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outError != NULL) *outError = "attribute is not a string value"; 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return String8(); 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t len; 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const uint16_t* str = tree.getAttributeStringValue(idx, &len); 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return str ? String8(str, len) : String8(); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic String8 getAttribute(const ResXMLTree& tree, uint32_t attrRes, String8* outError) 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t idx = indexOfAttribute(tree, attrRes); 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (idx < 0) { 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return String8(); 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Res_value value; 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tree.getAttributeValue(idx, &value) != NO_ERROR) { 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.dataType != Res_value::TYPE_STRING) { 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outError != NULL) *outError = "attribute is not a string value"; 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return String8(); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t len; 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const uint16_t* str = tree.getAttributeStringValue(idx, &len); 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return str ? String8(str, len) : String8(); 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 278bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackbornstatic int32_t getIntegerAttribute(const ResXMLTree& tree, uint32_t attrRes, 279bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn String8* outError, int32_t defValue = -1) 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t idx = indexOfAttribute(tree, attrRes); 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (idx < 0) { 283bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn return defValue; 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Res_value value; 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tree.getAttributeValue(idx, &value) != NO_ERROR) { 287bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn if (value.dataType < Res_value::TYPE_FIRST_INT 288bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn || value.dataType > Res_value::TYPE_LAST_INT) { 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outError != NULL) *outError = "attribute is not an integer value"; 290bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn return defValue; 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return value.data; 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 296f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackbornstatic int32_t getResolvedIntegerAttribute(const ResTable* resTable, const ResXMLTree& tree, 297f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn uint32_t attrRes, String8* outError, int32_t defValue = -1) 298f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn{ 299f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn ssize_t idx = indexOfAttribute(tree, attrRes); 300f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn if (idx < 0) { 301f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn return defValue; 302f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn } 303f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn Res_value value; 304f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn if (tree.getAttributeValue(idx, &value) != NO_ERROR) { 305f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn if (value.dataType == Res_value::TYPE_REFERENCE) { 306f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn resTable->resolveReference(&value, 0); 307f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn } 308f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn if (value.dataType < Res_value::TYPE_FIRST_INT 309f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn || value.dataType > Res_value::TYPE_LAST_INT) { 310f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn if (outError != NULL) *outError = "attribute is not an integer value"; 311f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn return defValue; 312f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn } 313f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn } 314f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn return value.data; 315f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn} 316f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic String8 getResolvedAttribute(const ResTable* resTable, const ResXMLTree& tree, 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t attrRes, String8* outError) 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t idx = indexOfAttribute(tree, attrRes); 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (idx < 0) { 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return String8(); 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Res_value value; 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tree.getAttributeValue(idx, &value) != NO_ERROR) { 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.dataType == Res_value::TYPE_STRING) { 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t len; 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const uint16_t* str = tree.getAttributeStringValue(idx, &len); 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return str ? String8(str, len) : String8(); 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resTable->resolveReference(&value, 0); 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.dataType != Res_value::TYPE_STRING) { 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outError != NULL) *outError = "attribute is not a string value"; 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return String8(); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t len; 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Res_value* value2 = &value; 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char16_t* str = const_cast<ResTable*>(resTable)->valueToString(value2, 0, NULL, &len); 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return str ? String8(str, len) : String8(); 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// These are attribute resource constants for the platform, as found 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// in android.R.attr 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectenum { 346f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn LABEL_ATTR = 0x01010001, 347f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn ICON_ATTR = 0x01010002, 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NAME_ATTR = 0x01010003, 349b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski PERMISSION_ATTR = 0x01010006, 350d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski RESOURCE_ATTR = 0x01010025, 351b6ec11ef372a498c4d5fd2317a015b808495a2edDan Morrill DEBUGGABLE_ATTR = 0x0101000f, 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project VERSION_CODE_ATTR = 0x0101021b, 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project VERSION_NAME_ATTR = 0x0101021c, 354f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn SCREEN_ORIENTATION_ATTR = 0x0101001e, 355bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn MIN_SDK_VERSION_ATTR = 0x0101020c, 35675c498426a17b47d445711bb9e36794b05876a56Suchi Amalapurapu MAX_SDK_VERSION_ATTR = 0x01010271, 357bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn REQ_TOUCH_SCREEN_ATTR = 0x01010227, 358bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn REQ_KEYBOARD_TYPE_ATTR = 0x01010228, 359bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn REQ_HARD_KEYBOARD_ATTR = 0x01010229, 360bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn REQ_NAVIGATION_ATTR = 0x0101022a, 361bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn REQ_FIVE_WAY_NAV_ATTR = 0x01010232, 362bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn TARGET_SDK_VERSION_ATTR = 0x01010270, 363bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn TEST_ONLY_ATTR = 0x01010272, 364a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn ANY_DENSITY_ATTR = 0x0101026c, 365e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn GL_ES_VERSION_ATTR = 0x01010281, 366723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn SMALL_SCREEN_ATTR = 0x01010284, 367723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn NORMAL_SCREEN_ATTR = 0x01010285, 368723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn LARGE_SCREEN_ATTR = 0x01010286, 369f43489d7d5e1c0c5c9a7e54c22845fcb99765f81Dianne Hackborn XLARGE_SCREEN_ATTR = 0x010102bf, 370e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn REQUIRED_ATTR = 0x0101028e, 371a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn SCREEN_SIZE_ATTR = 0x010102ca, 372a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn SCREEN_DENSITY_ATTR = 0x010102cb, 373e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn REQUIRES_SMALLEST_WIDTH_DP_ATTR = 0x01010364, 374e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn COMPATIBLE_WIDTH_LIMIT_DP_ATTR = 0x01010365, 375e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn LARGEST_WIDTH_LIMIT_DP_ATTR = 0x01010366, 37656088a55ca6c9277f09040a7883117cb127e1e56Kenny Root PUBLIC_KEY_ATTR = 0x010103a6, 377d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski CATEGORY_ATTR = 0x010103e8, 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3807ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapuconst char *getComponentName(String8 &pkgName, String8 &componentName) { 3817ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu ssize_t idx = componentName.find("."); 3827ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu String8 retStr(pkgName); 3837ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu if (idx == 0) { 3847ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu retStr += componentName; 3857ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu } else if (idx < 0) { 3867ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu retStr += "."; 3877ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu retStr += componentName; 3887ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu } else { 3897ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu return componentName.string(); 3907ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu } 3917ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu return retStr.string(); 3927ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu} 3937ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu 394a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackbornstatic void printCompatibleScreens(ResXMLTree& tree) { 395a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn size_t len; 396a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn ResXMLTree::event_code_t code; 397a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn int depth = 0; 398a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn bool first = true; 399a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn printf("compatible-screens:"); 400a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn while ((code=tree.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { 401a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn if (code == ResXMLTree::END_TAG) { 402a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn depth--; 403a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn if (depth < 0) { 404a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn break; 405a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn } 406a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn continue; 407a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn } 408a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn if (code != ResXMLTree::START_TAG) { 409a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn continue; 410a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn } 411a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn depth++; 412a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn String8 tag(tree.getElementName(&len)); 413a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn if (tag == "screen") { 414a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn int32_t screenSize = getIntegerAttribute(tree, 415a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn SCREEN_SIZE_ATTR, NULL, -1); 416a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn int32_t screenDensity = getIntegerAttribute(tree, 417a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn SCREEN_DENSITY_ATTR, NULL, -1); 418a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn if (screenSize > 0 && screenDensity > 0) { 419a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn if (!first) { 420a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn printf(","); 421a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn } 422a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn first = false; 423a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn printf("'%d/%d'", screenSize, screenDensity); 424a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn } 425a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn } 426a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn } 427a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn printf("\n"); 428a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn} 429a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn 430d831e80a2fa80d18867e70927e4e8cd797ead56fAdam LesinskiVector<String8> getNfcAidCategories(AssetManager& assets, String8 xmlPath, bool offHost, 431d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski String8 *outError = NULL) 432d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski{ 433d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski Asset* aidAsset = assets.openNonAsset(xmlPath, Asset::ACCESS_BUFFER); 434d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski if (aidAsset == NULL) { 435d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski if (outError != NULL) *outError = "xml resource does not exist"; 436d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski return Vector<String8>(); 437d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski } 438d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski 439d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski const String8 serviceTagName(offHost ? "offhost-apdu-service" : "host-apdu-service"); 440d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski 441d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski bool withinApduService = false; 442d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski Vector<String8> categories; 443d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski 444d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski String8 error; 445d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski ResXMLTree tree; 446d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski tree.setTo(aidAsset->getBuffer(true), aidAsset->getLength()); 447d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski 448d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski size_t len; 449d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski int depth = 0; 450d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski ResXMLTree::event_code_t code; 451d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski while ((code=tree.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { 452d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski if (code == ResXMLTree::END_TAG) { 453d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski depth--; 454d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski String8 tag(tree.getElementName(&len)); 455d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski 456d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski if (depth == 0 && tag == serviceTagName) { 457d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski withinApduService = false; 458d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski } 459d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski 460d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski } else if (code == ResXMLTree::START_TAG) { 461d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski depth++; 462d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski String8 tag(tree.getElementName(&len)); 463d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski 464d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski if (depth == 1) { 465d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski if (tag == serviceTagName) { 466d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski withinApduService = true; 467d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski } 468d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski } else if (depth == 2 && withinApduService) { 469d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski if (tag == "aid-group") { 470d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski String8 category = getAttribute(tree, CATEGORY_ATTR, &error); 471d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski if (error != "") { 472d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski if (outError != NULL) *outError = error; 473d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski return Vector<String8>(); 474d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski } 475d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski 476d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski categories.add(category); 477d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski } 478d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski } 479d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski } 480d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski } 481d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski aidAsset->close(); 482d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski return categories; 483d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski} 484d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Handle the "dump" command, to extract select data from an archive. 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 488e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrillextern char CONSOLE_DATA[2925]; // see EOF 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint doDump(Bundle* bundle) 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t result = UNKNOWN_ERROR; 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset* asset = NULL; 4937ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bundle->getFileSpecCount() < 1) { 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: no dump option specified\n"); 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4987ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bundle->getFileSpecCount() < 2) { 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: no dump file specified\n"); 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5037ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* option = bundle->getFileSpecEntry(0); 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* filename = bundle->getFileSpecEntry(1); 5067ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager assets; 508745d4efc8369d255341d810790132660e33d3b61Narayan Kamath int32_t assetsCookie; 509bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn if (!assets.addAssetPath(String8(filename), &assetsCookie)) { 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: dump failed because assets could not be loaded\n"); 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5137ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu 514e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn // Make a dummy config for retrieving resources... we need to supply 515e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn // non-default values for some configs so that we can retrieve resources 516e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn // in the app that don't have a default. The most important of these is 517e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn // the API version because key resources like icons will have an implicit 518e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn // version if they are using newer config types like density. 519e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn ResTable_config config; 520788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath memset(&config, 0, sizeof(ResTable_config)); 521e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn config.language[0] = 'e'; 522e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn config.language[1] = 'n'; 523e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn config.country[0] = 'U'; 524e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn config.country[1] = 'S'; 525e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn config.orientation = ResTable_config::ORIENTATION_PORT; 526e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn config.density = ResTable_config::DENSITY_MEDIUM; 527e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn config.sdkVersion = 10000; // Very high. 528e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn config.screenWidthDp = 320; 529e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn config.screenHeightDp = 480; 530e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn config.smallestScreenWidthDp = 320; 531e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn assets.setConfiguration(config); 532e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable& res = assets.getResources(false); 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (&res == NULL) { 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: dump failed because no resource table was found\n"); 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5387ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp("resources", option) == 0) { 540f1ff21ac62a51f5ba8ca0821ea8a90f70957e25dSteve Block#ifndef HAVE_ANDROID_OS 541e17086ba346009a26cc2299b133a0fe602acb6ecDianne Hackborn res.print(bundle->getValues()); 542f1ff21ac62a51f5ba8ca0821ea8a90f70957e25dSteve Block#endif 5436c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn 5446c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn } else if (strcmp("strings", option) == 0) { 5456c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn const ResStringPool* pool = res.getTableStringBlock(0); 5466c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn printStringPool(pool); 5476c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp("xmltree", option) == 0) { 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bundle->getFileSpecCount() < 3) { 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: no dump xmltree resource file specified\n"); 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5537ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=2; i<bundle->getFileSpecCount(); i++) { 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* resname = bundle->getFileSpecEntry(i); 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResXMLTree tree; 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project asset = assets.openNonAsset(resname, Asset::ACCESS_BUFFER); 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (asset == NULL) { 55944b283dc27ed8ba5a946d809489f29b4ae88cb15Kenny Root fprintf(stderr, "ERROR: dump failed because resource %s found\n", resname); 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5627ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tree.setTo(asset->getBuffer(true), 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project asset->getLength()) != NO_ERROR) { 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: Resource %s is corrupt\n", resname); 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tree.restart(); 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printXMLBlock(&tree); 57019138468caf7050d482dc15f35a344eab11bb756Kenny Root tree.uninit(); 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete asset; 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project asset = NULL; 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5747ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp("xmlstrings", option) == 0) { 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bundle->getFileSpecCount() < 3) { 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: no dump xmltree resource file specified\n"); 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5807ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=2; i<bundle->getFileSpecCount(); i++) { 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* resname = bundle->getFileSpecEntry(i); 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResXMLTree tree; 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project asset = assets.openNonAsset(resname, Asset::ACCESS_BUFFER); 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (asset == NULL) { 58644b283dc27ed8ba5a946d809489f29b4ae88cb15Kenny Root fprintf(stderr, "ERROR: dump failed because resource %s found\n", resname); 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5897ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tree.setTo(asset->getBuffer(true), 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project asset->getLength()) != NO_ERROR) { 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: Resource %s is corrupt\n", resname); 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printStringPool(&tree.getStrings()); 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete asset; 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project asset = NULL; 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5997ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResXMLTree tree; 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project asset = assets.openNonAsset("AndroidManifest.xml", 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset::ACCESS_BUFFER); 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (asset == NULL) { 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: dump failed because no AndroidManifest.xml found\n"); 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6087ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tree.setTo(asset->getBuffer(true), 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project asset->getLength()) != NO_ERROR) { 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: AndroidManifest.xml is corrupt\n"); 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tree.restart(); 6157ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp("permissions", option) == 0) { 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t len; 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResXMLTree::event_code_t code; 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int depth = 0; 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((code=tree.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (code == ResXMLTree::END_TAG) { 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project depth--; 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (code != ResXMLTree::START_TAG) { 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project depth++; 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 tag(tree.getElementName(&len)); 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Depth %d tag %s\n", depth, tag.string()); 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (depth == 1) { 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tag != "manifest") { 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: manifest does not start with <manifest> tag\n"); 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 pkg = getAttribute(tree, NULL, "package", NULL); 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("package: %s\n", pkg.string()); 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (depth == 2 && tag == "permission") { 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 error; 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 name = getAttribute(tree, NAME_ATTR, &error); 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (error != "") { 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: %s\n", error.string()); 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("permission: %s\n", name.string()); 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (depth == 2 && tag == "uses-permission") { 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 error; 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 name = getAttribute(tree, NAME_ATTR, &error); 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (error != "") { 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: %s\n", error.string()); 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("uses-permission: %s\n", name.string()); 6541bcc3d691fd1cb68abced62caf3024e2bb228561Nick Kralevich int req = getIntegerAttribute(tree, REQUIRED_ATTR, NULL, 1); 6551bcc3d691fd1cb68abced62caf3024e2bb228561Nick Kralevich if (!req) { 6561bcc3d691fd1cb68abced62caf3024e2bb228561Nick Kralevich printf("optional-permission: %s\n", name.string()); 6571bcc3d691fd1cb68abced62caf3024e2bb228561Nick Kralevich } 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp("badging", option) == 0) { 661e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn Vector<String8> locales; 662e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn res.getLocales(&locales); 663e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn 664e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn Vector<ResTable_config> configs; 665e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn res.getConfigurations(&configs); 666e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn SortedVector<int> densities; 667e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn const size_t NC = configs.size(); 668e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn for (size_t i=0; i<NC; i++) { 669e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn int dens = configs[i].density; 670e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn if (dens == 0) dens = 160; 671e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn densities.add(dens); 672e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn } 673e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t len; 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResXMLTree::event_code_t code; 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int depth = 0; 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 error; 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool withinActivity = false; 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool isMainActivity = false; 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool isLauncherActivity = false; 6811b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu bool isSearchable = false; 6827ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu bool withinApplication = false; 683eaeb19048672337714c1724de7992be8cb3f2124Michael Wright bool withinSupportsInput = false; 6847ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu bool withinReceiver = false; 6851b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu bool withinService = false; 6861b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu bool withinIntentFilter = false; 6871b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu bool hasMainActivity = false; 6881b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu bool hasOtherActivities = false; 6891b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu bool hasOtherReceivers = false; 6901b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu bool hasOtherServices = false; 6911b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu bool hasWallpaperService = false; 6921b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu bool hasImeService = false; 693b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski bool hasAccessibilityService = false; 694b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski bool hasPrintService = false; 6951b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu bool hasWidgetReceivers = false; 696b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski bool hasDeviceAdminReceiver = false; 6971b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu bool hasIntentFilter = false; 698d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski bool hasPaymentService = false; 6991b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu bool actMainActivity = false; 7001b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu bool actWidgetReceivers = false; 701b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski bool actDeviceAdminEnabled = false; 7021b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu bool actImeService = false; 7031b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu bool actWallpaperService = false; 704b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski bool actAccessibilityService = false; 705b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski bool actPrintService = false; 706d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski bool actHostApduService = false; 707d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski bool actOffHostApduService = false; 708d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski bool hasMetaHostPaymentCategory = false; 709d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski bool hasMetaOffHostPaymentCategory = false; 710b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski 711b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski // These permissions are required by services implementing services 712b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski // the system binds to (IME, Accessibility, PrintServices, etc.) 713b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski bool hasBindDeviceAdminPermission = false; 714b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski bool hasBindInputMethodPermission = false; 715b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski bool hasBindAccessibilityServicePermission = false; 716b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski bool hasBindPrintServicePermission = false; 717d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski bool hasBindNfcServicePermission = false; 71889d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill 719063a44e541335819b673fb1c20a338bbcaf3a3f5Kenny Root // These two implement the implicit permissions that are granted 720063a44e541335819b673fb1c20a338bbcaf3a3f5Kenny Root // to pre-1.6 applications. 721063a44e541335819b673fb1c20a338bbcaf3a3f5Kenny Root bool hasWriteExternalStoragePermission = false; 722063a44e541335819b673fb1c20a338bbcaf3a3f5Kenny Root bool hasReadPhoneStatePermission = false; 723063a44e541335819b673fb1c20a338bbcaf3a3f5Kenny Root 7247924512aa12c6af37d90e8ccfcdf04eb78a294a3Dianne Hackborn // If an app requests write storage, they will also get read storage. 7257924512aa12c6af37d90e8ccfcdf04eb78a294a3Dianne Hackborn bool hasReadExternalStoragePermission = false; 7267924512aa12c6af37d90e8ccfcdf04eb78a294a3Dianne Hackborn 72731b0e0e86ad061cd8005e80817bcad017e2d56ddDianne Hackborn // Implement transition to read and write call log. 72831b0e0e86ad061cd8005e80817bcad017e2d56ddDianne Hackborn bool hasReadContactsPermission = false; 72931b0e0e86ad061cd8005e80817bcad017e2d56ddDianne Hackborn bool hasWriteContactsPermission = false; 73031b0e0e86ad061cd8005e80817bcad017e2d56ddDianne Hackborn bool hasReadCallLogPermission = false; 73131b0e0e86ad061cd8005e80817bcad017e2d56ddDianne Hackborn bool hasWriteCallLogPermission = false; 73231b0e0e86ad061cd8005e80817bcad017e2d56ddDianne Hackborn 73389d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // This next group of variables is used to implement a group of 73489d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // backward-compatibility heuristics necessitated by the addition of 73589d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // some new uses-feature constants in 2.1 and 2.2. In most cases, the 73689d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // heuristic is "if an app requests a permission but doesn't explicitly 73789d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // request the corresponding <uses-feature>, presume it's there anyway". 73889d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill bool specCameraFeature = false; // camera-related 73989d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill bool specCameraAutofocusFeature = false; 74089d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill bool reqCameraAutofocusFeature = false; 74189d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill bool reqCameraFlashFeature = false; 742e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn bool hasCameraPermission = false; 74389d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill bool specLocationFeature = false; // location-related 74489d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill bool specNetworkLocFeature = false; 74589d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill bool reqNetworkLocFeature = false; 746ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn bool specGpsFeature = false; 74789d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill bool reqGpsFeature = false; 74889d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill bool hasMockLocPermission = false; 74989d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill bool hasCoarseLocPermission = false; 750ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn bool hasGpsPermission = false; 75189d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill bool hasGeneralLocPermission = false; 75289d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill bool specBluetoothFeature = false; // Bluetooth API-related 75389d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill bool hasBluetoothPermission = false; 75489d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill bool specMicrophoneFeature = false; // microphone-related 75589d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill bool hasRecordAudioPermission = false; 75689d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill bool specWiFiFeature = false; 75789d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill bool hasWiFiPermission = false; 75889d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill bool specTelephonyFeature = false; // telephony-related 75989d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill bool reqTelephonySubFeature = false; 76089d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill bool hasTelephonyPermission = false; 76189d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill bool specTouchscreenFeature = false; // touchscreen-related 76289d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill bool specMultitouchFeature = false; 76389d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill bool reqDistinctMultitouchFeature = false; 764e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn bool specScreenPortraitFeature = false; 765e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn bool specScreenLandscapeFeature = false; 766f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn bool reqScreenPortraitFeature = false; 767f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn bool reqScreenLandscapeFeature = false; 76889d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // 2.2 also added some other features that apps can request, but that 76989d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // have no corresponding permission, so we cannot implement any 77089d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // back-compatibility heuristic for them. The below are thus unnecessary 77189d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // (but are retained here for documentary purposes.) 77289d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill //bool specCompassFeature = false; 77389d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill //bool specAccelerometerFeature = false; 77489d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill //bool specProximityFeature = false; 77589d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill //bool specAmbientLightFeature = false; 77689d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill //bool specLiveWallpaperFeature = false; 77789d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill 778723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn int targetSdk = 0; 779723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn int smallScreen = 1; 780723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn int normalScreen = 1; 781723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn int largeScreen = 1; 782f43489d7d5e1c0c5c9a7e54c22845fcb99765f81Dianne Hackborn int xlargeScreen = 1; 783a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn int anyDensity = 1; 784e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn int requiresSmallestWidthDp = 0; 785e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn int compatibleWidthLimitDp = 0; 786e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn int largestWidthLimitDp = 0; 7877ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu String8 pkg; 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 activityName; 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 activityLabel; 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 activityIcon; 7917ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu String8 receiverName; 7921b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu String8 serviceName; 793eaeb19048672337714c1724de7992be8cb3f2124Michael Wright Vector<String8> supportedInput; 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((code=tree.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (code == ResXMLTree::END_TAG) { 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project depth--; 7971b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu if (depth < 2) { 798eaeb19048672337714c1724de7992be8cb3f2124Michael Wright if (withinSupportsInput && !supportedInput.isEmpty()) { 799eaeb19048672337714c1724de7992be8cb3f2124Michael Wright printf("supports-input: '"); 800eaeb19048672337714c1724de7992be8cb3f2124Michael Wright const size_t N = supportedInput.size(); 801eaeb19048672337714c1724de7992be8cb3f2124Michael Wright for (size_t i=0; i<N; i++) { 802eaeb19048672337714c1724de7992be8cb3f2124Michael Wright printf("%s", supportedInput[i].string()); 803eaeb19048672337714c1724de7992be8cb3f2124Michael Wright if (i != N - 1) { 804eaeb19048672337714c1724de7992be8cb3f2124Michael Wright printf("' '"); 805eaeb19048672337714c1724de7992be8cb3f2124Michael Wright } else { 806eaeb19048672337714c1724de7992be8cb3f2124Michael Wright printf("'\n"); 807eaeb19048672337714c1724de7992be8cb3f2124Michael Wright } 808eaeb19048672337714c1724de7992be8cb3f2124Michael Wright } 809eaeb19048672337714c1724de7992be8cb3f2124Michael Wright supportedInput.clear(); 810eaeb19048672337714c1724de7992be8cb3f2124Michael Wright } 8111b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu withinApplication = false; 812eaeb19048672337714c1724de7992be8cb3f2124Michael Wright withinSupportsInput = false; 8131b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu } else if (depth < 3) { 8141b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu if (withinActivity && isMainActivity && isLauncherActivity) { 8151b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu const char *aName = getComponentName(pkg, activityName); 816e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn printf("launchable-activity:"); 8171b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu if (aName != NULL) { 818e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn printf(" name='%s' ", aName); 8191b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu } 820e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn printf(" label='%s' icon='%s'\n", 8211b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu activityLabel.string(), 8221b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu activityIcon.string()); 8231b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu } 8241b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu if (!hasIntentFilter) { 8251b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu hasOtherActivities |= withinActivity; 8261b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu hasOtherReceivers |= withinReceiver; 8271b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu hasOtherServices |= withinService; 828d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski } else { 829d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski if (withinService) { 830d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski hasPaymentService |= (actHostApduService && hasMetaHostPaymentCategory && 831d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski hasBindNfcServicePermission); 832d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski hasPaymentService |= (actOffHostApduService && hasMetaOffHostPaymentCategory && 833d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski hasBindNfcServicePermission); 834d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski } 8351b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu } 8361b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu withinActivity = false; 8371b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu withinService = false; 8381b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu withinReceiver = false; 8391b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu hasIntentFilter = false; 8401b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu isMainActivity = isLauncherActivity = false; 8411b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu } else if (depth < 4) { 8421b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu if (withinIntentFilter) { 8431b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu if (withinActivity) { 8441b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu hasMainActivity |= actMainActivity; 8451b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu hasOtherActivities |= !actMainActivity; 8461b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu } else if (withinReceiver) { 8471b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu hasWidgetReceivers |= actWidgetReceivers; 848b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski hasDeviceAdminReceiver |= (actDeviceAdminEnabled && 849b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski hasBindDeviceAdminPermission); 850b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski hasOtherReceivers |= (!actWidgetReceivers && !actDeviceAdminEnabled); 8511b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu } else if (withinService) { 8521b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu hasImeService |= actImeService; 8531b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu hasWallpaperService |= actWallpaperService; 854b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski hasAccessibilityService |= (actAccessibilityService && 855b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski hasBindAccessibilityServicePermission); 856b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski hasPrintService |= (actPrintService && hasBindPrintServicePermission); 857b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski hasOtherServices |= (!actImeService && !actWallpaperService && 858d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski !actAccessibilityService && !actPrintService && 859d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski !actHostApduService && !actOffHostApduService); 8601b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu } 8611b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu } 8621b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu withinIntentFilter = false; 8631b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu } 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (code != ResXMLTree::START_TAG) { 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project depth++; 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 tag(tree.getElementName(&len)); 8711b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu //printf("Depth %d, %s\n", depth, tag.string()); 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (depth == 1) { 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tag != "manifest") { 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: manifest does not start with <manifest> tag\n"); 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8777ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu pkg = getAttribute(tree, NULL, "package", NULL); 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("package: name='%s' ", pkg.string()); 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t versionCode = getIntegerAttribute(tree, VERSION_CODE_ATTR, &error); 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (error != "") { 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR getting 'android:versionCode' attribute: %s\n", error.string()); 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (versionCode > 0) { 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("versionCode='%d' ", versionCode); 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("versionCode='' "); 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 889cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String8 versionName = getResolvedAttribute(&res, tree, VERSION_NAME_ATTR, &error); 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (error != "") { 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR getting 'android:versionName' attribute: %s\n", error.string()); 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("versionName='%s'\n", versionName.string()); 8957ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu } else if (depth == 2) { 8967ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu withinApplication = false; 8977ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu if (tag == "application") { 8987ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu withinApplication = true; 899e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn 900e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn String8 label; 901e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn const size_t NL = locales.size(); 902e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn for (size_t i=0; i<NL; i++) { 903e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn const char* localeStr = locales[i].string(); 904e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn assets.setLocale(localeStr != NULL ? localeStr : ""); 905e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn String8 llabel = getResolvedAttribute(&res, tree, LABEL_ATTR, &error); 906e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn if (llabel != "") { 907e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn if (localeStr == NULL || strlen(localeStr) == 0) { 908e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn label = llabel; 909e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn printf("application-label:'%s'\n", llabel.string()); 910e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn } else { 911e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn if (label == "") { 912e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn label = llabel; 913e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn } 914e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn printf("application-label-%s:'%s'\n", localeStr, 915e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn llabel.string()); 916e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn } 917e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn } 9187ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu } 919e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn 920e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn ResTable_config tmpConfig = config; 921e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn const size_t ND = densities.size(); 922e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn for (size_t i=0; i<ND; i++) { 923e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn tmpConfig.density = densities[i]; 924e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn assets.setConfiguration(tmpConfig); 925e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn String8 icon = getResolvedAttribute(&res, tree, ICON_ATTR, &error); 926e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn if (icon != "") { 927e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn printf("application-icon-%d:'%s'\n", densities[i], icon.string()); 928e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn } 929e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn } 930e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn assets.setConfiguration(config); 931e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn 9327ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu String8 icon = getResolvedAttribute(&res, tree, ICON_ATTR, &error); 9337ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu if (error != "") { 9347ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu fprintf(stderr, "ERROR getting 'android:icon' attribute: %s\n", error.string()); 9357ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu goto bail; 9367ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu } 937bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn int32_t testOnly = getIntegerAttribute(tree, TEST_ONLY_ATTR, &error, 0); 9387ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu if (error != "") { 939bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn fprintf(stderr, "ERROR getting 'android:testOnly' attribute: %s\n", error.string()); 9407ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu goto bail; 9417ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu } 942e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn printf("application: label='%s' ", label.string()); 943e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn printf("icon='%s'\n", icon.string()); 944bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn if (testOnly != 0) { 945bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn printf("testOnly='%d'\n", testOnly); 946bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn } 947b6ec11ef372a498c4d5fd2317a015b808495a2edDan Morrill 948b6ec11ef372a498c4d5fd2317a015b808495a2edDan Morrill int32_t debuggable = getResolvedIntegerAttribute(&res, tree, DEBUGGABLE_ATTR, &error, 0); 949b6ec11ef372a498c4d5fd2317a015b808495a2edDan Morrill if (error != "") { 950b6ec11ef372a498c4d5fd2317a015b808495a2edDan Morrill fprintf(stderr, "ERROR getting 'android:debuggable' attribute: %s\n", error.string()); 951b6ec11ef372a498c4d5fd2317a015b808495a2edDan Morrill goto bail; 952b6ec11ef372a498c4d5fd2317a015b808495a2edDan Morrill } 953b6ec11ef372a498c4d5fd2317a015b808495a2edDan Morrill if (debuggable != 0) { 954b6ec11ef372a498c4d5fd2317a015b808495a2edDan Morrill printf("application-debuggable\n"); 955b6ec11ef372a498c4d5fd2317a015b808495a2edDan Morrill } 956bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn } else if (tag == "uses-sdk") { 957bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn int32_t code = getIntegerAttribute(tree, MIN_SDK_VERSION_ATTR, &error); 958bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn if (error != "") { 959bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn error = ""; 960bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn String8 name = getResolvedAttribute(&res, tree, MIN_SDK_VERSION_ATTR, &error); 961bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn if (error != "") { 962bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn fprintf(stderr, "ERROR getting 'android:minSdkVersion' attribute: %s\n", 963bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn error.string()); 964bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn goto bail; 965bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn } 966723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn if (name == "Donut") targetSdk = 4; 967bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn printf("sdkVersion:'%s'\n", name.string()); 968bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn } else if (code != -1) { 969723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn targetSdk = code; 970bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn printf("sdkVersion:'%d'\n", code); 971bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn } 97275c498426a17b47d445711bb9e36794b05876a56Suchi Amalapurapu code = getIntegerAttribute(tree, MAX_SDK_VERSION_ATTR, NULL, -1); 97375c498426a17b47d445711bb9e36794b05876a56Suchi Amalapurapu if (code != -1) { 97475c498426a17b47d445711bb9e36794b05876a56Suchi Amalapurapu printf("maxSdkVersion:'%d'\n", code); 97575c498426a17b47d445711bb9e36794b05876a56Suchi Amalapurapu } 976bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn code = getIntegerAttribute(tree, TARGET_SDK_VERSION_ATTR, &error); 977bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn if (error != "") { 978bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn error = ""; 979bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn String8 name = getResolvedAttribute(&res, tree, TARGET_SDK_VERSION_ATTR, &error); 980bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn if (error != "") { 981bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn fprintf(stderr, "ERROR getting 'android:targetSdkVersion' attribute: %s\n", 982bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn error.string()); 983bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn goto bail; 984bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn } 985723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn if (name == "Donut" && targetSdk < 4) targetSdk = 4; 986bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn printf("targetSdkVersion:'%s'\n", name.string()); 987bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn } else if (code != -1) { 988723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn if (targetSdk < code) { 989723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn targetSdk = code; 990723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } 991bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn printf("targetSdkVersion:'%d'\n", code); 992bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn } 993bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn } else if (tag == "uses-configuration") { 994bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn int32_t reqTouchScreen = getIntegerAttribute(tree, 995bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn REQ_TOUCH_SCREEN_ATTR, NULL, 0); 996bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn int32_t reqKeyboardType = getIntegerAttribute(tree, 997bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn REQ_KEYBOARD_TYPE_ATTR, NULL, 0); 998bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn int32_t reqHardKeyboard = getIntegerAttribute(tree, 999bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn REQ_HARD_KEYBOARD_ATTR, NULL, 0); 1000bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn int32_t reqNavigation = getIntegerAttribute(tree, 1001bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn REQ_NAVIGATION_ATTR, NULL, 0); 1002bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn int32_t reqFiveWayNav = getIntegerAttribute(tree, 1003bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn REQ_FIVE_WAY_NAV_ATTR, NULL, 0); 1004cb2d50d0d6e2e37ae02b014999da23ecd32038b8Dianne Hackborn printf("uses-configuration:"); 1005bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn if (reqTouchScreen != 0) { 1006bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn printf(" reqTouchScreen='%d'", reqTouchScreen); 1007bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn } 1008bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn if (reqKeyboardType != 0) { 1009bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn printf(" reqKeyboardType='%d'", reqKeyboardType); 1010bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn } 1011bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn if (reqHardKeyboard != 0) { 1012bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn printf(" reqHardKeyboard='%d'", reqHardKeyboard); 1013bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn } 1014bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn if (reqNavigation != 0) { 1015bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn printf(" reqNavigation='%d'", reqNavigation); 10167ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu } 1017bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn if (reqFiveWayNav != 0) { 1018bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn printf(" reqFiveWayNav='%d'", reqFiveWayNav); 1019bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn } 1020bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn printf("\n"); 1021eaeb19048672337714c1724de7992be8cb3f2124Michael Wright } else if (tag == "supports-input") { 1022eaeb19048672337714c1724de7992be8cb3f2124Michael Wright withinSupportsInput = true; 1023723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } else if (tag == "supports-screens") { 1024723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn smallScreen = getIntegerAttribute(tree, 1025723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn SMALL_SCREEN_ATTR, NULL, 1); 1026723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn normalScreen = getIntegerAttribute(tree, 1027723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn NORMAL_SCREEN_ATTR, NULL, 1); 1028723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn largeScreen = getIntegerAttribute(tree, 1029723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn LARGE_SCREEN_ATTR, NULL, 1); 1030f43489d7d5e1c0c5c9a7e54c22845fcb99765f81Dianne Hackborn xlargeScreen = getIntegerAttribute(tree, 1031f43489d7d5e1c0c5c9a7e54c22845fcb99765f81Dianne Hackborn XLARGE_SCREEN_ATTR, NULL, 1); 1032a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn anyDensity = getIntegerAttribute(tree, 1033a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn ANY_DENSITY_ATTR, NULL, 1); 1034e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn requiresSmallestWidthDp = getIntegerAttribute(tree, 1035e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn REQUIRES_SMALLEST_WIDTH_DP_ATTR, NULL, 0); 1036e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn compatibleWidthLimitDp = getIntegerAttribute(tree, 1037e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn COMPATIBLE_WIDTH_LIMIT_DP_ATTR, NULL, 0); 1038e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn largestWidthLimitDp = getIntegerAttribute(tree, 1039e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn LARGEST_WIDTH_LIMIT_DP_ATTR, NULL, 0); 1040e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn } else if (tag == "uses-feature") { 1041e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn String8 name = getAttribute(tree, NAME_ATTR, &error); 104240b94725dc1c62ea66db0b9502dd81b97dd3e35fSuchi Amalapurapu 104340b94725dc1c62ea66db0b9502dd81b97dd3e35fSuchi Amalapurapu if (name != "" && error == "") { 1044e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn int req = getIntegerAttribute(tree, 1045e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn REQUIRED_ATTR, NULL, 1); 104689d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill 1047e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn if (name == "android.hardware.camera") { 1048e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn specCameraFeature = true; 104989d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } else if (name == "android.hardware.camera.autofocus") { 105089d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // these have no corresponding permission to check for, 105189d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // but should imply the foundational camera permission 105289d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill reqCameraAutofocusFeature = reqCameraAutofocusFeature || req; 105389d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill specCameraAutofocusFeature = true; 105489d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } else if (req && (name == "android.hardware.camera.flash")) { 105589d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // these have no corresponding permission to check for, 105689d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // but should imply the foundational camera permission 105789d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill reqCameraFlashFeature = true; 105889d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } else if (name == "android.hardware.location") { 105989d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill specLocationFeature = true; 106089d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } else if (name == "android.hardware.location.network") { 106189d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill specNetworkLocFeature = true; 106289d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill reqNetworkLocFeature = reqNetworkLocFeature || req; 1063ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn } else if (name == "android.hardware.location.gps") { 1064ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn specGpsFeature = true; 106589d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill reqGpsFeature = reqGpsFeature || req; 106689d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } else if (name == "android.hardware.bluetooth") { 106789d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill specBluetoothFeature = true; 106889d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } else if (name == "android.hardware.touchscreen") { 106989d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill specTouchscreenFeature = true; 107089d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } else if (name == "android.hardware.touchscreen.multitouch") { 107189d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill specMultitouchFeature = true; 107289d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } else if (name == "android.hardware.touchscreen.multitouch.distinct") { 107389d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill reqDistinctMultitouchFeature = reqDistinctMultitouchFeature || req; 107489d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } else if (name == "android.hardware.microphone") { 107589d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill specMicrophoneFeature = true; 107689d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } else if (name == "android.hardware.wifi") { 107789d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill specWiFiFeature = true; 107889d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } else if (name == "android.hardware.telephony") { 107989d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill specTelephonyFeature = true; 108089d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } else if (req && (name == "android.hardware.telephony.gsm" || 108189d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill name == "android.hardware.telephony.cdma")) { 108289d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // these have no corresponding permission to check for, 108389d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // but should imply the foundational telephony permission 108489d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill reqTelephonySubFeature = true; 1085e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn } else if (name == "android.hardware.screen.portrait") { 1086e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn specScreenPortraitFeature = true; 1087e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn } else if (name == "android.hardware.screen.landscape") { 1088e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn specScreenLandscapeFeature = true; 1089e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn } 1090e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn printf("uses-feature%s:'%s'\n", 1091e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn req ? "" : "-not-required", name.string()); 1092e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn } else { 1093e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn int vers = getIntegerAttribute(tree, 1094e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn GL_ES_VERSION_ATTR, &error); 1095e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn if (error == "") { 1096e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn printf("uses-gl-es:'0x%x'\n", vers); 1097e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn } 1098e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn } 1099e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn } else if (tag == "uses-permission") { 1100e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn String8 name = getAttribute(tree, NAME_ATTR, &error); 110140b94725dc1c62ea66db0b9502dd81b97dd3e35fSuchi Amalapurapu if (name != "" && error == "") { 1102e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn if (name == "android.permission.CAMERA") { 1103e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn hasCameraPermission = true; 1104ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn } else if (name == "android.permission.ACCESS_FINE_LOCATION") { 1105ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn hasGpsPermission = true; 110689d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } else if (name == "android.permission.ACCESS_MOCK_LOCATION") { 110789d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill hasMockLocPermission = true; 110889d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } else if (name == "android.permission.ACCESS_COARSE_LOCATION") { 110989d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill hasCoarseLocPermission = true; 111089d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } else if (name == "android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" || 111189d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill name == "android.permission.INSTALL_LOCATION_PROVIDER") { 111289d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill hasGeneralLocPermission = true; 111389d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } else if (name == "android.permission.BLUETOOTH" || 111489d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill name == "android.permission.BLUETOOTH_ADMIN") { 111589d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill hasBluetoothPermission = true; 111689d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } else if (name == "android.permission.RECORD_AUDIO") { 111789d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill hasRecordAudioPermission = true; 111889d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } else if (name == "android.permission.ACCESS_WIFI_STATE" || 111989d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill name == "android.permission.CHANGE_WIFI_STATE" || 112089d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill name == "android.permission.CHANGE_WIFI_MULTICAST_STATE") { 112189d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill hasWiFiPermission = true; 112289d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } else if (name == "android.permission.CALL_PHONE" || 112389d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill name == "android.permission.CALL_PRIVILEGED" || 112489d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill name == "android.permission.MODIFY_PHONE_STATE" || 112589d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill name == "android.permission.PROCESS_OUTGOING_CALLS" || 112689d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill name == "android.permission.READ_SMS" || 112789d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill name == "android.permission.RECEIVE_SMS" || 112889d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill name == "android.permission.RECEIVE_MMS" || 112989d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill name == "android.permission.RECEIVE_WAP_PUSH" || 113089d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill name == "android.permission.SEND_SMS" || 113189d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill name == "android.permission.WRITE_APN_SETTINGS" || 113289d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill name == "android.permission.WRITE_SMS") { 113389d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill hasTelephonyPermission = true; 1134063a44e541335819b673fb1c20a338bbcaf3a3f5Kenny Root } else if (name == "android.permission.WRITE_EXTERNAL_STORAGE") { 1135063a44e541335819b673fb1c20a338bbcaf3a3f5Kenny Root hasWriteExternalStoragePermission = true; 11367924512aa12c6af37d90e8ccfcdf04eb78a294a3Dianne Hackborn } else if (name == "android.permission.READ_EXTERNAL_STORAGE") { 11377924512aa12c6af37d90e8ccfcdf04eb78a294a3Dianne Hackborn hasReadExternalStoragePermission = true; 1138063a44e541335819b673fb1c20a338bbcaf3a3f5Kenny Root } else if (name == "android.permission.READ_PHONE_STATE") { 1139063a44e541335819b673fb1c20a338bbcaf3a3f5Kenny Root hasReadPhoneStatePermission = true; 114031b0e0e86ad061cd8005e80817bcad017e2d56ddDianne Hackborn } else if (name == "android.permission.READ_CONTACTS") { 114131b0e0e86ad061cd8005e80817bcad017e2d56ddDianne Hackborn hasReadContactsPermission = true; 114231b0e0e86ad061cd8005e80817bcad017e2d56ddDianne Hackborn } else if (name == "android.permission.WRITE_CONTACTS") { 114331b0e0e86ad061cd8005e80817bcad017e2d56ddDianne Hackborn hasWriteContactsPermission = true; 114431b0e0e86ad061cd8005e80817bcad017e2d56ddDianne Hackborn } else if (name == "android.permission.READ_CALL_LOG") { 114531b0e0e86ad061cd8005e80817bcad017e2d56ddDianne Hackborn hasReadCallLogPermission = true; 114631b0e0e86ad061cd8005e80817bcad017e2d56ddDianne Hackborn } else if (name == "android.permission.WRITE_CALL_LOG") { 114731b0e0e86ad061cd8005e80817bcad017e2d56ddDianne Hackborn hasWriteCallLogPermission = true; 1148e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn } 1149e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn printf("uses-permission:'%s'\n", name.string()); 11501bcc3d691fd1cb68abced62caf3024e2bb228561Nick Kralevich int req = getIntegerAttribute(tree, REQUIRED_ATTR, NULL, 1); 11511bcc3d691fd1cb68abced62caf3024e2bb228561Nick Kralevich if (!req) { 11521bcc3d691fd1cb68abced62caf3024e2bb228561Nick Kralevich printf("optional-permission:'%s'\n", name.string()); 11531bcc3d691fd1cb68abced62caf3024e2bb228561Nick Kralevich } 1154e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn } else { 1155e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n", 1156e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn error.string()); 1157e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn goto bail; 1158e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn } 115943b6803095e41e6a1cf844a77813c6cdbdc84ec3Dianne Hackborn } else if (tag == "uses-package") { 116043b6803095e41e6a1cf844a77813c6cdbdc84ec3Dianne Hackborn String8 name = getAttribute(tree, NAME_ATTR, &error); 116143b6803095e41e6a1cf844a77813c6cdbdc84ec3Dianne Hackborn if (name != "" && error == "") { 116243b6803095e41e6a1cf844a77813c6cdbdc84ec3Dianne Hackborn printf("uses-package:'%s'\n", name.string()); 116343b6803095e41e6a1cf844a77813c6cdbdc84ec3Dianne Hackborn } else { 116443b6803095e41e6a1cf844a77813c6cdbdc84ec3Dianne Hackborn fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n", 116543b6803095e41e6a1cf844a77813c6cdbdc84ec3Dianne Hackborn error.string()); 116643b6803095e41e6a1cf844a77813c6cdbdc84ec3Dianne Hackborn goto bail; 116743b6803095e41e6a1cf844a77813c6cdbdc84ec3Dianne Hackborn } 1168e2c17f9174144a6eca3fdbed8d5d1370f318f549Jeff Hamilton } else if (tag == "original-package") { 1169e2c17f9174144a6eca3fdbed8d5d1370f318f549Jeff Hamilton String8 name = getAttribute(tree, NAME_ATTR, &error); 1170e2c17f9174144a6eca3fdbed8d5d1370f318f549Jeff Hamilton if (name != "" && error == "") { 1171e2c17f9174144a6eca3fdbed8d5d1370f318f549Jeff Hamilton printf("original-package:'%s'\n", name.string()); 1172e2c17f9174144a6eca3fdbed8d5d1370f318f549Jeff Hamilton } else { 1173e2c17f9174144a6eca3fdbed8d5d1370f318f549Jeff Hamilton fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n", 1174e2c17f9174144a6eca3fdbed8d5d1370f318f549Jeff Hamilton error.string()); 1175e2c17f9174144a6eca3fdbed8d5d1370f318f549Jeff Hamilton goto bail; 1176e2c17f9174144a6eca3fdbed8d5d1370f318f549Jeff Hamilton } 1177096b67f65510a5076f1f845f9e19dda2b30ea6bbDan Morrill } else if (tag == "supports-gl-texture") { 11786f51fc14d0c3df8f9153ae5df992cc2731f099c8Dan Morrill String8 name = getAttribute(tree, NAME_ATTR, &error); 11796f51fc14d0c3df8f9153ae5df992cc2731f099c8Dan Morrill if (name != "" && error == "") { 1180096b67f65510a5076f1f845f9e19dda2b30ea6bbDan Morrill printf("supports-gl-texture:'%s'\n", name.string()); 11816f51fc14d0c3df8f9153ae5df992cc2731f099c8Dan Morrill } else { 11826f51fc14d0c3df8f9153ae5df992cc2731f099c8Dan Morrill fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n", 11836f51fc14d0c3df8f9153ae5df992cc2731f099c8Dan Morrill error.string()); 11846f51fc14d0c3df8f9153ae5df992cc2731f099c8Dan Morrill goto bail; 11856f51fc14d0c3df8f9153ae5df992cc2731f099c8Dan Morrill } 1186a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn } else if (tag == "compatible-screens") { 1187a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn printCompatibleScreens(tree); 1188a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn depth--; 118956088a55ca6c9277f09040a7883117cb127e1e56Kenny Root } else if (tag == "package-verifier") { 119056088a55ca6c9277f09040a7883117cb127e1e56Kenny Root String8 name = getAttribute(tree, NAME_ATTR, &error); 119156088a55ca6c9277f09040a7883117cb127e1e56Kenny Root if (name != "" && error == "") { 119256088a55ca6c9277f09040a7883117cb127e1e56Kenny Root String8 publicKey = getAttribute(tree, PUBLIC_KEY_ATTR, &error); 119356088a55ca6c9277f09040a7883117cb127e1e56Kenny Root if (publicKey != "" && error == "") { 119456088a55ca6c9277f09040a7883117cb127e1e56Kenny Root printf("package-verifier: name='%s' publicKey='%s'\n", 119556088a55ca6c9277f09040a7883117cb127e1e56Kenny Root name.string(), publicKey.string()); 119656088a55ca6c9277f09040a7883117cb127e1e56Kenny Root } 119756088a55ca6c9277f09040a7883117cb127e1e56Kenny Root } 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1199eaeb19048672337714c1724de7992be8cb3f2124Michael Wright } else if (depth == 3) { 12007ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu withinActivity = false; 12017ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu withinReceiver = false; 12021b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu withinService = false; 12031b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu hasIntentFilter = false; 1204d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski hasMetaHostPaymentCategory = false; 1205d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski hasMetaOffHostPaymentCategory = false; 1206d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski hasBindDeviceAdminPermission = false; 1207d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski hasBindInputMethodPermission = false; 1208d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski hasBindAccessibilityServicePermission = false; 1209d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski hasBindPrintServicePermission = false; 1210d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski hasBindNfcServicePermission = false; 1211eaeb19048672337714c1724de7992be8cb3f2124Michael Wright if (withinApplication) { 1212eaeb19048672337714c1724de7992be8cb3f2124Michael Wright if(tag == "activity") { 1213eaeb19048672337714c1724de7992be8cb3f2124Michael Wright withinActivity = true; 1214eaeb19048672337714c1724de7992be8cb3f2124Michael Wright activityName = getAttribute(tree, NAME_ATTR, &error); 1215eaeb19048672337714c1724de7992be8cb3f2124Michael Wright if (error != "") { 1216eaeb19048672337714c1724de7992be8cb3f2124Michael Wright fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n", 1217eaeb19048672337714c1724de7992be8cb3f2124Michael Wright error.string()); 1218eaeb19048672337714c1724de7992be8cb3f2124Michael Wright goto bail; 1219eaeb19048672337714c1724de7992be8cb3f2124Michael Wright } 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1221eaeb19048672337714c1724de7992be8cb3f2124Michael Wright activityLabel = getResolvedAttribute(&res, tree, LABEL_ATTR, &error); 1222eaeb19048672337714c1724de7992be8cb3f2124Michael Wright if (error != "") { 1223eaeb19048672337714c1724de7992be8cb3f2124Michael Wright fprintf(stderr, "ERROR getting 'android:label' attribute: %s\n", 1224eaeb19048672337714c1724de7992be8cb3f2124Michael Wright error.string()); 1225eaeb19048672337714c1724de7992be8cb3f2124Michael Wright goto bail; 1226eaeb19048672337714c1724de7992be8cb3f2124Michael Wright } 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1228eaeb19048672337714c1724de7992be8cb3f2124Michael Wright activityIcon = getResolvedAttribute(&res, tree, ICON_ATTR, &error); 1229eaeb19048672337714c1724de7992be8cb3f2124Michael Wright if (error != "") { 1230eaeb19048672337714c1724de7992be8cb3f2124Michael Wright fprintf(stderr, "ERROR getting 'android:icon' attribute: %s\n", 1231eaeb19048672337714c1724de7992be8cb3f2124Michael Wright error.string()); 1232eaeb19048672337714c1724de7992be8cb3f2124Michael Wright goto bail; 1233eaeb19048672337714c1724de7992be8cb3f2124Michael Wright } 1234f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn 1235eaeb19048672337714c1724de7992be8cb3f2124Michael Wright int32_t orien = getResolvedIntegerAttribute(&res, tree, 1236eaeb19048672337714c1724de7992be8cb3f2124Michael Wright SCREEN_ORIENTATION_ATTR, &error); 1237eaeb19048672337714c1724de7992be8cb3f2124Michael Wright if (error == "") { 1238eaeb19048672337714c1724de7992be8cb3f2124Michael Wright if (orien == 0 || orien == 6 || orien == 8) { 1239eaeb19048672337714c1724de7992be8cb3f2124Michael Wright // Requests landscape, sensorLandscape, or reverseLandscape. 1240eaeb19048672337714c1724de7992be8cb3f2124Michael Wright reqScreenLandscapeFeature = true; 1241eaeb19048672337714c1724de7992be8cb3f2124Michael Wright } else if (orien == 1 || orien == 7 || orien == 9) { 1242eaeb19048672337714c1724de7992be8cb3f2124Michael Wright // Requests portrait, sensorPortrait, or reversePortrait. 1243eaeb19048672337714c1724de7992be8cb3f2124Michael Wright reqScreenPortraitFeature = true; 1244eaeb19048672337714c1724de7992be8cb3f2124Michael Wright } 1245f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn } 1246eaeb19048672337714c1724de7992be8cb3f2124Michael Wright } else if (tag == "uses-library") { 1247eaeb19048672337714c1724de7992be8cb3f2124Michael Wright String8 libraryName = getAttribute(tree, NAME_ATTR, &error); 1248eaeb19048672337714c1724de7992be8cb3f2124Michael Wright if (error != "") { 1249eaeb19048672337714c1724de7992be8cb3f2124Michael Wright fprintf(stderr, 1250eaeb19048672337714c1724de7992be8cb3f2124Michael Wright "ERROR getting 'android:name' attribute for uses-library" 1251eaeb19048672337714c1724de7992be8cb3f2124Michael Wright " %s\n", error.string()); 1252eaeb19048672337714c1724de7992be8cb3f2124Michael Wright goto bail; 1253eaeb19048672337714c1724de7992be8cb3f2124Michael Wright } 1254eaeb19048672337714c1724de7992be8cb3f2124Michael Wright int req = getIntegerAttribute(tree, 1255eaeb19048672337714c1724de7992be8cb3f2124Michael Wright REQUIRED_ATTR, NULL, 1); 1256eaeb19048672337714c1724de7992be8cb3f2124Michael Wright printf("uses-library%s:'%s'\n", 1257eaeb19048672337714c1724de7992be8cb3f2124Michael Wright req ? "" : "-not-required", libraryName.string()); 1258eaeb19048672337714c1724de7992be8cb3f2124Michael Wright } else if (tag == "receiver") { 1259eaeb19048672337714c1724de7992be8cb3f2124Michael Wright withinReceiver = true; 1260eaeb19048672337714c1724de7992be8cb3f2124Michael Wright receiverName = getAttribute(tree, NAME_ATTR, &error); 12617ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu 1262eaeb19048672337714c1724de7992be8cb3f2124Michael Wright if (error != "") { 1263eaeb19048672337714c1724de7992be8cb3f2124Michael Wright fprintf(stderr, 1264eaeb19048672337714c1724de7992be8cb3f2124Michael Wright "ERROR getting 'android:name' attribute for receiver:" 1265eaeb19048672337714c1724de7992be8cb3f2124Michael Wright " %s\n", error.string()); 1266eaeb19048672337714c1724de7992be8cb3f2124Michael Wright goto bail; 1267eaeb19048672337714c1724de7992be8cb3f2124Michael Wright } 1268b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski 1269b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski String8 permission = getAttribute(tree, PERMISSION_ATTR, &error); 1270b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski if (error == "") { 1271b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski if (permission == "android.permission.BIND_DEVICE_ADMIN") { 1272b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski hasBindDeviceAdminPermission = true; 1273b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski } 1274b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski } else { 1275b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski fprintf(stderr, "ERROR getting 'android:permission' attribute for" 1276b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski " receiver '%s': %s\n", receiverName.string(), error.string()); 1277b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski } 1278eaeb19048672337714c1724de7992be8cb3f2124Michael Wright } else if (tag == "service") { 1279eaeb19048672337714c1724de7992be8cb3f2124Michael Wright withinService = true; 1280eaeb19048672337714c1724de7992be8cb3f2124Michael Wright serviceName = getAttribute(tree, NAME_ATTR, &error); 12811b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu 1282eaeb19048672337714c1724de7992be8cb3f2124Michael Wright if (error != "") { 1283eaeb19048672337714c1724de7992be8cb3f2124Michael Wright fprintf(stderr, "ERROR getting 'android:name' attribute for" 1284eaeb19048672337714c1724de7992be8cb3f2124Michael Wright " service: %s\n", error.string()); 1285eaeb19048672337714c1724de7992be8cb3f2124Michael Wright goto bail; 1286eaeb19048672337714c1724de7992be8cb3f2124Michael Wright } 1287b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski 1288b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski String8 permission = getAttribute(tree, PERMISSION_ATTR, &error); 1289b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski if (error == "") { 1290b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski if (permission == "android.permission.BIND_INPUT_METHOD") { 1291b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski hasBindInputMethodPermission = true; 1292b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski } else if (permission == "android.permission.BIND_ACCESSIBILITY_SERVICE") { 1293b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski hasBindAccessibilityServicePermission = true; 1294b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski } else if (permission == "android.permission.BIND_PRINT_SERVICE") { 1295b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski hasBindPrintServicePermission = true; 1296d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski } else if (permission == "android.permission.BIND_NFC_SERVICE") { 1297d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski hasBindNfcServicePermission = true; 1298b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski } 1299b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski } else { 1300b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski fprintf(stderr, "ERROR getting 'android:permission' attribute for" 1301b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski " service '%s': %s\n", serviceName.string(), error.string()); 1302b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski } 1303eaeb19048672337714c1724de7992be8cb3f2124Michael Wright } 1304eaeb19048672337714c1724de7992be8cb3f2124Michael Wright } else if (withinSupportsInput && tag == "input-type") { 1305eaeb19048672337714c1724de7992be8cb3f2124Michael Wright String8 name = getAttribute(tree, NAME_ATTR, &error); 1306eaeb19048672337714c1724de7992be8cb3f2124Michael Wright if (name != "" && error == "") { 1307eaeb19048672337714c1724de7992be8cb3f2124Michael Wright supportedInput.add(name); 1308eaeb19048672337714c1724de7992be8cb3f2124Michael Wright } else { 1309eaeb19048672337714c1724de7992be8cb3f2124Michael Wright fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n", 1310eaeb19048672337714c1724de7992be8cb3f2124Michael Wright error.string()); 13111b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu goto bail; 13121b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu } 13137ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu } 1314d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski } else if (depth == 4) { 1315d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski if (tag == "intent-filter") { 1316d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski hasIntentFilter = true; 1317d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski withinIntentFilter = true; 1318d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski actMainActivity = false; 1319d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski actWidgetReceivers = false; 1320d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski actImeService = false; 1321d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski actWallpaperService = false; 1322d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski actAccessibilityService = false; 1323d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski actPrintService = false; 1324d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski actDeviceAdminEnabled = false; 1325d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski actHostApduService = false; 1326d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski actOffHostApduService = false; 1327d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski } else if (withinService && tag == "meta-data") { 1328d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski String8 name = getAttribute(tree, NAME_ATTR, &error); 1329d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski if (error != "") { 1330d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski fprintf(stderr, "ERROR getting 'android:name' attribute for" 1331d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski " meta-data tag in service '%s': %s\n", serviceName.string(), error.string()); 1332d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski goto bail; 1333d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski } 1334d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski 1335d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski if (name == "android.nfc.cardemulation.host_apdu_service" || 1336d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski name == "android.nfc.cardemulation.off_host_apdu_service") { 1337d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski bool offHost = true; 1338d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski if (name == "android.nfc.cardemulation.host_apdu_service") { 1339d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski offHost = false; 1340d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski } 1341d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski 1342d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski String8 xmlPath = getResolvedAttribute(&res, tree, RESOURCE_ATTR, &error); 1343d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski if (error != "") { 1344d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski fprintf(stderr, "ERROR getting 'android:resource' attribute for" 1345d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski " meta-data tag in service '%s': %s\n", serviceName.string(), error.string()); 1346d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski goto bail; 1347d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski } 1348d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski 1349d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski Vector<String8> categories = getNfcAidCategories(assets, xmlPath, 1350d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski offHost, &error); 1351d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski if (error != "") { 1352d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski fprintf(stderr, "ERROR getting AID category for service '%s'\n", 1353d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski serviceName.string()); 1354d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski goto bail; 1355d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski } 1356d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski 1357d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski const size_t catLen = categories.size(); 1358d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski for (size_t i = 0; i < catLen; i++) { 1359d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski bool paymentCategory = (categories[i] == "payment"); 1360d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski if (offHost) { 1361d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski hasMetaOffHostPaymentCategory |= paymentCategory; 1362d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski } else { 1363d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski hasMetaHostPaymentCategory |= paymentCategory; 1364d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski } 1365d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski } 1366d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski } 1367d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski } 13681b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu } else if ((depth == 5) && withinIntentFilter){ 13691b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu String8 action; 13701b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu if (tag == "action") { 13711b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu action = getAttribute(tree, NAME_ATTR, &error); 13721b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu if (error != "") { 13731b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n", error.string()); 13741b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu goto bail; 13751b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu } 13761b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu if (withinActivity) { 1377bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn if (action == "android.intent.action.MAIN") { 1378bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn isMainActivity = true; 13791b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu actMainActivity = true; 1380bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn } 13811b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu } else if (withinReceiver) { 13821b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu if (action == "android.appwidget.action.APPWIDGET_UPDATE") { 13831b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu actWidgetReceivers = true; 1384b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski } else if (action == "android.app.action.DEVICE_ADMIN_ENABLED") { 1385b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski actDeviceAdminEnabled = true; 13867ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu } 13871b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu } else if (withinService) { 13881b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu if (action == "android.view.InputMethod") { 13891b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu actImeService = true; 13901b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu } else if (action == "android.service.wallpaper.WallpaperService") { 13911b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu actWallpaperService = true; 1392b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski } else if (action == "android.accessibilityservice.AccessibilityService") { 1393b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski actAccessibilityService = true; 1394b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski } else if (action == "android.printservice.PrintService") { 1395b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski actPrintService = true; 1396d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski } else if (action == "android.nfc.cardemulation.action.HOST_APDU_SERVICE") { 1397d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski actHostApduService = true; 1398d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski } else if (action == "android.nfc.cardemulation.action.OFF_HOST_APDU_SERVICE") { 1399d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski actOffHostApduService = true; 14007ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu } 14017ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu } 14021b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu if (action == "android.intent.action.SEARCH") { 14031b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu isSearchable = true; 14047ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu } 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14071b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu if (tag == "category") { 14081b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu String8 category = getAttribute(tree, NAME_ATTR, &error); 14091b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu if (error != "") { 14101b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu fprintf(stderr, "ERROR getting 'name' attribute: %s\n", error.string()); 14111b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu goto bail; 14121b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu } 14131b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu if (withinActivity) { 14141b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu if (category == "android.intent.category.LAUNCHER") { 14151b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu isLauncherActivity = true; 14161b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu } 14171b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu } 14187ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu } 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1421063a44e541335819b673fb1c20a338bbcaf3a3f5Kenny Root 1422063a44e541335819b673fb1c20a338bbcaf3a3f5Kenny Root // Pre-1.6 implicitly granted permission compatibility logic 1423063a44e541335819b673fb1c20a338bbcaf3a3f5Kenny Root if (targetSdk < 4) { 1424063a44e541335819b673fb1c20a338bbcaf3a3f5Kenny Root if (!hasWriteExternalStoragePermission) { 1425063a44e541335819b673fb1c20a338bbcaf3a3f5Kenny Root printf("uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE'\n"); 14264aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn printf("uses-implied-permission:'android.permission.WRITE_EXTERNAL_STORAGE'," \ 14274aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn "'targetSdkVersion < 4'\n"); 14287924512aa12c6af37d90e8ccfcdf04eb78a294a3Dianne Hackborn hasWriteExternalStoragePermission = true; 1429063a44e541335819b673fb1c20a338bbcaf3a3f5Kenny Root } 1430063a44e541335819b673fb1c20a338bbcaf3a3f5Kenny Root if (!hasReadPhoneStatePermission) { 1431063a44e541335819b673fb1c20a338bbcaf3a3f5Kenny Root printf("uses-permission:'android.permission.READ_PHONE_STATE'\n"); 14324aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn printf("uses-implied-permission:'android.permission.READ_PHONE_STATE'," \ 14334aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn "'targetSdkVersion < 4'\n"); 1434063a44e541335819b673fb1c20a338bbcaf3a3f5Kenny Root } 1435063a44e541335819b673fb1c20a338bbcaf3a3f5Kenny Root } 14361b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu 14377924512aa12c6af37d90e8ccfcdf04eb78a294a3Dianne Hackborn // If the application has requested WRITE_EXTERNAL_STORAGE, we will 14382bd8d0403be62df679f0f94ab4d84c9ae9a2e918Dianne Hackborn // force them to always take READ_EXTERNAL_STORAGE as well. We always 14392bd8d0403be62df679f0f94ab4d84c9ae9a2e918Dianne Hackborn // do this (regardless of target API version) because we can't have 14402bd8d0403be62df679f0f94ab4d84c9ae9a2e918Dianne Hackborn // an app with write permission but not read permission. 14417924512aa12c6af37d90e8ccfcdf04eb78a294a3Dianne Hackborn if (!hasReadExternalStoragePermission && hasWriteExternalStoragePermission) { 14427924512aa12c6af37d90e8ccfcdf04eb78a294a3Dianne Hackborn printf("uses-permission:'android.permission.READ_EXTERNAL_STORAGE'\n"); 14434aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn printf("uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE'," \ 14444aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn "'requested WRITE_EXTERNAL_STORAGE'\n"); 14457924512aa12c6af37d90e8ccfcdf04eb78a294a3Dianne Hackborn } 14467924512aa12c6af37d90e8ccfcdf04eb78a294a3Dianne Hackborn 144731b0e0e86ad061cd8005e80817bcad017e2d56ddDianne Hackborn // Pre-JellyBean call log permission compatibility. 144831b0e0e86ad061cd8005e80817bcad017e2d56ddDianne Hackborn if (targetSdk < 16) { 144931b0e0e86ad061cd8005e80817bcad017e2d56ddDianne Hackborn if (!hasReadCallLogPermission && hasReadContactsPermission) { 145031b0e0e86ad061cd8005e80817bcad017e2d56ddDianne Hackborn printf("uses-permission:'android.permission.READ_CALL_LOG'\n"); 14514aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn printf("uses-implied-permission:'android.permission.READ_CALL_LOG'," \ 14524aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn "'targetSdkVersion < 16 and requested READ_CONTACTS'\n"); 145331b0e0e86ad061cd8005e80817bcad017e2d56ddDianne Hackborn } 145431b0e0e86ad061cd8005e80817bcad017e2d56ddDianne Hackborn if (!hasWriteCallLogPermission && hasWriteContactsPermission) { 145531b0e0e86ad061cd8005e80817bcad017e2d56ddDianne Hackborn printf("uses-permission:'android.permission.WRITE_CALL_LOG'\n"); 14564aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn printf("uses-implied-permission:'android.permission.WRITE_CALL_LOG'," \ 14574aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn "'targetSdkVersion < 16 and requested WRITE_CONTACTS'\n"); 145831b0e0e86ad061cd8005e80817bcad017e2d56ddDianne Hackborn } 145931b0e0e86ad061cd8005e80817bcad017e2d56ddDianne Hackborn } 146031b0e0e86ad061cd8005e80817bcad017e2d56ddDianne Hackborn 146189d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill /* The following blocks handle printing "inferred" uses-features, based 146289d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill * on whether related features or permissions are used by the app. 146389d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill * Note that the various spec*Feature variables denote whether the 146489d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill * relevant tag was *present* in the AndroidManfest, not that it was 146589d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill * present and set to true. 146689d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill */ 146789d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // Camera-related back-compatibility logic 146889d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill if (!specCameraFeature) { 14694aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn if (reqCameraFlashFeature) { 147089d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // if app requested a sub-feature (autofocus or flash) and didn't 147189d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // request the base camera feature, we infer that it meant to 147289d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill printf("uses-feature:'android.hardware.camera'\n"); 14734aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn printf("uses-implied-feature:'android.hardware.camera'," \ 14744aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn "'requested android.hardware.camera.flash feature'\n"); 14754aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn } else if (reqCameraAutofocusFeature) { 14764aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn // if app requested a sub-feature (autofocus or flash) and didn't 14774aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn // request the base camera feature, we infer that it meant to 14784aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn printf("uses-feature:'android.hardware.camera'\n"); 14794aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn printf("uses-implied-feature:'android.hardware.camera'," \ 14804aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn "'requested android.hardware.camera.autofocus feature'\n"); 148189d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } else if (hasCameraPermission) { 148289d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // if app wants to use camera but didn't request the feature, we infer 148389d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // that it meant to, and further that it wants autofocus 148489d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // (which was the 1.0 - 1.5 behavior) 148589d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill printf("uses-feature:'android.hardware.camera'\n"); 148689d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill if (!specCameraAutofocusFeature) { 148789d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill printf("uses-feature:'android.hardware.camera.autofocus'\n"); 14884aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn printf("uses-implied-feature:'android.hardware.camera.autofocus'," \ 14894aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn "'requested android.permission.CAMERA permission'\n"); 149089d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } 149189d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } 1492e5276a74746b5e8f09b05a50155e7aa0bbb4a747Dianne Hackborn } 1493dbe7a68cc13ae135b33769918932838d2d447169Doug Zongker 149489d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // Location-related back-compatibility logic 149589d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill if (!specLocationFeature && 149689d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill (hasMockLocPermission || hasCoarseLocPermission || hasGpsPermission || 149789d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill hasGeneralLocPermission || reqNetworkLocFeature || reqGpsFeature)) { 149889d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // if app either takes a location-related permission or requests one of the 149989d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // sub-features, we infer that it also meant to request the base location feature 150089d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill printf("uses-feature:'android.hardware.location'\n"); 15014aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn printf("uses-implied-feature:'android.hardware.location'," \ 15024aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn "'requested a location access permission'\n"); 150389d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } 1504ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn if (!specGpsFeature && hasGpsPermission) { 150589d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // if app takes GPS (FINE location) perm but does not request the GPS 150689d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // feature, we infer that it meant to 1507ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn printf("uses-feature:'android.hardware.location.gps'\n"); 15084aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn printf("uses-implied-feature:'android.hardware.location.gps'," \ 15094aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn "'requested android.permission.ACCESS_FINE_LOCATION permission'\n"); 1510ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn } 151189d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill if (!specNetworkLocFeature && hasCoarseLocPermission) { 151289d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // if app takes Network location (COARSE location) perm but does not request the 151389d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // network location feature, we infer that it meant to 151489d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill printf("uses-feature:'android.hardware.location.network'\n"); 15154aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn printf("uses-implied-feature:'android.hardware.location.network'," \ 1516ec559ff78caa16cffcc7b9d688fe911e8945e17dDianne Hackborn "'requested android.permission.ACCESS_COARSE_LOCATION permission'\n"); 151789d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } 151889d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill 151989d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // Bluetooth-related compatibility logic 15206b22d81aa35d9a9b32670995c002e92588b2fe09Dan Morrill if (!specBluetoothFeature && hasBluetoothPermission && (targetSdk > 4)) { 152189d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // if app takes a Bluetooth permission but does not request the Bluetooth 152289d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // feature, we infer that it meant to 152389d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill printf("uses-feature:'android.hardware.bluetooth'\n"); 15244aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn printf("uses-implied-feature:'android.hardware.bluetooth'," \ 15254aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn "'requested android.permission.BLUETOOTH or android.permission.BLUETOOTH_ADMIN " \ 15264aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn "permission and targetSdkVersion > 4'\n"); 152789d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } 152889d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill 152989d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // Microphone-related compatibility logic 153089d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill if (!specMicrophoneFeature && hasRecordAudioPermission) { 153189d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // if app takes the record-audio permission but does not request the microphone 153289d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // feature, we infer that it meant to 153389d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill printf("uses-feature:'android.hardware.microphone'\n"); 15344aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn printf("uses-implied-feature:'android.hardware.microphone'," \ 15354aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn "'requested android.permission.RECORD_AUDIO permission'\n"); 153689d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } 153789d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill 153889d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // WiFi-related compatibility logic 153989d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill if (!specWiFiFeature && hasWiFiPermission) { 154089d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // if app takes one of the WiFi permissions but does not request the WiFi 154189d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // feature, we infer that it meant to 154289d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill printf("uses-feature:'android.hardware.wifi'\n"); 15434aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn printf("uses-implied-feature:'android.hardware.wifi'," \ 15444aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn "'requested android.permission.ACCESS_WIFI_STATE, " \ 15454aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn "android.permission.CHANGE_WIFI_STATE, or " \ 15464aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn "android.permission.CHANGE_WIFI_MULTICAST_STATE permission'\n"); 154789d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } 154889d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill 154989d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // Telephony-related compatibility logic 155089d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill if (!specTelephonyFeature && (hasTelephonyPermission || reqTelephonySubFeature)) { 155189d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // if app takes one of the telephony permissions or requests a sub-feature but 155289d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // does not request the base telephony feature, we infer that it meant to 155389d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill printf("uses-feature:'android.hardware.telephony'\n"); 15544aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn printf("uses-implied-feature:'android.hardware.telephony'," \ 15554aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn "'requested a telephony-related permission or feature'\n"); 155689d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } 155789d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill 155889d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // Touchscreen-related back-compatibility logic 155989d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill if (!specTouchscreenFeature) { // not a typo! 156089d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // all apps are presumed to require a touchscreen, unless they explicitly say 156189d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // <uses-feature android:name="android.hardware.touchscreen" android:required="false"/> 156289d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // Note that specTouchscreenFeature is true if the tag is present, regardless 156389d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // of whether its value is true or false, so this is safe 156489d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill printf("uses-feature:'android.hardware.touchscreen'\n"); 15654aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn printf("uses-implied-feature:'android.hardware.touchscreen'," \ 15664aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn "'assumed you require a touch screen unless explicitly made optional'\n"); 156789d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } 156889d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill if (!specMultitouchFeature && reqDistinctMultitouchFeature) { 156989d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // if app takes one of the telephony permissions or requests a sub-feature but 157089d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill // does not request the base telephony feature, we infer that it meant to 157189d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill printf("uses-feature:'android.hardware.touchscreen.multitouch'\n"); 15724aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn printf("uses-implied-feature:'android.hardware.touchscreen.multitouch'," \ 15734aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn "'requested android.hardware.touchscreen.multitouch.distinct feature'\n"); 157489d97c1418c7a8b54fd57cc90daa1b1a98848bf6Dan Morrill } 1575ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn 1576e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn // Landscape/portrait-related compatibility logic 1577f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn if (!specScreenLandscapeFeature && !specScreenPortraitFeature) { 1578f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn // If the app has specified any activities in its manifest 1579f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn // that request a specific orientation, then assume that 1580f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn // orientation is required. 1581f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn if (reqScreenLandscapeFeature) { 1582f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn printf("uses-feature:'android.hardware.screen.landscape'\n"); 15834aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn printf("uses-implied-feature:'android.hardware.screen.landscape'," \ 15844aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn "'one or more activities have specified a landscape orientation'\n"); 1585f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn } 1586f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn if (reqScreenPortraitFeature) { 1587f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn printf("uses-feature:'android.hardware.screen.portrait'\n"); 15884aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn printf("uses-implied-feature:'android.hardware.screen.portrait'," \ 15894aa14b912fa7b0e8f2f1deb3e66dab4668de1e12Dianne Hackborn "'one or more activities have specified a portrait orientation'\n"); 1590f77ae6e65a7ab47e7ab0ee1536d708b6e56fe45bDianne Hackborn } 1591e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn } 1592e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn 15931b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu if (hasMainActivity) { 15941b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu printf("main\n"); 15951b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu } 15961b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu if (hasWidgetReceivers) { 15971b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu printf("app-widget\n"); 15981b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu } 1599b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski if (hasDeviceAdminReceiver) { 1600b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski printf("device-admin\n"); 1601b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski } 16021b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu if (hasImeService) { 16031b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu printf("ime\n"); 16041b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu } 16051b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu if (hasWallpaperService) { 16061b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu printf("wallpaper\n"); 16071b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu } 1608b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski if (hasAccessibilityService) { 1609b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski printf("accessibility\n"); 1610b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski } 1611b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski if (hasPrintService) { 1612b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski printf("print\n"); 1613b1249b822cef4e187814b83ae788f71842b88c28Adam Lesinski } 1614d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski if (hasPaymentService) { 1615d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski printf("payment\n"); 1616d831e80a2fa80d18867e70927e4e8cd797ead56fAdam Lesinski } 16171b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu if (hasOtherActivities) { 16181b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu printf("other-activities\n"); 16191b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu } 16201b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu if (isSearchable) { 16211b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu printf("search\n"); 16221b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu } 16231b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu if (hasOtherReceivers) { 16241b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu printf("other-receivers\n"); 16251b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu } 16261b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu if (hasOtherServices) { 16271b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu printf("other-services\n"); 16281b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu } 16291b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu 1630e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn // For modern apps, if screen size buckets haven't been specified 1631e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn // but the new width ranges have, then infer the buckets from them. 1632e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn if (smallScreen > 0 && normalScreen > 0 && largeScreen > 0 && xlargeScreen > 0 1633e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn && requiresSmallestWidthDp > 0) { 1634e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn int compatWidth = compatibleWidthLimitDp; 1635e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn if (compatWidth <= 0) compatWidth = requiresSmallestWidthDp; 1636e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn if (requiresSmallestWidthDp <= 240 && compatWidth >= 240) { 1637e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn smallScreen = -1; 1638e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn } else { 1639e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn smallScreen = 0; 1640e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn } 1641e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn if (requiresSmallestWidthDp <= 320 && compatWidth >= 320) { 1642e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn normalScreen = -1; 1643e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn } else { 1644e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn normalScreen = 0; 1645e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn } 1646e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn if (requiresSmallestWidthDp <= 480 && compatWidth >= 480) { 1647e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn largeScreen = -1; 1648e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn } else { 1649e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn largeScreen = 0; 1650e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn } 1651e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn if (requiresSmallestWidthDp <= 720 && compatWidth >= 720) { 1652e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn xlargeScreen = -1; 1653e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn } else { 1654e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn xlargeScreen = 0; 1655e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn } 1656e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn } 1657e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn 1658723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn // Determine default values for any unspecified screen sizes, 1659723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn // based on the target SDK of the package. As of 4 (donut) 1660723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn // the screen size support was introduced, so all default to 1661723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn // enabled. 1662723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn if (smallScreen > 0) { 1663723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn smallScreen = targetSdk >= 4 ? -1 : 0; 1664723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } 1665723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn if (normalScreen > 0) { 1666723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn normalScreen = -1; 1667723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } 1668723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn if (largeScreen > 0) { 1669723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn largeScreen = targetSdk >= 4 ? -1 : 0; 1670723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } 1671f43489d7d5e1c0c5c9a7e54c22845fcb99765f81Dianne Hackborn if (xlargeScreen > 0) { 1672d58fb97ddf052b3ceac921ac7e936af990392b2cScott Main // Introduced in Gingerbread. 1673d58fb97ddf052b3ceac921ac7e936af990392b2cScott Main xlargeScreen = targetSdk >= 9 ? -1 : 0; 1674f43489d7d5e1c0c5c9a7e54c22845fcb99765f81Dianne Hackborn } 1675a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn if (anyDensity > 0) { 1676e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn anyDensity = (targetSdk >= 4 || requiresSmallestWidthDp > 0 1677e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn || compatibleWidthLimitDp > 0) ? -1 : 0; 1678a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn } 1679723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn printf("supports-screens:"); 1680723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn if (smallScreen != 0) printf(" 'small'"); 1681723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn if (normalScreen != 0) printf(" 'normal'"); 1682723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn if (largeScreen != 0) printf(" 'large'"); 1683f43489d7d5e1c0c5c9a7e54c22845fcb99765f81Dianne Hackborn if (xlargeScreen != 0) printf(" 'xlarge'"); 1684723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn printf("\n"); 1685a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn printf("supports-any-density: '%s'\n", anyDensity ? "true" : "false"); 1686e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn if (requiresSmallestWidthDp > 0) { 1687e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn printf("requires-smallest-width:'%d'\n", requiresSmallestWidthDp); 1688e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn } 1689e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn if (compatibleWidthLimitDp > 0) { 1690e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn printf("compatible-width-limit:'%d'\n", compatibleWidthLimitDp); 1691e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn } 1692e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn if (largestWidthLimitDp > 0) { 1693e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn printf("largest-width-limit:'%d'\n", largestWidthLimitDp); 1694e289bff0ec2b1af4ba773e0c8d49d5fd46eb9921Dianne Hackborn } 1695a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn 16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("locales:"); 1697e17086ba346009a26cc2299b133a0fe602acb6ecDianne Hackborn const size_t NL = locales.size(); 1698e17086ba346009a26cc2299b133a0fe602acb6ecDianne Hackborn for (size_t i=0; i<NL; i++) { 16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* localeStr = locales[i].string(); 17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (localeStr == NULL || strlen(localeStr) == 0) { 17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project localeStr = "--_--"; 17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf(" '%s'", localeStr); 17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("\n"); 17061b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu 1707e17086ba346009a26cc2299b133a0fe602acb6ecDianne Hackborn printf("densities:"); 1708e17086ba346009a26cc2299b133a0fe602acb6ecDianne Hackborn const size_t ND = densities.size(); 1709e17086ba346009a26cc2299b133a0fe602acb6ecDianne Hackborn for (size_t i=0; i<ND; i++) { 1710e17086ba346009a26cc2299b133a0fe602acb6ecDianne Hackborn printf(" '%d'", densities[i]); 1711e17086ba346009a26cc2299b133a0fe602acb6ecDianne Hackborn } 1712e17086ba346009a26cc2299b133a0fe602acb6ecDianne Hackborn printf("\n"); 17131b125980c5de597c18a179b9b02b9a5afe106895Suchi Amalapurapu 1714bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn AssetDir* dir = assets.openNonAssetDir(assetsCookie, "lib"); 1715bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn if (dir != NULL) { 1716bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn if (dir->getFileCount() > 0) { 1717bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn printf("native-code:"); 1718bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn for (size_t i=0; i<dir->getFileCount(); i++) { 1719bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn printf(" '%s'", dir->getFileName(i).string()); 1720bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn } 1721bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn printf("\n"); 1722bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn } 1723bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn delete dir; 1724bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn } 1725e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill } else if (strcmp("badger", option) == 0) { 17266c997a9e880e08c354ffd809bd62df9e25e9c4d4Dianne Hackborn printf("%s", CONSOLE_DATA); 17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strcmp("configurations", option) == 0) { 17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Vector<ResTable_config> configs; 17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res.getConfigurations(&configs); 17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = configs.size(); 17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t i=0; i<N; i++) { 17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("%s\n", configs[i].toString().string()); 17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: unknown dump option '%s'\n", option); 17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = NO_ERROR; 17417ef189d0a90f3c9a409512ab7dce9304639df481Suchi Amalapurapu 17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbail: 17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (asset) { 17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete asset; 17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (result != NO_ERROR); 17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Handle the "add" command, which wants to add files to a new or 17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pre-existing archive. 17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint doAdd(Bundle* bundle) 17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ZipFile* zip = NULL; 17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t result = UNKNOWN_ERROR; 17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* zipFileName; 17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bundle->getUpdate()) { 17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* avoid confusion */ 17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: can't use '-u' with add\n"); 17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bundle->getFileSpecCount() < 1) { 17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: must specify zip file name\n"); 17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project zipFileName = bundle->getFileSpecEntry(0); 17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bundle->getFileSpecCount() < 2) { 17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "NOTE: nothing to do\n"); 17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project zip = openReadWrite(zipFileName, true); 17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (zip == NULL) { 17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: failed opening/creating '%s' as Zip file\n", zipFileName); 17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 1; i < bundle->getFileSpecCount(); i++) { 17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* fileName = bundle->getFileSpecEntry(i); 17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcasecmp(String8(fileName).getPathExtension().string(), ".gz") == 0) { 17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf(" '%s'... (from gzip)\n", fileName); 17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = zip->addGzip(fileName, String8(fileName).getBasePath().string(), NULL); 17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1790dbe7a68cc13ae135b33769918932838d2d447169Doug Zongker if (bundle->getJunkPath()) { 1791dbe7a68cc13ae135b33769918932838d2d447169Doug Zongker String8 storageName = String8(fileName).getPathLeaf(); 1792dbe7a68cc13ae135b33769918932838d2d447169Doug Zongker printf(" '%s' as '%s'...\n", fileName, storageName.string()); 1793dbe7a68cc13ae135b33769918932838d2d447169Doug Zongker result = zip->add(fileName, storageName.string(), 1794dbe7a68cc13ae135b33769918932838d2d447169Doug Zongker bundle->getCompressionMethod(), NULL); 1795dbe7a68cc13ae135b33769918932838d2d447169Doug Zongker } else { 1796dbe7a68cc13ae135b33769918932838d2d447169Doug Zongker printf(" '%s'...\n", fileName); 1797dbe7a68cc13ae135b33769918932838d2d447169Doug Zongker result = zip->add(fileName, bundle->getCompressionMethod(), NULL); 1798dbe7a68cc13ae135b33769918932838d2d447169Doug Zongker } 17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result != NO_ERROR) { 18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "Unable to add '%s' to '%s'", bundle->getFileSpecEntry(i), zipFileName); 18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result == NAME_NOT_FOUND) 18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, ": file not found\n"); 18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (result == ALREADY_EXISTS) 18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, ": already exists in archive\n"); 18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else 18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "\n"); 18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = NO_ERROR; 18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbail: 18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete zip; 18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (result != NO_ERROR); 18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Delete files from an existing archive. 18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint doRemove(Bundle* bundle) 18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ZipFile* zip = NULL; 18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t result = UNKNOWN_ERROR; 18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* zipFileName; 18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bundle->getFileSpecCount() < 1) { 18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: must specify zip file name\n"); 18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project zipFileName = bundle->getFileSpecEntry(0); 18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bundle->getFileSpecCount() < 2) { 18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "NOTE: nothing to do\n"); 18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project zip = openReadWrite(zipFileName, false); 18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (zip == NULL) { 18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: failed opening Zip archive '%s'\n", 18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project zipFileName); 18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 1; i < bundle->getFileSpecCount(); i++) { 18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* fileName = bundle->getFileSpecEntry(i); 18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ZipEntry* entry; 18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project entry = zip->getEntryByName(fileName); 18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (entry == NULL) { 18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf(" '%s' NOT FOUND\n", fileName); 18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = zip->remove(entry); 18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result != NO_ERROR) { 18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "Unable to delete '%s' from '%s'\n", 18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle->getFileSpecEntry(i), zipFileName); 18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* update the archive */ 18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project zip->flush(); 18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbail: 18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete zip; 18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (result != NO_ERROR); 18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Package up an asset directory and associated application files. 18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint doPackage(Bundle* bundle) 18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* outputAPKFile; 18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int retVal = 1; 18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err; 18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AaptAssets> assets; 18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N; 18859bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin FILE* fp; 18869bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin String8 dependencyFile; 18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1888a2ef5c0d4fb863c0382e77ae00f986a019b11cbeAnton Krumin // -c en_XA or/and ar_XB means do pseudolocalization 18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResourceFilter filter; 18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = filter.parse(bundle->getConfigurations()); 18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (filter.containsPseudo()) { 1895a2ef5c0d4fb863c0382e77ae00f986a019b11cbeAnton Krumin bundle->setPseudolocalize(bundle->getPseudolocalize() | PSEUDO_ACCENTED); 1896a2ef5c0d4fb863c0382e77ae00f986a019b11cbeAnton Krumin } 1897a2ef5c0d4fb863c0382e77ae00f986a019b11cbeAnton Krumin if (filter.containsPseudoBidi()) { 1898a2ef5c0d4fb863c0382e77ae00f986a019b11cbeAnton Krumin bundle->setPseudolocalize(bundle->getPseudolocalize() | PSEUDO_BIDI); 18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N = bundle->getFileSpecCount(); 19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 1 && bundle->getResourceSourceDirs().size() == 0 && bundle->getJarFiles().size() == 0 19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && bundle->getAndroidManifestFile() == NULL && bundle->getAssetSourceDir() == NULL) { 19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: no input files\n"); 19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outputAPKFile = bundle->getOutputAPKFile(); 19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make sure the filenames provided exist and are of the appropriate type. 19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outputAPKFile) { 19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileType type; 19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project type = getFileType(outputAPKFile); 19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type != kFileTypeNonexistent && type != kFileTypeRegular) { 19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, 19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "ERROR: output file '%s' exists but is not regular file\n", 19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outputAPKFile); 19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Load the assets. 19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assets = new AaptAssets(); 19249bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin 192503589cc65355220e0a4a0c816189a9fa25cc81fcJosiah Gaskin // Set up the resource gathering in assets if we're going to generate 1926b711f3f7ee0544685ef26a1a4b4755d5a6233dbaJosiah Gaskin // dependency files. Every time we encounter a resource while slurping 1927b711f3f7ee0544685ef26a1a4b4755d5a6233dbaJosiah Gaskin // the tree, we'll add it to these stores so we have full resource paths 1928b711f3f7ee0544685ef26a1a4b4755d5a6233dbaJosiah Gaskin // to write to a dependency file. 19299bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin if (bundle->getGenDependencies()) { 193003589cc65355220e0a4a0c816189a9fa25cc81fcJosiah Gaskin sp<FilePathStore> resPathStore = new FilePathStore; 193103589cc65355220e0a4a0c816189a9fa25cc81fcJosiah Gaskin assets->setFullResPaths(resPathStore); 193203589cc65355220e0a4a0c816189a9fa25cc81fcJosiah Gaskin sp<FilePathStore> assetPathStore = new FilePathStore; 193303589cc65355220e0a4a0c816189a9fa25cc81fcJosiah Gaskin assets->setFullAssetPaths(assetPathStore); 19349bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin } 19359bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin 19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = assets->slurpFromArgs(bundle); 19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err < 0) { 19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bundle->getVerbose()) { 1942e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn assets->print(String8()); 19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19459bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin // If they asked for any fileAs that need to be compiled, do so. 19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bundle->getResourceSourceDirs().size() || bundle->getAndroidManifestFile()) { 19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = buildResources(bundle, assets); 19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != 0) { 19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // At this point we've read everything and processed everything. From here 19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // on out it's just writing output files. 19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (SourcePos::hasErrors()) { 19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19591644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn // Update symbols with information about which ones are needed as Java symbols. 19601644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn assets->applyJavaSymbols(); 19611644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn if (SourcePos::hasErrors()) { 19621644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn goto bail; 19631644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn } 19641644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn 1965b711f3f7ee0544685ef26a1a4b4755d5a6233dbaJosiah Gaskin // If we've been asked to generate a dependency file, do that here 19669bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin if (bundle->getGenDependencies()) { 1967b711f3f7ee0544685ef26a1a4b4755d5a6233dbaJosiah Gaskin // If this is the packaging step, generate the dependency file next to 1968b711f3f7ee0544685ef26a1a4b4755d5a6233dbaJosiah Gaskin // the output apk (e.g. bin/resources.ap_.d) 196903589cc65355220e0a4a0c816189a9fa25cc81fcJosiah Gaskin if (outputAPKFile) { 197003589cc65355220e0a4a0c816189a9fa25cc81fcJosiah Gaskin dependencyFile = String8(outputAPKFile); 1971b711f3f7ee0544685ef26a1a4b4755d5a6233dbaJosiah Gaskin // Add the .d extension to the dependency file. 197203589cc65355220e0a4a0c816189a9fa25cc81fcJosiah Gaskin dependencyFile.append(".d"); 197303589cc65355220e0a4a0c816189a9fa25cc81fcJosiah Gaskin } else { 1974b711f3f7ee0544685ef26a1a4b4755d5a6233dbaJosiah Gaskin // Else if this is the R.java dependency generation step, 1975b711f3f7ee0544685ef26a1a4b4755d5a6233dbaJosiah Gaskin // generate the dependency file in the R.java package subdirectory 1976b711f3f7ee0544685ef26a1a4b4755d5a6233dbaJosiah Gaskin // e.g. gen/com/foo/app/R.java.d 197703589cc65355220e0a4a0c816189a9fa25cc81fcJosiah Gaskin dependencyFile = String8(bundle->getRClassDir()); 1978b711f3f7ee0544685ef26a1a4b4755d5a6233dbaJosiah Gaskin dependencyFile.appendPath("R.java.d"); 197903589cc65355220e0a4a0c816189a9fa25cc81fcJosiah Gaskin } 19809bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin // Make sure we have a clean dependency file to start with 19819bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin fp = fopen(dependencyFile, "w"); 19829bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin fclose(fp); 19839bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin } 19849bf34ca6f85309c65b0ebdf614cb8266401b49baJosiah Gaskin 19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Write out R.java constants 19861644c6d7f4931d0b4fe7ea77c63b016af01a46d3Dianne Hackborn if (!assets->havePrivateSymbols()) { 198763459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet if (bundle->getCustomPackage() == NULL) { 1988b711f3f7ee0544685ef26a1a4b4755d5a6233dbaJosiah Gaskin // Write the R.java file into the appropriate class directory 1989b711f3f7ee0544685ef26a1a4b4755d5a6233dbaJosiah Gaskin // e.g. gen/com/foo/app/R.java 199063459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet err = writeResourceSymbols(bundle, assets, assets->getPackage(), true); 199163459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet } else { 199263459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet const String8 customPkg(bundle->getCustomPackage()); 199363459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet err = writeResourceSymbols(bundle, assets, customPkg, true); 199463459ad555c10de1f316d6de01fc3cd0c0aaa457Xavier Ducrohet } 19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err < 0) { 19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1998002f53770a7f6850eab4d7e381e91dc94d28968fYing Wang // If we have library files, we're going to write our R.java file into 1999002f53770a7f6850eab4d7e381e91dc94d28968fYing Wang // the appropriate class directory for those libraries as well. 2000002f53770a7f6850eab4d7e381e91dc94d28968fYing Wang // e.g. gen/com/foo/app/lib/R.java 2001002f53770a7f6850eab4d7e381e91dc94d28968fYing Wang if (bundle->getExtraPackages() != NULL) { 2002002f53770a7f6850eab4d7e381e91dc94d28968fYing Wang // Split on colon 2003002f53770a7f6850eab4d7e381e91dc94d28968fYing Wang String8 libs(bundle->getExtraPackages()); 2004002f53770a7f6850eab4d7e381e91dc94d28968fYing Wang char* packageString = strtok(libs.lockBuffer(libs.length()), ":"); 2005002f53770a7f6850eab4d7e381e91dc94d28968fYing Wang while (packageString != NULL) { 2006002f53770a7f6850eab4d7e381e91dc94d28968fYing Wang // Write the R.java file out with the correct package name 2007002f53770a7f6850eab4d7e381e91dc94d28968fYing Wang err = writeResourceSymbols(bundle, assets, String8(packageString), true); 2008002f53770a7f6850eab4d7e381e91dc94d28968fYing Wang if (err < 0) { 2009002f53770a7f6850eab4d7e381e91dc94d28968fYing Wang goto bail; 2010002f53770a7f6850eab4d7e381e91dc94d28968fYing Wang } 2011002f53770a7f6850eab4d7e381e91dc94d28968fYing Wang packageString = strtok(NULL, ":"); 2012002f53770a7f6850eab4d7e381e91dc94d28968fYing Wang } 2013002f53770a7f6850eab4d7e381e91dc94d28968fYing Wang libs.unlockBuffer(); 2014002f53770a7f6850eab4d7e381e91dc94d28968fYing Wang } 20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = writeResourceSymbols(bundle, assets, assets->getPackage(), false); 20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err < 0) { 20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = writeResourceSymbols(bundle, assets, assets->getSymbolsPrivatePackage(), true); 20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err < 0) { 20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20261553c82e084ac5763fb393857224145506771b99Joe Onorato // Write out the ProGuard file 20271553c82e084ac5763fb393857224145506771b99Joe Onorato err = writeProguardFile(bundle, assets); 20281553c82e084ac5763fb393857224145506771b99Joe Onorato if (err < 0) { 20291553c82e084ac5763fb393857224145506771b99Joe Onorato goto bail; 20301553c82e084ac5763fb393857224145506771b99Joe Onorato } 20311553c82e084ac5763fb393857224145506771b99Joe Onorato 20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Write the apk 20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outputAPKFile) { 20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = writeAPK(bundle, assets, String8(outputAPKFile)); 20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "ERROR: packaging of '%s' failed\n", outputAPKFile); 20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2041b711f3f7ee0544685ef26a1a4b4755d5a6233dbaJosiah Gaskin // If we've been asked to generate a dependency file, we need to finish up here. 2042b711f3f7ee0544685ef26a1a4b4755d5a6233dbaJosiah Gaskin // the writeResourceSymbols and writeAPK functions have already written the target 2043b711f3f7ee0544685ef26a1a4b4755d5a6233dbaJosiah Gaskin // half of the dependency file, now we need to write the prerequisites. (files that 2044b711f3f7ee0544685ef26a1a4b4755d5a6233dbaJosiah Gaskin // the R.java file or .ap_ file depend on) 204503589cc65355220e0a4a0c816189a9fa25cc81fcJosiah Gaskin if (bundle->getGenDependencies()) { 204603589cc65355220e0a4a0c816189a9fa25cc81fcJosiah Gaskin // Now that writeResourceSymbols or writeAPK has taken care of writing 204703589cc65355220e0a4a0c816189a9fa25cc81fcJosiah Gaskin // the targets to our dependency file, we'll write the prereqs 204803589cc65355220e0a4a0c816189a9fa25cc81fcJosiah Gaskin fp = fopen(dependencyFile, "a+"); 204903589cc65355220e0a4a0c816189a9fa25cc81fcJosiah Gaskin fprintf(fp, " : "); 205003589cc65355220e0a4a0c816189a9fa25cc81fcJosiah Gaskin bool includeRaw = (outputAPKFile != NULL); 205103589cc65355220e0a4a0c816189a9fa25cc81fcJosiah Gaskin err = writeDependencyPreReqs(bundle, assets, fp, includeRaw); 2052b711f3f7ee0544685ef26a1a4b4755d5a6233dbaJosiah Gaskin // Also manually add the AndroidManifeset since it's not under res/ or assets/ 2053b711f3f7ee0544685ef26a1a4b4755d5a6233dbaJosiah Gaskin // and therefore was not added to our pathstores during slurping 205403589cc65355220e0a4a0c816189a9fa25cc81fcJosiah Gaskin fprintf(fp, "%s \\\n", bundle->getAndroidManifestFile()); 205503589cc65355220e0a4a0c816189a9fa25cc81fcJosiah Gaskin fclose(fp); 205603589cc65355220e0a4a0c816189a9fa25cc81fcJosiah Gaskin } 205703589cc65355220e0a4a0c816189a9fa25cc81fcJosiah Gaskin 20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project retVal = 0; 20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbail: 20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (SourcePos::hasErrors()) { 20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SourcePos::printErrors(stderr); 20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return retVal; 20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 20658a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 20668a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin/* 20678a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * Do PNG Crunching 20688a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * PRECONDITIONS 20698a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * -S flag points to a source directory containing drawable* folders 20708a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * -C flag points to destination directory. The folder structure in the 20718a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * source directory will be mirrored to the destination (cache) directory 20728a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * 20738a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * POSTCONDITIONS 20748a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * Destination directory will be updated to match the PNG files in 20758a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * the source directory. 20768a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin */ 20778a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskinint doCrunch(Bundle* bundle) 20788a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin{ 20798a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin fprintf(stdout, "Crunching PNG Files in "); 20808a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin fprintf(stdout, "source dir: %s\n", bundle->getResourceSourceDirs()[0]); 20818a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin fprintf(stdout, "To destination dir: %s\n", bundle->getCrunchedOutputDir()); 20828a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 20838a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin updatePreProcessedCache(bundle); 20848a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 20858a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin return NO_ERROR; 20868a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin} 2087e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 2088b1f6ad82dd8d1702617a757a88430604b3131facXavier Ducrohet/* 2089b1f6ad82dd8d1702617a757a88430604b3131facXavier Ducrohet * Do PNG Crunching on a single flag 2090b1f6ad82dd8d1702617a757a88430604b3131facXavier Ducrohet * -i points to a single png file 2091b1f6ad82dd8d1702617a757a88430604b3131facXavier Ducrohet * -o points to a single png output file 2092b1f6ad82dd8d1702617a757a88430604b3131facXavier Ducrohet */ 2093b1f6ad82dd8d1702617a757a88430604b3131facXavier Ducrohetint doSingleCrunch(Bundle* bundle) 2094b1f6ad82dd8d1702617a757a88430604b3131facXavier Ducrohet{ 2095b1f6ad82dd8d1702617a757a88430604b3131facXavier Ducrohet fprintf(stdout, "Crunching single PNG file: %s\n", bundle->getSingleCrunchInputFile()); 2096b1f6ad82dd8d1702617a757a88430604b3131facXavier Ducrohet fprintf(stdout, "\tOutput file: %s\n", bundle->getSingleCrunchOutputFile()); 2097b1f6ad82dd8d1702617a757a88430604b3131facXavier Ducrohet 2098b1f6ad82dd8d1702617a757a88430604b3131facXavier Ducrohet String8 input(bundle->getSingleCrunchInputFile()); 2099b1f6ad82dd8d1702617a757a88430604b3131facXavier Ducrohet String8 output(bundle->getSingleCrunchOutputFile()); 2100b7de2194d54eb81b1db4b50c171ddd0339831155Xavier Ducrohet 2101c75d3f5c10bf6d7718ef69c6bbc1cdf64cd8ff04Xavier Ducrohet if (preProcessImageToCache(bundle, input, output) != NO_ERROR) { 2102c75d3f5c10bf6d7718ef69c6bbc1cdf64cd8ff04Xavier Ducrohet // we can't return the status_t as it gets truncate to the lower 8 bits. 2103c75d3f5c10bf6d7718ef69c6bbc1cdf64cd8ff04Xavier Ducrohet return 42; 2104c75d3f5c10bf6d7718ef69c6bbc1cdf64cd8ff04Xavier Ducrohet } 2105b7de2194d54eb81b1db4b50c171ddd0339831155Xavier Ducrohet 2106c75d3f5c10bf6d7718ef69c6bbc1cdf64cd8ff04Xavier Ducrohet return NO_ERROR; 2107b1f6ad82dd8d1702617a757a88430604b3131facXavier Ducrohet} 2108b1f6ad82dd8d1702617a757a88430604b3131facXavier Ducrohet 2109e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrillchar CONSOLE_DATA[2925] = { 2110e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2111e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 95, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2112e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2113e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 2114e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 61, 63, 2115e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 86, 35, 40, 46, 46, 95, 95, 95, 95, 97, 97, 44, 32, 46, 124, 42, 33, 83, 2116e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 62, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2117e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2118e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 58, 46, 58, 59, 61, 59, 61, 81, 2119e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 81, 81, 81, 66, 96, 61, 61, 58, 46, 46, 46, 58, 32, 32, 32, 32, 32, 32, 2120e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 2121e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2122e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 46, 61, 59, 59, 59, 58, 106, 81, 81, 81, 81, 102, 59, 61, 59, 2123e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 59, 61, 61, 61, 58, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2124e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2125e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 61, 59, 59, 2126e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 59, 58, 109, 81, 81, 81, 81, 61, 59, 59, 59, 59, 59, 58, 59, 59, 46, 32, 2127e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2128e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2129e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 46, 61, 59, 59, 59, 60, 81, 81, 81, 81, 87, 2130e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 58, 59, 59, 59, 59, 59, 59, 61, 119, 44, 32, 32, 32, 32, 32, 32, 32, 32, 2131e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 2132e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 46, 2133e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 47, 61, 59, 59, 58, 100, 81, 81, 81, 81, 35, 58, 59, 59, 59, 59, 59, 58, 2134e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 121, 81, 91, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2135e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2136e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 46, 109, 58, 59, 59, 61, 81, 81, 2137e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 81, 81, 81, 109, 58, 59, 59, 59, 59, 61, 109, 81, 81, 76, 46, 32, 32, 32, 2138e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 2139e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2140e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 41, 87, 59, 61, 59, 41, 81, 81, 81, 81, 81, 81, 59, 61, 59, 2141e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 59, 58, 109, 81, 81, 87, 39, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2142e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2143e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 81, 91, 59, 2144e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 59, 61, 81, 81, 81, 81, 81, 87, 43, 59, 58, 59, 60, 81, 81, 81, 76, 32, 2145e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2146e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2147e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 52, 91, 58, 45, 59, 87, 81, 81, 81, 81, 2148e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 70, 58, 58, 58, 59, 106, 81, 81, 81, 91, 32, 32, 32, 32, 32, 32, 32, 32, 2149e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 2150e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2151e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 93, 40, 32, 46, 59, 100, 81, 81, 81, 81, 40, 58, 46, 46, 58, 100, 81, 2152e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 81, 68, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2153e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2154e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 46, 46, 46, 32, 46, 46, 46, 32, 46, 32, 46, 45, 91, 59, 61, 58, 109, 2155e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 81, 81, 81, 87, 46, 58, 61, 59, 60, 81, 81, 80, 32, 32, 32, 32, 32, 32, 2156e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 2157e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 46, 46, 61, 59, 61, 61, 61, 59, 61, 61, 59, 2158e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 59, 59, 58, 58, 46, 46, 41, 58, 59, 58, 81, 81, 81, 81, 69, 58, 59, 59, 2159e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 60, 81, 81, 68, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2160e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 58, 59, 2161e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 61, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 61, 61, 46, 2162e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 61, 59, 93, 81, 81, 81, 81, 107, 58, 59, 58, 109, 87, 68, 96, 32, 32, 32, 2163e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2164e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 10, 32, 32, 32, 46, 60, 61, 61, 59, 59, 59, 59, 59, 59, 59, 59, 2165e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 59, 59, 59, 59, 59, 59, 59, 59, 59, 58, 58, 58, 115, 109, 68, 41, 36, 81, 2166e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 109, 46, 61, 61, 81, 69, 96, 46, 58, 58, 46, 58, 46, 46, 32, 32, 32, 32, 2167e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 46, 32, 95, 81, 2168e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 67, 61, 61, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 2169e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 59, 59, 59, 59, 58, 68, 39, 61, 105, 61, 63, 81, 119, 58, 106, 80, 32, 58, 2170e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 61, 59, 59, 61, 59, 61, 59, 61, 46, 95, 32, 32, 32, 32, 32, 32, 32, 32, 2171e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 10, 32, 32, 36, 81, 109, 105, 59, 61, 59, 59, 59, 2172e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 46, 58, 37, 2173e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 73, 108, 108, 62, 52, 81, 109, 34, 32, 61, 59, 59, 59, 59, 59, 59, 59, 59, 2174e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 59, 61, 59, 61, 61, 46, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 2175e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 46, 45, 57, 101, 43, 43, 61, 61, 59, 59, 59, 59, 59, 59, 61, 59, 59, 2176e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 59, 59, 59, 59, 59, 59, 59, 58, 97, 46, 61, 108, 62, 126, 58, 106, 80, 96, 2177e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 46, 61, 61, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 61, 61, 2178e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 97, 103, 97, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 45, 46, 32, 2179e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 46, 32, 32, 32, 32, 32, 32, 32, 32, 45, 45, 45, 58, 59, 59, 59, 59, 61, 2180e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 119, 81, 97, 124, 105, 124, 124, 39, 126, 95, 119, 58, 61, 58, 59, 59, 59, 2181e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 61, 119, 81, 81, 99, 32, 32, 2182e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2183e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 58, 59, 59, 58, 106, 81, 81, 81, 109, 119, 2184e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 119, 119, 109, 109, 81, 81, 122, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 2185e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 59, 59, 59, 59, 59, 58, 115, 81, 87, 81, 102, 32, 32, 32, 32, 32, 32, 10, 2186e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2187e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 61, 58, 59, 61, 81, 81, 81, 81, 81, 81, 87, 87, 81, 81, 81, 81, 2188e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 81, 58, 59, 59, 59, 59, 59, 59, 59, 59, 58, 45, 45, 45, 59, 59, 59, 41, 2189e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 87, 66, 33, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 2190e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 58, 59, 59, 93, 81, 2191e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 40, 58, 59, 59, 59, 58, 2192e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 45, 32, 46, 32, 32, 32, 32, 32, 46, 32, 126, 96, 32, 32, 32, 32, 32, 32, 2193e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2194e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 58, 61, 59, 58, 81, 81, 81, 81, 81, 81, 81, 81, 2195e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 81, 81, 81, 81, 81, 40, 58, 59, 59, 59, 58, 32, 32, 32, 32, 32, 32, 32, 2196e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 2197e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 58, 2198e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 59, 59, 58, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 40, 58, 2199e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 59, 59, 59, 46, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2200e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2201e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 58, 61, 59, 60, 81, 81, 81, 81, 2202e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 81, 81, 81, 81, 81, 81, 81, 81, 81, 59, 61, 59, 59, 61, 32, 32, 32, 32, 2203e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2204e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2205e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 58, 59, 59, 93, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 2206e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 81, 81, 40, 59, 59, 59, 59, 32, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2207e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 2208e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 58, 61, 58, 106, 2209e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 76, 58, 59, 59, 59, 2210e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2211e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2212e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 61, 58, 58, 81, 81, 81, 81, 81, 81, 81, 81, 2213e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 81, 81, 81, 81, 81, 87, 58, 59, 59, 59, 59, 32, 46, 32, 32, 32, 32, 32, 2214e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 2215e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2216e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 58, 59, 61, 41, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 87, 59, 2217e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 61, 58, 59, 59, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2218e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2219e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 58, 61, 58, 61, 81, 81, 81, 2220e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 81, 81, 81, 81, 81, 81, 81, 81, 81, 107, 58, 59, 59, 59, 59, 58, 32, 32, 2221e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2222e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2223e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 58, 59, 59, 58, 51, 81, 81, 81, 81, 81, 81, 81, 81, 81, 2224e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 81, 102, 94, 59, 59, 59, 59, 59, 61, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2225e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 2226e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 58, 61, 59, 2227e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 59, 59, 43, 63, 36, 81, 81, 81, 87, 64, 86, 102, 58, 59, 59, 59, 59, 59, 2228e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 59, 59, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2229e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2230e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 46, 61, 59, 59, 59, 59, 59, 59, 59, 43, 33, 2231e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 58, 126, 126, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 32, 46, 32, 32, 2232e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 2233e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 46, 2234e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 61, 59, 59, 59, 58, 45, 58, 61, 59, 58, 58, 58, 61, 59, 59, 59, 59, 59, 2235e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 59, 59, 59, 59, 59, 59, 59, 58, 32, 46, 32, 32, 32, 32, 32, 32, 32, 32, 2236e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 2237e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 46, 61, 59, 59, 59, 59, 59, 58, 95, 2238e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 45, 61, 59, 61, 59, 59, 59, 59, 59, 59, 59, 45, 58, 59, 59, 59, 59, 2239e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 61, 58, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2240e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2241e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 58, 61, 59, 59, 59, 59, 59, 61, 59, 61, 46, 46, 32, 45, 45, 45, 2242e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 59, 58, 45, 45, 46, 58, 59, 59, 59, 59, 59, 59, 61, 46, 32, 32, 32, 32, 2243e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 2244e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 46, 58, 59, 59, 59, 59, 2245e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 59, 59, 59, 59, 59, 61, 59, 46, 32, 32, 46, 32, 46, 32, 58, 61, 59, 59, 2246e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 59, 59, 59, 59, 59, 59, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2247e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2248e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 45, 59, 59, 59, 59, 59, 59, 59, 59, 58, 32, 2249e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 61, 59, 59, 59, 59, 59, 59, 59, 58, 32, 2250e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 2251e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2252e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 46, 61, 59, 59, 59, 59, 59, 59, 59, 32, 46, 32, 32, 32, 32, 32, 32, 61, 2253e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 46, 61, 59, 59, 59, 59, 59, 59, 58, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2254e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 2255e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 61, 59, 59, 59, 59, 59, 59, 2256e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 59, 59, 32, 46, 32, 32, 32, 32, 32, 32, 32, 46, 61, 58, 59, 59, 59, 59, 2257e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 59, 58, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2258e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2259e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 58, 59, 59, 59, 59, 59, 59, 59, 59, 46, 46, 32, 32, 32, 2260e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 61, 59, 59, 59, 59, 59, 59, 59, 45, 32, 32, 32, 32, 32, 2261e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 2262e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 46, 32, 45, 61, 2263e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 59, 59, 59, 59, 59, 58, 32, 46, 32, 32, 32, 32, 32, 32, 32, 58, 59, 59, 2264e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 59, 59, 59, 58, 45, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2265e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2266e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 45, 45, 45, 45, 32, 46, 32, 2267e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 45, 61, 59, 58, 45, 45, 32, 32, 32, 2268e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2269e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2270e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2271e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 46, 32, 32, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2272e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 10 2273e74763e26f760e8de23a4edfbe599a166ef6bb53Dan Morrill }; 2274