Mục 3

🎛️ Remote Config

Danh sách công tắc đổi được từ server — bật/tắt ads, đổi tần suất, đổi giới hạn tính năng — mà không cần cập nhật app, không cần lên store.

Chốt theo code ngày 06/08/2026. Toàn bộ tên công tắc + giá trị mặc định lấy trực tiếp từ mã nguồn hiện tại. Phải rà lại trang này khi dev thêm/xoá công tắc hoặc đổi giá trị mặc định — đối chiếu chéo với trang Ads.
Mục lục trang

1 Remote Config hoạt động thế nào

Hiểu đúng phần này để không kỳ vọng sai: đổi trên server không phải lúc nào cũng thấy ngay trên máy.

1 · Đổi trên Firebase Console

Người phụ trách vào Firebase Console → Remote Config, sửa giá trị công tắc rồi bấm Publish changes.

2 · App tải về

App lấy giá trị mới về vào một số thời điểm nhất định (thường là lúc mở app).

3 · Áp dụng

Giá trị mới có tác dụng. Chưa tải kịp thì app dùng giá trị mặc định cài sẵn trong bản build.

🕐 App lấy giá trị mới lúc nào
  • Mở app từ đầu (cold start) — luôn thử tải bản mới nhất ngay, bỏ qua giới hạn chờ 1 tiếng. Nếu mạng chậm, tối đa đợi khoảng 8 giây rồi vào app luôn với giá trị cũ/mặc định — màn khởi động không bao giờ bị treo vì chờ tải.
  • Quay lại app từ nền (bấm Home rồi mở lại) — tự tải, nhưng tối đa 1 lần mỗi tiếng để đỡ tốn tài nguyên.
  • Tự làm mới định kỳ mỗi 6 tiếng — dành cho máy đặt app này làm Màn hình chính và không tắt app trong nhiều giờ liền (đổi chu kỳ được ở khoá remote_config_refresh_hours, mục 3).
  • Đẩy trực tiếp khi bấm Publish trên Firebase Console — app đang mở nhận tín hiệu gần như ngay, nhưng cố tình chờ thêm một khoảng rồi mới thật sự áp dụng (mặc định 30 phút, khoá force_update_delay_minutes) — tránh đổi hành vi giữa lúc người dùng đang thao tác dở.

✅ Muốn thấy ngay lúc test

Tắt hẳn app (vuốt khỏi danh sách Recents) rồi mở lại — không cần xoá dữ liệu app. Lần mở đầu tiên sau khi tắt hẳn luôn tải bản mới nhất từ server.

📶 Không có mạng

App dùng bản đã tải lần gần nhất, lưu sẵn trên máy. Máy chưa từng tải được lần nào (vừa cài, mở lần đầu không có mạng) → dùng đúng giá trị mặc định đóng cứng trong bản build (cột "Mặc định" ở các bảng bên dưới).

⚠️ Điều dễ hiểu sai
Đổi công tắc trên server không làm app tự khởi động lại. Người dùng đang mở app có thể vẫn thấy hành vi cũ cho tới lần mở app sau (hoặc tới khi hết thời gian chờ áp dụng ở mục "Đẩy trực tiếp" phía trên).
🧪 Riêng bản build nội bộ dùng để test
Trên bản debugreleaseDev, toàn bộ ads bị tắt cứng trong code (cả 4 loại: inter ads · AOA · native ads · reward ads) — mọi công tắc ads trên server đều KHÔNG có tác dụng ở 2 bản đó. Muốn test hay đo ads thì phải dùng bản release thật. Xem cảnh báo ở trang Ads.

2 Công tắc bật / tắt

Nhóm bật/tắt nhanh — dùng khi cần dừng một loại ads mà không sửa app.

Công tắc Mặc định Điều khiển gì
ads_enabled Bật
  • Công tắc tổng của toàn bộ ads trong app.
  • Tắt cái này là cả app sạch ads, bất kể các công tắc riêng bên dưới đang bật hay tắt.
inter_ad_on_off Bật
  • Inter ads (ad che kín màn, chèn giữa 2 thao tác) — show khi đóng một số màn hoặc chuyển màn.
