blob: 5f9bec6413094005ab28e33a8c63c0f0e0a21d97 [file] [log] [blame]
// Copyright (c) 2023, 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.build.shrinker.r8integration;
import com.android.aapt.Resources.ResourceTable;
import com.android.build.shrinker.NoDebugReporter;
import com.android.build.shrinker.ResourceShrinkerModel;
import com.android.build.shrinker.ResourceTableUtilKt;
import com.android.build.shrinker.ShrinkerDebugReporter;
import com.android.ide.common.resources.ResourcesUtil;
import com.android.ide.common.resources.usage.ResourceUsageModel;
import com.android.ide.common.resources.usage.ResourceUsageModel.Resource;
import com.android.resources.ResourceType;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collections;
import java.util.List;
public class R8ResourceShrinkerState {
private R8ResourceShrinkerModel r8ResourceShrinkerModel;
public List<String> trace(int id) {
Resource resource = r8ResourceShrinkerModel.getResourceStore().getResource(id);
ResourceUsageModel.markReachable(resource);
return Collections.emptyList();
}
public void setResourceTableInput(InputStream inputStream) {
r8ResourceShrinkerModel = new R8ResourceShrinkerModel(NoDebugReporter.INSTANCE, true);
r8ResourceShrinkerModel.instantiateFromResourceTable(inputStream);
}
private static class R8ResourceShrinkerModel extends ResourceShrinkerModel {
public R8ResourceShrinkerModel(
ShrinkerDebugReporter debugReporter, boolean supportMultipackages) {
super(debugReporter, supportMultipackages);
}
// Similar to instantiation in ProtoResourceTableGatherer, but using an inputstream.
public void instantiateFromResourceTable(InputStream inputStream) {
try {
ResourceTable resourceTable = ResourceTable.parseFrom(inputStream);
ResourceTableUtilKt.entriesSequence(resourceTable)
.iterator()
.forEachRemaining(
entryWrapper -> {
ResourceType resourceType = ResourceType.fromClassName(entryWrapper.getType());
if (resourceType != ResourceType.STYLEABLE) {
this.addResource(
resourceType,
entryWrapper.getPackageName(),
ResourcesUtil.resourceNameToFieldName(entryWrapper.getEntry().getName()),
entryWrapper.getId());
}
});
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}
}