anchor.diff:  
       final diffMap = buildComparisonTreemap(oldFile.data, newFile.data);
       diffMap['n'] = 'Root';
  -    final newRoot = generateDiffTree(diffMap);
  -
  -    changeDiffRoot(newRoot);
  +
  +    // TODO(peterdjlee): Try to move the non-active tree generation to separate isolates.
  +    _combinedDiffTreeRoot = generateDiffTree(
  +      diffMap,
  +      DiffTreeType.combined,
  +    );
  +    _increasedDiffTreeRoot = generateDiffTree(
  +      diffMap,
  +      DiffTreeType.increaseOnly,
  +    );
  +    _decreasedDiffTreeRoot = generateDiffTree(
  +      diffMap,
  +      DiffTreeType.decreaseOnly,
  +    );
  +
  +    changeDiffRoot(_activeDiffRoot);
     }
   
     TreemapNode generateTree(Map<String, dynamic> treeJson) {
  
positive.code:   /// * [DiffTreeType.increaseOnly]: returns a tree with nodes with positive [byteSize].
    /// * [DiffTreeType.decreaseOnly]: returns a tree with nodes with negative [byteSize].
    /// * [DiffTreeType.combined]: returns a tree with all nodes.
    TreemapNode generateDiffTree(Map<String, dynamic> treeJson) {
      final isLeafNode = treeJson['children'] == null;
      if (!isLeafNode) {
        return _buildNodeWithChildren(treeJson, showDiff: true);
      } else {
        // TODO(peterdjlee): Investigate why there are leaf nodes with size of null.
        final byteSize = treeJson['value'];
  
negative.code: 
      Map<String, dynamic> processedJson;
      if (jsonFile.isApkFile) {
        // APK analysis json should be processed already.
        processedJson = jsonFile.data;
      } else {
        processedJson = treemapFromJson(jsonFile.data);
  