native_ad_on_off Bật
  • Native ads (ô ads chèn trong nội dung) — show ở rất nhiều màn, xem chi tiết ở mục 4.
open_ad_on_off Bật
  • AOA (App Open Ads) nói chung — cả màn khởi động lẫn lúc quay lại app.
isShowAOAResume Bật
  • Riêng cho lúc quay lại app SAU KHI đã rời sang app khác một lúc (không phải lần mở app đầu tiên trong ngày).
reward_ad_on_off Bật
  • Reward ads (người dùng tự bấm xem để nhận quyền lợi) — nút "Xem quảng cáo" ở Chat AI (hết lượt chat trong ngày, xem để nhận thêm 1 lượt) và ở Theme Store (mở khoá một mục, xem để nhận thêm xu/theme).
Nguồn: firebase/AppConfig.kt, firebase/RemoteConfigManager.kt, ads/AdUnitIds.kt
🔗 Liên quan
Tắt công tắc tổng là 1 trong các trường hợp app sạch ads → xem Khi nào KHÔNG có ads. Ngoài ra, người dùng đã mua Premium cũng luôn không thấy ads, bất kể các công tắc này đang bật hay tắt trên server.

3 Tần suất & thời gian chờ

Nhóm con số: capping giữa 2 ads, timeout khi load ad, thời gian giữ màn logo.

Công tắc Đơn vị Mặc định Đổi thì ảnh hưởng gì
inter_ad_capping_time giây 20
  • Capping (giãn cách) tối thiểu giữa 2 lần show inter ads liên tiếp.
  • Giảm → ads dồn dập hơn. Tăng → giãn ra, ít ads hơn.
open_ad_capping_time giây 25
  • Capping tối thiểu giữa 2 lần show AOA (App Open Ads) liên tiếp.
native_loading_min_show giây 4
  • Thời gian tối thiểu giữ native ads ở các màn "đang tải", trước khi cho full-screen ads che lên.
  • 0 = không giữ, cho che ngay khi ad load xong.
native_tab_idle_seconds giây 180
  • Mới 05/08/2026. Rời một tab bao lâu thì app nhả native ads của tab đó ra khỏi bộ nhớ. Quay lại trong khoảng này = thấy đúng ad cũ, không request lại.
  • Áp cho: Theme Store (5 tab), Thư viện ảnh (Library/Albums), Cài đặt (Chính/Tính năng).
  • 0 = nhả ngay khi rời tab → tab nào quay lại cũng request ad mới (quay về hành vi cũ, dùng khi cần cứu bộ nhớ máy yếu).
  • Tăng cao → đỡ tốn lượt request nhưng phiên dài giữ nhiều ad sống cùng lúc. Trần 7200 (2 giờ).
native_home_page_idle_seconds giây 10
  • Giống native_tab_idle_seconds nhưng tách riêng cho trang Home ngoài (DailyOpen / Thư viện ứng dụng) và Spotlight — rời trang bao lâu thì nhả native ads của trang đó.
  • Mặc định thấp hơn nhiều (10 giây so với 180 giây) vì vuốt qua lại giữa các trang Home nhanh hơn hẳn đổi tab, không muốn giữ ad sống lâu vô ích.
  • 0 = nhả ngay khi rời trang. Trần 7200 (2 giờ).
timeOutAOASplash giây 15
  • Timeout màn khởi động chờ AOA, quá giờ này thì bỏ qua và vào app luôn.
timeMinDelaySplash giây 3
  • Thời gian tối thiểu giữ màn khởi động, dù mọi thứ (tải cấu hình, ads…) xong sớm hơn.
timeOutSplash giây 20
  • Timeout cho toàn bộ chuỗi màn khởi động (tải cấu hình + Consent UMP (GDPR) + ads).
  • Hết giờ này là vào app luôn dù chưa xong — tránh treo màn khởi động.
inhouse_timeOutAOA giây 15
  • Timeout chờ AOA khi mở một ứng dụng con (Thời tiết, Đồng hồ, Máy tính, Thư viện ảnh, Chat AI…) lần đầu.
inhouse_timeMinDelay giây 3
  • Thời gian tối thiểu giữ màn tải khi mở một ứng dụng con.
