blob: f17e923be50a2f68b4045e02051a74d0a45baf8b [file] [log] [blame]
// Copyright (c) 2020, 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.horizontalclassmerging.policies;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.horizontalclassmerging.MultiClassPolicy;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.shaking.MainDexClasses;
import com.android.tools.r8.shaking.MainDexTracingResult;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class PreventMergeIntoMainDex extends MultiClassPolicy {
private final MainDexClasses mainDexClasses;
private final MainDexTracingResult mainDexTracingResult;
public PreventMergeIntoMainDex(
AppView<AppInfoWithLiveness> appView, MainDexTracingResult mainDexTracingResult) {
this.mainDexClasses = appView.appInfo().getMainDexClasses();
this.mainDexTracingResult = mainDexTracingResult;
}
public boolean isMainDexClass(DexProgramClass clazz) {
return mainDexClasses.contains(clazz) || mainDexTracingResult.contains(clazz);
}
@Override
public Collection<Collection<DexProgramClass>> apply(Collection<DexProgramClass> group) {
List<DexProgramClass> mainDexMembers = new LinkedList<>();
Iterator<DexProgramClass> iterator = group.iterator();
while (iterator.hasNext()) {
DexProgramClass clazz = iterator.next();
if (isMainDexClass(clazz)) {
iterator.remove();
mainDexMembers.add(clazz);
}
}
Collection<Collection<DexProgramClass>> newGroups = new LinkedList<>();
if (!isTrivial(mainDexMembers)) {
newGroups.add(mainDexMembers);
}
if (!isTrivial(group)) {
newGroups.add(group);
}
return newGroups;
}
}