Obfuscate usage stats data stored on disk.

All of the usage stats data stored on disk will now be obfuscated. There
will be a package to tokens mappings file stored on disk which has a
hierarchy of mappings for each string in each package's usage stats
data. A UsageStatsProtoV2 was added to keep the logic clean and separate
from the original usage stats proto parser.

Initial observations show a memory gain of over 60% w.r.t. the usage
stats data size on disk. There is also no performance hit because of this
change - in fact, even with the obfuscation overhead, reads are now over
65% faster and writes are up to 50% faster.

Bug: 135484470
Test: atest UsageStatsTest
Test: atest UsageStatsDatabaseTest
Test: atest UsageStatsDatabasePerfTest
Change-Id: I55ce729033d8b6e4051271802d57c72684053c32
This commit is contained in:
Varun Shah
2019-08-27 17:11:25 -07:00
parent 76e56e4039
commit e1ba9cde53
13 changed files with 1534 additions and 95 deletions

View File

@@ -30,6 +30,7 @@ import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import com.android.server.usage.IntervalStats;
import com.android.server.usage.PackagesTokenData;
import com.android.server.usage.UsageStatsDatabase;
import com.android.server.usage.UsageStatsDatabase.StatCombiner;
@@ -140,6 +141,37 @@ public class UsageStatsDatabasePerfTest {
}
}
private void runObfuscateStatsTest(int packageCount, int eventsPerPackage) {
final ManualBenchmarkState benchmarkState = mPerfManualStatusReporter.getBenchmarkState();
IntervalStats intervalStats = new IntervalStats();
populateIntervalStats(intervalStats, packageCount, eventsPerPackage);
long elapsedTimeNs = 0;
while (benchmarkState.keepRunning(elapsedTimeNs)) {
final long startTime = SystemClock.elapsedRealtimeNanos();
PackagesTokenData packagesTokenData = new PackagesTokenData();
intervalStats.obfuscateData(packagesTokenData);
final long endTime = SystemClock.elapsedRealtimeNanos();
elapsedTimeNs = endTime - startTime;
clearUsageStatsFiles();
}
}
private void runDeobfuscateStatsTest(int packageCount, int eventsPerPackage) {
final ManualBenchmarkState benchmarkState = mPerfManualStatusReporter.getBenchmarkState();
IntervalStats intervalStats = new IntervalStats();
populateIntervalStats(intervalStats, packageCount, eventsPerPackage);
long elapsedTimeNs = 0;
while (benchmarkState.keepRunning(elapsedTimeNs)) {
PackagesTokenData packagesTokenData = new PackagesTokenData();
intervalStats.obfuscateData(packagesTokenData);
final long startTime = SystemClock.elapsedRealtimeNanos();
intervalStats.deobfuscateData(packagesTokenData);
final long endTime = SystemClock.elapsedRealtimeNanos();
elapsedTimeNs = endTime - startTime;
clearUsageStatsFiles();
}
}
@Test
public void testQueryUsageStats_FewPkgsLightUse() throws IOException {
runQueryUsageStatsTest(FEW_PKGS, LIGHT_USE);
@@ -150,6 +182,16 @@ public class UsageStatsDatabasePerfTest {
runPutUsageStatsTest(FEW_PKGS, LIGHT_USE);
}
@Test
public void testObfuscateStats_FewPkgsLightUse() {
runObfuscateStatsTest(FEW_PKGS, LIGHT_USE);
}
@Test
public void testDeobfuscateStats_FewPkgsLightUse() {
runDeobfuscateStatsTest(FEW_PKGS, LIGHT_USE);
}
@Test
public void testQueryUsageStats_FewPkgsHeavyUse() throws IOException {
runQueryUsageStatsTest(FEW_PKGS, HEAVY_USE);
@@ -160,6 +202,16 @@ public class UsageStatsDatabasePerfTest {
runPutUsageStatsTest(FEW_PKGS, HEAVY_USE);
}
@Test
public void testObfuscateStats_FewPkgsHeavyUse() {
runObfuscateStatsTest(FEW_PKGS, HEAVY_USE);
}
@Test
public void testDeobfuscateStats_FewPkgsHeavyUse() {
runDeobfuscateStatsTest(FEW_PKGS, HEAVY_USE);
}
@Test
public void testQueryUsageStats_ManyPkgsLightUse() throws IOException {
runQueryUsageStatsTest(MANY_PKGS, LIGHT_USE);
@@ -170,6 +222,16 @@ public class UsageStatsDatabasePerfTest {
runPutUsageStatsTest(MANY_PKGS, LIGHT_USE);
}
@Test
public void testObfuscateStats_ManyPkgsLightUse() {
runObfuscateStatsTest(MANY_PKGS, LIGHT_USE);
}
@Test
public void testDeobfuscateStats_ManyPkgsLightUse() {
runDeobfuscateStatsTest(MANY_PKGS, LIGHT_USE);
}
@Test
public void testQueryUsageStats_ManyPkgsHeavyUse() throws IOException {
runQueryUsageStatsTest(MANY_PKGS, HEAVY_USE);
@@ -179,4 +241,14 @@ public class UsageStatsDatabasePerfTest {
public void testPutUsageStats_ManyPkgsHeavyUse() throws IOException {
runPutUsageStatsTest(MANY_PKGS, HEAVY_USE);
}
@Test
public void testObfuscateStats_ManyPkgsHeavyUse() {
runObfuscateStatsTest(MANY_PKGS, HEAVY_USE);
}
@Test
public void testDeobfuscateStats_ManyPkgsHeavyUse() {
runDeobfuscateStatsTest(MANY_PKGS, HEAVY_USE);
}
}