inhouse_timeOutAOAResume giây 6
  • Timeout chờ AOA khi quay lại một ứng dụng con từ nền.
remote_config_refresh_hours giờ 6
  • Chu kỳ tự làm mới cấu hình khi app luôn chạy nền, không tắt (xem mục 1).
force_update_delay_minutes phút 30
  • Sau khi bấm Publish changes trên Firebase Console, app đang mở chờ bao lâu rồi mới thật sự áp dụng cấu hình mới.
  • 0 = áp dụng gần như ngay.
Nguồn: firebase/AppConfig.kt, firebase/RemoteConfigManager.kt, ads/InterstitialAdManager.kt, ads/SplashAppOpenAdLoader.kt
⚠️ Đổi số phải cân nhắc
Giảm capping xuống quá thấp → ads show dồn dập, người dùng bỏ app và đánh giá 1 sao. Tăng timeout load ad quá cao → mở app chậm, cảm giác app bị treo.

4 Bật/tắt native ads theo từng màn

Ngoài công tắc theo loại, còn công tắc riêng cho từng vị trí — tắt một chỗ mà không ảnh hưởng chỗ khác.

Màn hình / vị trí Công tắc Mặc định
Màn chọn ngôn ngữ (cả step 1 và step 2, dùng chung 1 công tắc) native_isShowLanguage Bật
Màn giới thiệu lần đầu sau khi cài app (Intro) intro_isShowNative Bật
Màn giới thiệu khi mở một ứng dụng con lần đầu inhouse_isShowNativeIntro Bật
Mọi màn "đang tải" dùng chung (khởi động, mở ứng dụng con, chờ full-screen ads, tải Theme Store / phần thưởng) — trừ overlay "Chào mừng trở lại" hiện quá nhanh native_isShowLoading Bật
Trang chủ Cài đặt + màn Danh sách tính năng native_isShowSettingHeader Bật
Cài đặt > Thư viện ứng dụng native_isShowAppLibrarySettings Bật
Cài đặt > Đổi icon ứng dụng (màn chính) native_isShowChangeIcon Bật
Cài đặt > Đổi tên ứng dụng (màn chính) native_isShowChangeName Bật
Màn Tối ưu ứng dụng (App Optimize) native_isShowOptimize Bật
8 màn con trong Cài đặt dùng CHUNG 1 công tắc: Cài đặt chung, Hiệu ứng chuyển màn, Trung tâm điều khiển (+ màn Vị trí), Thông báo huy hiệu, màn chọn icon, màn chọn tên, Ứng dụng ẩn native_isShowSettingSub Bật
Không còn tác dụng — trước dùng để bật/tắt việc giữ sẵn ad cho màn "đang tải". Cơ chế giữ sẵn đã bị bỏ, giờ mọi ô native ads đều request mới mỗi lần vào màn. Đổi công tắc này không đổi gì cả — xem cách app load ads. native_isCacheLoading Bật (vô nghĩa)
Nguồn: firebase/AppConfig.kt (NativeAdsConfig, IntroConfig, InHouseAppConfig) + call-site từng màn trong ui/settings/, ui/LanguageScreen.kt, ui/IntroScreen.kt, ui/AppIntroScreen.kt, ui/AppOptimizeScreen.kt
ℹ️ Lưu ý
Riêng màn Trung tâm điều khiển > Hình nền KHÔNG nằm trong nhóm 8 màn con ở trên — màn đó không có ads. Bảng này bám theo bảng màn nào có ads gì ở trang Ads — nếu hai trang lệch nhau thì báo lại để đồng bộ.

5 Giới hạn tính năng

Không phải công tắc ads, nhưng cùng điều khiển từ xa: số lượt miễn phí, nội dung mở khoá…

Chat AI & Theme Store

Công tắc Mặc định Điều khiển gì
chat_daily_free 5 lượt/ngày
  • Số lượt chat với AI miễn phí mỗi ngày cho người chưa mua Premium. Hết lượt thì phải xem reward ads để nhận thêm.
  • ⚠️ App tự giữ TỐI THIỂU 5 lượt/ngày — đặt số nhỏ hơn 5 trên server sẽ không có tác dụng, chỉ tăng lên trên 5 mới đổi được thật.
