blob: e33cf599eefa268fa75669bcffffee325d9343b6 [file] [log] [blame]
// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.errors;
/**
* Info about error when running mono dex and not all classes can fit in a dex or when running for
* multidex legacy and there are too many classes to fit in the main dex.
*/
public class MainDexOverflow {
private final boolean hasMainDexList;
private final long numOfMethods;
private final long numOfFields;
private final long maxNumOfEntries;
public MainDexOverflow(
boolean hasMainDexList, long numOfMethods, long numOfFields, long maxNumOfEntries) {
super();
this.hasMainDexList = hasMainDexList;
this.numOfMethods = numOfMethods;
this.numOfFields = numOfFields;
this.maxNumOfEntries = maxNumOfEntries;
}
private StringBuilder getGeneralMessage() {
StringBuilder messageBuilder = new StringBuilder();
// General message: Cannot fit.
messageBuilder.append("Cannot fit requested classes in ");
messageBuilder.append(hasMainDexList ? "the main-" : "a single ");
messageBuilder.append("dex file");
return messageBuilder;
}
private String getNumberRelatedMessage() {
StringBuilder messageBuilder = new StringBuilder();
// Show the numbers of methods and/or fields that exceed the limit.
if (numOfMethods > maxNumOfEntries) {
messageBuilder.append("# methods: ");
messageBuilder.append(numOfMethods);
messageBuilder.append(" > ").append(maxNumOfEntries);
if (numOfFields > maxNumOfEntries) {
messageBuilder.append(" ; ");
}
}
if (numOfFields > maxNumOfEntries) {
messageBuilder.append("# fields: ");
messageBuilder.append(numOfFields);
messageBuilder.append(" > ").append(maxNumOfEntries);
}
return messageBuilder.toString();
}
public String getMessage() {
// Default message
return getGeneralMessage()
.append(" (")
.append(getNumberRelatedMessage())
.append(")")
.toString();
}
public String getMessageForD8() {
StringBuilder messageBuilder = getGeneralMessage();
if (!hasMainDexList) {
messageBuilder.append(". ");
messageBuilder.append("Try supplying a main-dex list");
}
messageBuilder.append(".").append(System.getProperty("line.separator"));
messageBuilder.append(getNumberRelatedMessage());
return messageBuilder.toString();
}
public String getMessageForR8() {
StringBuilder messageBuilder = getGeneralMessage();
if (!hasMainDexList) {
messageBuilder.append(". ");
messageBuilder.append("Try supplying a main-dex list or main dex rules");
}
messageBuilder.append(".").append(System.getProperty("line.separator"));
messageBuilder.append(getNumberRelatedMessage());
return messageBuilder.toString();
}
}