summaryrefslogtreecommitdiff
path: root/tools/aapt/Resource.cpp
diff options
context:
space:
mode:
authorRohit Agrawal <rohitagr@google.com>2016-04-21 16:29:58 -0700
committerRohit Agrawal <rohitagr@google.com>2016-04-27 19:50:55 +0000
commit682583c8902efbd33d4394131a2214ce94469535 (patch)
tree16b35113be2d432f6b58948de3b4f9045aace8e1 /tools/aapt/Resource.cpp
parent987609f5a7bd8e18559334aa0260e6614520af13 (diff)
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)
Diffstat (limited to 'tools/aapt/Resource.cpp')
-rw-r--r--tools/aapt/Resource.cpp89
1 files changed, 70 insertions, 19 deletions
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<AaptAssets>& assets)
+writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& assets, bool mainDex)
{
status_t err;
ResXMLTree tree;
@@ -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.
@@ -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;
}
@@ -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());
}
@@ -3099,6 +3125,31 @@ writeProguardForLayouts(ProguardKeepSet* keep, const sp<AaptAssets>& assets)
}
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)
{
status_t err = -1;
@@ -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;
}
@@ -3119,26 +3170,26 @@ 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);
+}
+
+status_t
+writeMainDexProguardFile(Bundle* bundle, const sp<AaptAssets>& assets)
+{
+ status_t err = -1;
+
+ if (!bundle->getMainDexProguardFile()) {
+ return NO_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());
+ ProguardKeepSet keep;
+
+ err = writeProguardForAndroidManifest(&keep, assets, true);
+ if (err < 0) {
+ return err;
}
- fclose(fp);
- return err;
+ return writeProguardSpec(bundle->getMainDexProguardFile(), keep, err);
}
// Loops through the string paths and writes them to the file pointer