coin_default_balance 5 xu
  • Số xu tặng một lần duy nhất cho người dùng mới, ngay khi vào Theme Store lần đầu.
theme_store_new_days 7 ngày
  • Số ngày một mục trong Theme Store (giao diện / bộ icon / hình nền / widget) còn được gắn nhãn "Mới", tính từ ngày cập nhật.
Nguồn: data/chat/ChatCreditStore.kt, data/themestore/CoinStore.kt, data/themestore/RemoteThemeStoreRepository.kt

Bắt buộc cập nhật ứng dụng

Công tắc Mặc định Điều khiển gì
force_update_version Tắt
  • Công tắc tổng cho cơ chế bắt buộc cập nhật. Bật cũng chỉ thật sự chặn người dùng nếu bản họ đang chạy CŨ HƠN app_version.
app_version (rỗng)
  • Phiên bản thấp nhất được phép dùng, dạng "1.2.3". Để trống → không chặn ai (an toàn, tránh khoá nhầm toàn bộ người dùng).
Nguồn: firebase/AppConfig.kt (forceUpdateRequired)

6 Bảng đầy đủ

Toàn bộ công tắc trong một bảng, có ô tìm nhanh. Đây là bảng dùng khi gửi yêu cầu chỉnh cấu hình.

Công tắc Kiểu Mặc định Điều khiển gì Đổi thì ảnh hưởng đâu
ads_enabled Bật/tắt Bật Công tắc tổng toàn bộ ads Toàn app (mọi loại ads)
inter_ad_on_off Bật/tắt Bật Inter ads Mọi chỗ hiện inter ads
native_ad_on_off Bật/tắt Bật Native ads (ô ads trong nội dung) Mọi màn có native ads — xem mục 4
open_ad_on_off Bật/tắt Bật AOA (App Open Ads) nói chung Màn khởi động + lúc quay lại app
isShowAOAResume Bật/tắt Bật Riêng AOA lúc quay lại app (không phải mở lần đầu) Lúc chuyển từ app khác về lại launcher
reward_ad_on_off Bật/tắt Bật Reward ads Nút "Xem quảng cáo" (reward ads) ở Chat AI & Theme Store
inter_ad_capping_time Số giây 20 Capping tối thiểu giữa 2 lần show inter ads Toàn app
open_ad_capping_time Số giây 25 Capping tối thiểu giữa 2 lần show AOA Toàn app
native_loading_min_show Số giây 4 Thời gian tối thiểu giữ native ads ở màn "đang tải" trước khi cho full-screen ads che lên Mọi màn đang tải
native_tab_idle_seconds Số giây 180 Rời tab bao lâu thì nhả native ads của tab đó (0 = nhả ngay, tab nào quay lại cũng request ad mới) Theme Store (5 tab), Thư viện ảnh (Library/Albums), Cài đặt (Chính/Tính năng) — xem cách app load ads
native_home_page_idle_seconds Số giây 10 Như native_tab_idle_seconds nhưng riêng cho trang Home ngoài/Spotlight — mặc định thấp hơn vì vuốt trang nhanh hơn đổi tab DailyOpen, Thư viện ứng dụng (outer Home pager), Spotlight
timeOutAOASplash Số giây 15 Timeout màn khởi động chờ AOA Màn khởi động (splash)
timeMinDelaySplash Số giây 3 Thời gian tối thiểu giữ màn khởi động Màn khởi động (splash)
timeOutSplash Số giây 20 Timeout cho toàn bộ chuỗi màn khởi động Màn khởi động (splash)
isShowAdsSplash Bật/tắt Bật Công tắc tổng ads trên màn khởi động (splash) — tắt thì bỏ qua cả 2 nhánh inter/AOA bên dưới Màn khởi động (splash)
showInterOrAOASplash Bật/tắt Tắt Loại ads show trên màn khởi động: Bật = inter ads, Tắt = AOA (App Open Ads) Màn khởi động (splash)
isShowAOASplash Bật/tắt Bật Có show AOA trên màn khởi động không — chỉ có tác dụng khi showInterOrAOASplash đang Tắt (nhánh AOA) Màn khởi động (splash)
inhouse_timeOutAOA Số giây 15 Timeout chờ AOA khi mở ứng dụng con lần đầu Weather/Clock/Calculator/Gallery/Chat AI
inhouse_timeMinDelay Số giây 3 Thời gian tối thiểu giữ màn tải khi mở ứng dụng con như trên
inhouse_timeOutAOAResume Số giây 6 Timeout chờ AOA khi quay lại ứng dụng con từ nền như trên
inhouse_isShowAds Bật/tắt Bật Công tắc tổng ads (inter/AOA) khi mở ứng dụng con lần đầu — tắt thì bỏ qua nhánh ads ở cổng mở app con Weather/Clock/Calculator/Gallery/Chat AI
inhouse_showInterOrAOA Bật/tắt Bật Loại ads khi mở ứng dụng con lần đầu: Bật = inter ads, Tắt = AOA như trên
inhouse_isShowAdsResume Bật/tắt Bật Có show AOA khi quay lại ứng dụng con từ nền không như trên
remote_config_refresh_hours Số giờ 6 Chu kỳ tự làm mới cấu hình khi app luôn chạy nền không tắt Toàn app (không cần mở lại)
force_update_delay_minutes Số phút 30 Sau khi bấm Publish trên Firebase Console, app đang mở chờ bao lâu mới áp dụng cấu hình mới Toàn app
native_isShowLanguage Bật/tắt Bật Native ở màn chọn ngôn ngữ (cả 2 step) Onboarding
intro_isShowNative Bật/tắt Bật Native ở màn giới thiệu lần đầu (Intro) Onboarding
intro_isShowAds Bật/tắt Bật Công tắc tổng ads trên màn giới thiệu (Intro) Onboarding
intro_isSkip Bật/tắt Tắt Bỏ qua hẳn màn giới thiệu (Intro), vào thẳng màn chọn ngôn ngữ Onboarding
inhouse_isShowNativeIntro Bật/tắt Bật Native ở màn giới thiệu khi mở ứng dụng con lần đầu mọi ứng dụng con
native_isShowLoading Bật/tắt Bật Native ở mọi màn "đang tải" dùng chung splash / mở app con / chờ inter / tải Theme Store, thưởng
native_isCacheLoading Bật/tắt Bật Không còn tác dụng — cơ chế giữ sẵn ad cho màn "đang tải" đã bị bỏ cách app load ads
native_isShowSettingHeader Bật/tắt Bật Native ở Trang chủ Cài đặt + Danh sách tính năng 2 màn đó
native_isShowAppLibrarySettings Bật/tắt Bật Native ở Cài đặt > Thư viện ứng dụng màn đó
native_isShowChangeIcon Bật/tắt Bật Native ở Cài đặt > Đổi icon ứng dụng (màn chính) màn đó
native_isShowChangeName Bật/tắt Bật Native ở Cài đặt > Đổi tên ứng dụng (màn chính) màn đó
native_isShowOptimize Bật/tắt Bật Native ở màn Tối ưu ứng dụng màn đó
native_isShowSettingSub Bật/tắt Bật Native dùng chung cho 8 màn con trong Cài đặt Cài đặt chung, Hiệu ứng chuyển màn, Trung tâm điều khiển (+ Vị trí), Thông báo huy hiệu, chọn icon, chọn tên, Ứng dụng ẩn
native_banner_button Số lần lặp 0 Luân phiên đưa nút hành động của thẻ native dọc lên phía trên; 0 = nút luôn ở dưới, N>0 = N lần dưới rồi 1 lần trên rồi lặp lại Native ads dạng dọc
native_full_button Cấu hình nhiều phần Tính năng đang TẮT Có hiện thêm 1 native full ads ngay sau khi đóng inter ads không, và đếm ngược bao lâu trước khi cho thoát Mọi chỗ đóng inter ads — đổi cần phối hợp với dev vì nhiều phần đi cùng nhau
chat_daily_free Số lượt/ngày 5 Số lượt chat AI miễn phí mỗi ngày (tự giữ tối thiểu 5, đặt thấp hơn không có tác dụng) Chat AI
coin_default_balance Số xu 5 Số xu tặng một lần cho người dùng mới Theme Store (ví xu)
theme_store_new_days Số ngày 7 Số ngày một mục còn gắn nhãn "Mới" Theme Store
force_update_version Bật/tắt Tắt Công tắc tổng bắt buộc cập nhật (chỉ chặn khi bản đang chạy cũ hơn app_version) Toàn app (màn chặn cập nhật)
app_version Chuỗi (số phiên bản) (rỗng) Phiên bản thấp nhất được phép dùng, dạng "1.2.3"; để trống = không chặn ai như trên
open_ad_id · native_ad_id · native_loading_id · native_full_id · inter_ad_id · reward_id Mã kỹ thuật (chuỗi) đã có sẵn ID thật Xác định đúng ad unit nào trên hệ thống AdMob hiển thị nội dung nào — không phải công tắc bật/tắt Chỉ đổi khi đổi tài khoản/ad unit AdMob, cần dev xác nhận. Để trống native_loading_id/native_full_id thì tự dùng lại native_ad_id
openai_key_enc · openai_key_salt · theme_key_enc · theme_key_salt · theme_url_enc · theme_url_salt Chuỗi mã hoá (rỗng) Khoá API để Chat AI gọi mô hình AI và để Theme Store tải nội dung — không phải công tắc, chỉ dev cấu hình Chat AI / Theme Store
Nguồn: firebase/AppConfig.kt, firebase/RemoteConfigManager.kt, ads/AdUnitIds.kt, ads/InterstitialAdManager.kt, ads/SplashAppOpenAdLoader.kt, ads/NativeCtaRotator.kt, firebase/NativeFullButtonConfig.kt, data/chat/ChatCreditStore.kt, data/themestore/CoinStore.kt, data/themestore/RemoteThemeStoreRepository.kt, MainActivity.kt (splash + inhouse resume flow), InhouseTaskActivity.kt (inhouse open-gate flow), ui/LauncherRoot.kt + ui/UnifiedHomeScreen.kt (native_home_page_idle_seconds)
📎 Ngoài phạm vi trang này
Còn một khoá notify_scenario_config (cấu hình nhiều lớp, nhiều phần phối hợp) điều khiển lịch đẩy thông báo nhắc mở lại app — đây là tính năng thông báo, không phải ads hay giới hạn tính năng, nên không liệt kê chi tiết ở trang này. Cần đổi thì hỏi dev trực tiếp.

