Loading tools/aapt/Bundle.h +4 −1 Original line number Diff line number Diff line Loading @@ -55,7 +55,7 @@ public: mCompressionMethod(0), mJunkPath(false), mOutputAPKFile(NULL), mManifestPackageNameOverride(NULL), mInstrumentationPackageNameOverride(NULL), mAutoAddOverlay(false), mGenDependencies(false), mNoVersionVectors(false), mCrunchedOutputDir(NULL), mProguardFile(NULL), mCrunchedOutputDir(NULL), mProguardFile(NULL), mMainDexProguardFile(NULL), mAndroidManifestFile(NULL), mPublicOutputFile(NULL), mRClassDir(NULL), mResourceIntermediatesDir(NULL), mManifestMinSdkVersion(NULL), mMinSdkVersion(NULL), mTargetSdkVersion(NULL), mMaxSdkVersion(NULL), Loading Loading @@ -146,6 +146,8 @@ public: void setCrunchedOutputDir(const char* dir) { mCrunchedOutputDir = dir; } const char* getProguardFile() const { return mProguardFile; } void setProguardFile(const char* file) { mProguardFile = file; } const char* getMainDexProguardFile() const { return mMainDexProguardFile; } void setMainDexProguardFile(const char* file) { mMainDexProguardFile = file; } const android::Vector<const char*>& getResourceSourceDirs() const { return mResourceSourceDirs; } void addResourceSourceDir(const char* dir) { mResourceSourceDirs.insertAt(dir,0); } const char* getAndroidManifestFile() const { return mAndroidManifestFile; } Loading Loading @@ -299,6 +301,7 @@ private: bool mNoVersionVectors; const char* mCrunchedOutputDir; const char* mProguardFile; const char* mMainDexProguardFile; const char* mAndroidManifestFile; const char* mPublicOutputFile; const char* mRClassDir; Loading tools/aapt/Command.cpp +6 −0 Original line number Diff line number Diff line Loading @@ -2631,6 +2631,12 @@ int doPackage(Bundle* bundle) goto bail; } // Write out the Main Dex ProGuard file err = writeMainDexProguardFile(bundle, assets); if (err < 0) { goto bail; } // Write the apk if (outputAPKFile) { // Gather all resources and add them to the APK Builder. The builder will then Loading tools/aapt/Main.cpp +13 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,7 @@ void usage(void) " [--max-res-version VAL] \\\n" " [-I base-package [-I base-package ...]] \\\n" " [-A asset-source-dir] [-G class-list-file] [-P public-definitions-file] \\\n" " [-D main-dex-class-list-file] \\\n" " [-S resource-sources [-S resource-sources ...]] \\\n" " [-F apk-file] [-J R-file-dir] \\\n" " [--product product1,product2,...] \\\n" Loading Loading @@ -120,6 +121,7 @@ void usage(void) " localization=\"suggested\"\n" " -A additional directory in which to find raw asset files\n" " -G A file to output proguard options into.\n" " -D A file to output proguard options for the main dex into.\n" " -F specify the apk file to output\n" " -I add an existing package to base include set\n" " -J specify where to output R.java resource constant definitions\n" Loading Loading @@ -390,6 +392,17 @@ int main(int argc, char* const argv[]) convertPath(argv[0]); bundle.setProguardFile(argv[0]); break; case 'D': argc--; argv++; if (!argc) { fprintf(stderr, "ERROR: No argument supplied for '-D' option\n"); wantUsage = true; goto bail; } convertPath(argv[0]); bundle.setMainDexProguardFile(argv[0]); break; case 'I': argc--; argv++; Loading tools/aapt/Main.h +1 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ extern android::status_t writeResourceSymbols(Bundle* bundle, bool includePrivate, bool emitCallback); extern android::status_t writeProguardFile(Bundle* bundle, const sp<AaptAssets>& assets); extern android::status_t writeMainDexProguardFile(Bundle* bundle, const sp<AaptAssets>& assets); extern bool isValidResourceType(const String8& type); Loading tools/aapt/Resource.cpp +70 −19 Original line number Diff line number Diff line Loading @@ -2832,7 +2832,7 @@ addProguardKeepMethodRule(ProguardKeepSet* keep, const String8& memberName, } status_t writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& assets) writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& assets, bool mainDex) { status_t err; ResXMLTree tree; Loading @@ -2844,6 +2844,7 @@ writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& ass sp<AaptGroup> assGroup; sp<AaptFile> assFile; String8 pkg; String8 defaultProcess; // First, look for a package file to parse. This is required to // be able to generate the resource information. Loading Loading @@ -2900,6 +2901,15 @@ writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& ass addProguardKeepRule(keep, agent, pkg.string(), assFile->getPrintableSource(), tree.getLineNumber()); } if (mainDex) { defaultProcess = AaptXml::getAttribute(tree, "http://schemas.android.com/apk/res/android", "process", &error); if (error != "") { fprintf(stderr, "ERROR: %s\n", error.string()); return -1; } } } else if (tag == "instrumentation") { keepTag = true; } Loading @@ -2916,7 +2926,23 @@ writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& ass fprintf(stderr, "ERROR: %s\n", error.string()); return -1; } if (name.length() > 0) { keepTag = name.length() > 0; if (keepTag && mainDex) { String8 componentProcess = AaptXml::getAttribute(tree, "http://schemas.android.com/apk/res/android", "process", &error); if (error != "") { fprintf(stderr, "ERROR: %s\n", error.string()); return -1; } const String8& process = componentProcess.length() > 0 ? componentProcess : defaultProcess; keepTag = process.length() > 0 && process.find(":") != 0; } if (keepTag) { addProguardKeepRule(keep, name, pkg.string(), assFile->getPrintableSource(), tree.getLineNumber()); } Loading Loading @@ -3098,6 +3124,31 @@ writeProguardForLayouts(ProguardKeepSet* keep, const sp<AaptAssets>& assets) return NO_ERROR; } status_t writeProguardSpec(const char* filename, const ProguardKeepSet& keep, status_t err) { FILE* fp = fopen(filename, "w+"); if (fp == NULL) { fprintf(stderr, "ERROR: Unable to open class file %s: %s\n", filename, strerror(errno)); return UNKNOWN_ERROR; } const KeyedVector<String8, SortedVector<String8> >& rules = keep.rules; const size_t N = rules.size(); for (size_t i=0; i<N; i++) { const SortedVector<String8>& locations = rules.valueAt(i); const size_t M = locations.size(); for (size_t j=0; j<M; j++) { fprintf(fp, "# %s\n", locations.itemAt(j).string()); } fprintf(fp, "%s\n\n", rules.keyAt(i).string()); } fclose(fp); return err; } status_t writeProguardFile(Bundle* bundle, const sp<AaptAssets>& assets) { Loading @@ -3109,7 +3160,7 @@ writeProguardFile(Bundle* bundle, const sp<AaptAssets>& assets) ProguardKeepSet keep; err = writeProguardForAndroidManifest(&keep, assets); err = writeProguardForAndroidManifest(&keep, assets, false); if (err < 0) { return err; } Loading @@ -3119,28 +3170,28 @@ writeProguardFile(Bundle* bundle, const sp<AaptAssets>& assets) return err; } FILE* fp = fopen(bundle->getProguardFile(), "w+"); if (fp == NULL) { fprintf(stderr, "ERROR: Unable to open class file %s: %s\n", bundle->getProguardFile(), strerror(errno)); return UNKNOWN_ERROR; return writeProguardSpec(bundle->getProguardFile(), keep, err); } const KeyedVector<String8, SortedVector<String8> >& rules = keep.rules; const size_t N = rules.size(); for (size_t i=0; i<N; i++) { const SortedVector<String8>& locations = rules.valueAt(i); const size_t M = locations.size(); for (size_t j=0; j<M; j++) { fprintf(fp, "# %s\n", locations.itemAt(j).string()); } fprintf(fp, "%s\n\n", rules.keyAt(i).string()); status_t writeMainDexProguardFile(Bundle* bundle, const sp<AaptAssets>& assets) { status_t err = -1; if (!bundle->getMainDexProguardFile()) { return NO_ERROR; } fclose(fp); ProguardKeepSet keep; err = writeProguardForAndroidManifest(&keep, assets, true); if (err < 0) { return err; } return writeProguardSpec(bundle->getMainDexProguardFile(), keep, err); } // Loops through the string paths and writes them to the file pointer // Each file path is written on its own line with a terminating backslash. status_t writePathsToFile(const sp<FilePathStore>& files, FILE* fp) Loading Loading
tools/aapt/Bundle.h +4 −1 Original line number Diff line number Diff line Loading @@ -55,7 +55,7 @@ public: mCompressionMethod(0), mJunkPath(false), mOutputAPKFile(NULL), mManifestPackageNameOverride(NULL), mInstrumentationPackageNameOverride(NULL), mAutoAddOverlay(false), mGenDependencies(false), mNoVersionVectors(false), mCrunchedOutputDir(NULL), mProguardFile(NULL), mCrunchedOutputDir(NULL), mProguardFile(NULL), mMainDexProguardFile(NULL), mAndroidManifestFile(NULL), mPublicOutputFile(NULL), mRClassDir(NULL), mResourceIntermediatesDir(NULL), mManifestMinSdkVersion(NULL), mMinSdkVersion(NULL), mTargetSdkVersion(NULL), mMaxSdkVersion(NULL), Loading Loading @@ -146,6 +146,8 @@ public: void setCrunchedOutputDir(const char* dir) { mCrunchedOutputDir = dir; } const char* getProguardFile() const { return mProguardFile; } void setProguardFile(const char* file) { mProguardFile = file; } const char* getMainDexProguardFile() const { return mMainDexProguardFile; } void setMainDexProguardFile(const char* file) { mMainDexProguardFile = file; } const android::Vector<const char*>& getResourceSourceDirs() const { return mResourceSourceDirs; } void addResourceSourceDir(const char* dir) { mResourceSourceDirs.insertAt(dir,0); } const char* getAndroidManifestFile() const { return mAndroidManifestFile; } Loading Loading @@ -299,6 +301,7 @@ private: bool mNoVersionVectors; const char* mCrunchedOutputDir; const char* mProguardFile; const char* mMainDexProguardFile; const char* mAndroidManifestFile; const char* mPublicOutputFile; const char* mRClassDir; Loading
tools/aapt/Command.cpp +6 −0 Original line number Diff line number Diff line Loading @@ -2631,6 +2631,12 @@ int doPackage(Bundle* bundle) goto bail; } // Write out the Main Dex ProGuard file err = writeMainDexProguardFile(bundle, assets); if (err < 0) { goto bail; } // Write the apk if (outputAPKFile) { // Gather all resources and add them to the APK Builder. The builder will then Loading
tools/aapt/Main.cpp +13 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,7 @@ void usage(void) " [--max-res-version VAL] \\\n" " [-I base-package [-I base-package ...]] \\\n" " [-A asset-source-dir] [-G class-list-file] [-P public-definitions-file] \\\n" " [-D main-dex-class-list-file] \\\n" " [-S resource-sources [-S resource-sources ...]] \\\n" " [-F apk-file] [-J R-file-dir] \\\n" " [--product product1,product2,...] \\\n" Loading Loading @@ -120,6 +121,7 @@ void usage(void) " localization=\"suggested\"\n" " -A additional directory in which to find raw asset files\n" " -G A file to output proguard options into.\n" " -D A file to output proguard options for the main dex into.\n" " -F specify the apk file to output\n" " -I add an existing package to base include set\n" " -J specify where to output R.java resource constant definitions\n" Loading Loading @@ -390,6 +392,17 @@ int main(int argc, char* const argv[]) convertPath(argv[0]); bundle.setProguardFile(argv[0]); break; case 'D': argc--; argv++; if (!argc) { fprintf(stderr, "ERROR: No argument supplied for '-D' option\n"); wantUsage = true; goto bail; } convertPath(argv[0]); bundle.setMainDexProguardFile(argv[0]); break; case 'I': argc--; argv++; Loading
tools/aapt/Main.h +1 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ extern android::status_t writeResourceSymbols(Bundle* bundle, bool includePrivate, bool emitCallback); extern android::status_t writeProguardFile(Bundle* bundle, const sp<AaptAssets>& assets); extern android::status_t writeMainDexProguardFile(Bundle* bundle, const sp<AaptAssets>& assets); extern bool isValidResourceType(const String8& type); Loading
tools/aapt/Resource.cpp +70 −19 Original line number Diff line number Diff line Loading @@ -2832,7 +2832,7 @@ addProguardKeepMethodRule(ProguardKeepSet* keep, const String8& memberName, } status_t writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& assets) writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& assets, bool mainDex) { status_t err; ResXMLTree tree; Loading @@ -2844,6 +2844,7 @@ writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& ass sp<AaptGroup> assGroup; sp<AaptFile> assFile; String8 pkg; String8 defaultProcess; // First, look for a package file to parse. This is required to // be able to generate the resource information. Loading Loading @@ -2900,6 +2901,15 @@ writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& ass addProguardKeepRule(keep, agent, pkg.string(), assFile->getPrintableSource(), tree.getLineNumber()); } if (mainDex) { defaultProcess = AaptXml::getAttribute(tree, "http://schemas.android.com/apk/res/android", "process", &error); if (error != "") { fprintf(stderr, "ERROR: %s\n", error.string()); return -1; } } } else if (tag == "instrumentation") { keepTag = true; } Loading @@ -2916,7 +2926,23 @@ writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& ass fprintf(stderr, "ERROR: %s\n", error.string()); return -1; } if (name.length() > 0) { keepTag = name.length() > 0; if (keepTag && mainDex) { String8 componentProcess = AaptXml::getAttribute(tree, "http://schemas.android.com/apk/res/android", "process", &error); if (error != "") { fprintf(stderr, "ERROR: %s\n", error.string()); return -1; } const String8& process = componentProcess.length() > 0 ? componentProcess : defaultProcess; keepTag = process.length() > 0 && process.find(":") != 0; } if (keepTag) { addProguardKeepRule(keep, name, pkg.string(), assFile->getPrintableSource(), tree.getLineNumber()); } Loading Loading @@ -3098,6 +3124,31 @@ writeProguardForLayouts(ProguardKeepSet* keep, const sp<AaptAssets>& assets) return NO_ERROR; } status_t writeProguardSpec(const char* filename, const ProguardKeepSet& keep, status_t err) { FILE* fp = fopen(filename, "w+"); if (fp == NULL) { fprintf(stderr, "ERROR: Unable to open class file %s: %s\n", filename, strerror(errno)); return UNKNOWN_ERROR; } const KeyedVector<String8, SortedVector<String8> >& rules = keep.rules; const size_t N = rules.size(); for (size_t i=0; i<N; i++) { const SortedVector<String8>& locations = rules.valueAt(i); const size_t M = locations.size(); for (size_t j=0; j<M; j++) { fprintf(fp, "# %s\n", locations.itemAt(j).string()); } fprintf(fp, "%s\n\n", rules.keyAt(i).string()); } fclose(fp); return err; } status_t writeProguardFile(Bundle* bundle, const sp<AaptAssets>& assets) { Loading @@ -3109,7 +3160,7 @@ writeProguardFile(Bundle* bundle, const sp<AaptAssets>& assets) ProguardKeepSet keep; err = writeProguardForAndroidManifest(&keep, assets); err = writeProguardForAndroidManifest(&keep, assets, false); if (err < 0) { return err; } Loading @@ -3119,28 +3170,28 @@ writeProguardFile(Bundle* bundle, const sp<AaptAssets>& assets) return err; } FILE* fp = fopen(bundle->getProguardFile(), "w+"); if (fp == NULL) { fprintf(stderr, "ERROR: Unable to open class file %s: %s\n", bundle->getProguardFile(), strerror(errno)); return UNKNOWN_ERROR; return writeProguardSpec(bundle->getProguardFile(), keep, err); } const KeyedVector<String8, SortedVector<String8> >& rules = keep.rules; const size_t N = rules.size(); for (size_t i=0; i<N; i++) { const SortedVector<String8>& locations = rules.valueAt(i); const size_t M = locations.size(); for (size_t j=0; j<M; j++) { fprintf(fp, "# %s\n", locations.itemAt(j).string()); } fprintf(fp, "%s\n\n", rules.keyAt(i).string()); status_t writeMainDexProguardFile(Bundle* bundle, const sp<AaptAssets>& assets) { status_t err = -1; if (!bundle->getMainDexProguardFile()) { return NO_ERROR; } fclose(fp); ProguardKeepSet keep; err = writeProguardForAndroidManifest(&keep, assets, true); if (err < 0) { return err; } return writeProguardSpec(bundle->getMainDexProguardFile(), keep, err); } // Loops through the string paths and writes them to the file pointer // Each file path is written on its own line with a terminating backslash. status_t writePathsToFile(const sp<FilePathStore>& files, FILE* fp) Loading