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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user