From 682583c8902efbd33d4394131a2214ce94469535 Mon Sep 17 00:00:00 2001 From: Rohit Agrawal Date: Thu, 21 Apr 2016 16:29:58 -0700 Subject: AAPT: ProGuard config for components in main dex. Create an analogue of "aapt -G" which outputs a proguard configuration that keeps only components which need to be in the main dex. Bug: 27383099 Bug: 28425556 Change-Id: Ic18c8c563794ff27a5598a214111d1b446a005f1 (cherry picked from commit 86229cb622fccde8ab8cbe85eead91a34313a708) --- tools/aapt/Resource.cpp | 89 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 70 insertions(+), 19 deletions(-) (limited to 'tools/aapt/Resource.cpp') diff --git a/tools/aapt/Resource.cpp b/tools/aapt/Resource.cpp index 18a194326de7..8e7045bd07e1 100644 --- a/tools/aapt/Resource.cpp +++ b/tools/aapt/Resource.cpp @@ -2832,7 +2832,7 @@ addProguardKeepMethodRule(ProguardKeepSet* keep, const String8& memberName, } status_t -writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp& assets) +writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp& assets, bool mainDex) { status_t err; ResXMLTree tree; @@ -2844,6 +2844,7 @@ writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp& ass sp assGroup; sp assFile; String8 pkg; + String8 defaultProcess; // First, look for a package file to parse. This is required to // be able to generate the resource information. @@ -2900,6 +2901,15 @@ writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp& 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; } @@ -2916,7 +2926,23 @@ writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp& 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()); } @@ -3098,6 +3124,31 @@ writeProguardForLayouts(ProguardKeepSet* keep, const sp& 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 >& rules = keep.rules; + const size_t N = rules.size(); + for (size_t i=0; i& locations = rules.valueAt(i); + const size_t M = locations.size(); + for (size_t j=0; j& assets) { @@ -3109,7 +3160,7 @@ writeProguardFile(Bundle* bundle, const sp& assets) ProguardKeepSet keep; - err = writeProguardForAndroidManifest(&keep, assets); + err = writeProguardForAndroidManifest(&keep, assets, false); if (err < 0) { return err; } @@ -3119,26 +3170,26 @@ writeProguardFile(Bundle* bundle, const sp& 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); +} + +status_t +writeMainDexProguardFile(Bundle* bundle, const sp& assets) +{ + status_t err = -1; + + if (!bundle->getMainDexProguardFile()) { + return NO_ERROR; } - const KeyedVector >& rules = keep.rules; - const size_t N = rules.size(); - for (size_t i=0; i& locations = rules.valueAt(i); - const size_t M = locations.size(); - for (size_t j=0; jgetMainDexProguardFile(), keep, err); } // Loops through the string paths and writes them to the file pointer -- cgit v1.2.3-59-g8ed1b