7 Muốn đổi giá trị thì làm gì

Các step làm trên Firebase Console và những chỗ dễ hiểu sai khi kiểm tra kết quả.

  • Đổi ở đâu: Firebase Console → Remote Config → tìm đúng tên khoá ở bảng đầy đủ → sửa giá trị → Publish changes.
  • Ghi tên khoá y nguyên — phân biệt chữ hoa chữ thường. Sai một ký tự thì app không thấy khoá đó và âm thầm dùng giá trị mặc định, không báo lỗi gì.
  • Đổi cho một nhóm người dùng: dùng Conditions của Firebase (theo quốc gia, phiên bản app, phần trăm người dùng ngẫu nhiên) thay vì đổi cho tất cả.
  • Bao lâu có tác dụng: người đang mở app không thấy đổi ngay — xem mục 1 để biết app lấy cấu hình mới vào lúc nào.
  • Kiểm tra thật: tắt hẳn app rồi mở lại trên bản phát hành. Đừng kiểm bằng bản nội bộ của dev — bản đó khoá cứng một số công tắc, đổi trên Console không có tác dụng.
  • Trả lại như cũ: Firebase Console lưu lịch sử từng lần phát hành — vào Change history → chọn bản trước → Roll back. Không cần cập nhật app.
⚠️ Trước khi bấm Publish, ghi lại 3 thứ
Giá trị cũ (để trả lại nếu xấu đi) · giờ phát hành (để cắt mốc khi đọc báo cáo) · chỉ số muốn theo dõi. Đổi tần suất ads thường vừa tăng doanh thu vừa tăng người bỏ app — phải xem cả hai, đừng chỉ xem một.
📊 Sau khi đổi thì xem ở đâu
Đổi công tắc ads xong nên theo dõi số show / số click ở báo cáo → xem nhóm sự kiện Ads.