Giới thiệu
UserManager.isUserAGoat() là một Easter egg (trứng pha lê) của Google trong Android SDK. Phương thức này trả về true nếu ứng dụng "Goat Simulator" (com.coffeestainstudios.goatsimulator) được cài đặt, ngược lại trả về false.
Lịch sử
- API 17-20: Luôn trả về
false(hardcoded). - API 21+ (Lollipop): Kiểm tra package
com.coffeestainstudios.goatsimulator. - API 30+ (R): Đã bị deprecated và loại bỏ khỏi SDK công khai (vẫn có thể gọi qua reflection).
Mã nguồn tham khảo (AOSP)
// frameworks/base/core/java/android/os/UserManager.java
public boolean isUserAGoat() {
return getPackageManager().hasSystemFeature("android.hardware.goat");
// Hoặc kiểm tra package goat simulator
}
Trường hợp sử dụng THỰC TẾ (Hiếm khi)
| Mục đích | Mô tả |
|---|---|
| Debug/Testing placeholder | Dùng làm điều kiện giả để test luồng code nhanh chóng, sau đó xóa. |
| Easter egg trong app | Mở tính năng ẩn/hài hước khi user cài Goat Simulator. |
| Demo/Giáo dục | Minh họa Easter egg, API ẩn, hoặc hệ thống feature flag. |
Ví dụ code (Chỉ để tham khảo/học tập)
// KHÔNG DÙNG TRONG PRODUCTION
public void sillyExample() {
UserManager um = (UserManager) getSystemService(USER_SERVICE);
if (um.isUserAGoat()) {
// Unlock secret feature
showGoatMode();
}
}
Tại sao KHÔNG nên dùng trong production?
- Không ổn định: Đã deprecated, có thể bị xóa bất kỳ lúc nào.
- Vô nghĩa: Không mang ý nghĩa nghiệp vụ thực tế.
- Phụ thuộc app thứ 3: Dựa vào việc user cài một game cụ thể.
- Vi phạm nguyên tắc: Code phải rõ ràng, maintainable, professional.
Cách thay thế chuyên nghiệp
Dùng Feature Flags (Remote Config, Firebase Remote Config, LaunchDarkly) hoặc Build Config:
// BuildConfig (Gradle)
buildConfigField "boolean", "ENABLE_GOAT_MODE", "false"
// Code
if (BuildConfig.ENABLE_GOAT_MODE) { ... }
// Hoặc Remote Config (Firebase)
FirebaseRemoteConfig.getInstance().getBoolean("goat_mode_enabled")
Chạy ví dụ gốc (Nếu vẫn compile được)
Ví dụ gốc kiểm tra xem chính package của app có cài đặt không (luôn true) - logic sai so với ý nghĩa thực của API.


Kết luận
isUserAGoat() là một đùa (joke) của đội ngũ Android. Hãy cười một cái, hiểu bản chất, nhưng tuyệt đối không dùng trong code production.