Quick Wins (Android)
Generated 2026-05-07 · Costco Android
Top 10 quick wins (android)
Each row is a sub-1-day fix that reduces immediate risk. Copy-paste the After block; verify locally; ship.
spread across the team
HIGH+ findings closed
QW-A-01 · Rename `test-progaurd-rules.pro` typo
30 minFilename typo (progaurd → proguard) shows up in every grep and confuses new engineers.
Costco/test-progaurd-rules.pro
Costco/test-proguard-rules.pro
# Update Costco/build.gradle reference too:
# testProguardFile 'test-proguard-rules.pro'
QW-A-02 · Move Maps API key out of committed gradle.properties
1 hourHardcoded Google Maps API key in a committed file is a poor-hygiene flag in any audit.
# gradle.properties (committed)
MAPS_API_KEY=AIzaSy...
# local.properties (gitignored)
MAPS_API_KEY=AIzaSy...
// Costco/build.gradle
def localProps = new Properties()
file(rootDir.absolutePath + "/local.properties").withInputStream { localProps.load(it) }
buildConfigField "String", "MAPS_API_KEY", "\"${localProps['MAPS_API_KEY']}\""
QW-A-03 · Move staging hosts out of production AndroidManifest
1 hourwww-vqa2.costco.ca and www-vqa3.costco.ca appear in production intent filters; should ship in debug only.
<!-- Costco/src/main/AndroidManifest.xml -->
<intent-filter android:autoVerify="true">
<data android:host="www-vqa2.costco.ca" />
<data android:host="www-vqa3.costco.ca" />
...
</intent-filter>
<!-- Costco/src/debug/AndroidManifest.xml (manifest merge) -->
<intent-filter>
<data android:host="www-vqa2.costco.ca" />
<data android:host="www-vqa3.costco.ca" />
</intent-filter>
<!-- Production manifest only contains real costco.com / costco.ca hosts -->
QW-A-04 · Replace Handler() with Handler(Looper.getMainLooper())
30 minDefault new Handler() is deprecated since API 30; uses calling thread's Looper.
// MainActivity.java:1864
new Handler().postDelayed(() -> {
// ... 3 second delay
}, 3000);
// MainActivity.java:1864
new Handler(Looper.getMainLooper()).postDelayed(() -> {
// ... 3 second delay
}, 3000);
QW-A-05 · Stop swallowing exception in CostcoApplication
30 minEmpty catch block in CostcoApplication.java:219 hides initialization failures.
// CostcoApplication.java:219
try {
// ... initialization
} catch (Exception e) {
}
// CostcoApplication.java:219
try {
// ... initialization
} catch (Exception e) {
Timber.e(e, "App init failed");
FirebaseCrashlytics.getInstance().recordException(e);
}
QW-A-06 · Add ABI splits / App Bundle for size
2 hoursSingle universal APK ships every architecture and language; users download megabytes they don't need.
// Costco/build.gradle (no splits configured)
android { ... }
android {
bundle {
language { enableSplit = true }
density { enableSplit = true }
abi { enableSplit = true }
}
}
QW-A-07 · Generate Lint baseline + commit
1 hourNo baseline means lint findings are background noise; with one, baseline diffs become actionable.
# No baseline today
./gradlew :Costco:lintDebug
# Lint writes Costco/lint-baseline.xml
git add Costco/lint-baseline.xml
git commit -m "chore(lint): freeze baseline"
// In Costco/build.gradle
android {
lint { baseline = file("lint-baseline.xml") }
}
QW-A-08 · Add Detekt + Ktlint with default rulesets
30 minNo Detekt / Ktlint configuration found at repo root.
# Detekt + Ktlint not configured
// Root build.gradle.kts
plugins {
id("io.gitlab.arturbosch.detekt") version "1.23.6"
id("com.diffplug.spotless") version "6.25.0"
}
subprojects {
apply(plugin = "io.gitlab.arturbosch.detekt")
apply(plugin = "com.diffplug.spotless")
spotless { kotlin { ktlint() } }
}
QW-A-09 · Add CODEOWNERS
15 minReviews are unrouted; with CODEOWNERS, GitHub/Azure auto-requests the right team.
# No CODEOWNERS
# .github/CODEOWNERS
* @costco-android/maintainers
/feature/account/ @costco-android/account-team
/feature/dmc/ @costco-android/dmc-team
/feature/warehouse/ @costco-android/warehouse-team
/shared/sdui/ @costco-android/platform
/shared/auth/ @costco-android/security
QW-A-10 · Strip Timber.Tree on release builds
10 minWithout a release tree filter, log strings (potentially PII) ship to logcat in release builds.
// CostcoApplication.kt
Timber.plant(Timber.DebugTree())
// CostcoApplication.kt
if (BuildConfig.DEBUG) {
Timber.plant(Timber.DebugTree())
} else {
Timber.plant(ReleaseTree()) // forwards Errors to Crashlytics; drops verbose/debug
}