2025-06-21

【Android】設定建構變化版本 -- 分開建立測試、正式版本 app

參考資料 ----


老人家的 app 有置入 AdMob 播放廣告,但 Google 要求 app 開發、測試期間,app 內的廣告要採用測試廣告,且抓得頗嚴,所以覺得蠻麻煩的。有時候,app 上架了才發現沒有換回正式廣告,就得再更正後再重上架...😒


偶然間,發現可以【設定建構變化版本】,這功能超好用的!

AdMob 的每種類型廣告都有個廣告 ID,在開發、測試期間要使用測試 IDdebug 時播放的廣告就會是測試廣告,要設定廣告,須在 /res/values/strings.xml 指定該類型廣告的 ID
 
<resources>
...
...

<!-- 上架前要 mark 起來 -->
<!-- adMob app id 測試 -->
<string name="admob_app">ca-app-pub-3940256099942544~3347511713</string>
<!-- 橫幅 測試 -->
<string name="admob_banner">ca-app-pub-3940256099942544/6300978111</string>
<!-- 插頁 測試 -->
<string name="admob_interstitial">ca-app-pub-3940256099942544/8691691433</string>
<!--  影片 測試 -->
<string name="admob_video">ca-app-pub-3940256099942544/5224354917</string>

<!-- 開發時期先 mark 起來,等要上架前再恢復 -->
<!-- adMob app id 正式 -->
<!-- <string name="admob_app">ca-app-pub-blablaXXXXXXXXXX~XXXXXXXXXX</string> -->
<!-- AdMob 橫幅 正式 -->
<!-- <string name="admob_banner">ca-app-pub-blablaXXXXXXXXXX/aaaaaaaaaa</string> -->
<!-- AdMob 插頁 正式 -->
<!-- <string name="admob_interstitial">ca-app-pub-blablaXXXXXXXXXX/bbbbbbbbbb</string> -->
<!-- AdMob 影片 正式 -->
<!-- <string name="admob_video">ca-app-pub-blablaXXXXXXXXXX/cccccccccc</string> -->

...
...
</resources>
 


現在,改在 app 層級build.gradle 設定
 
android {

...
...

    buildTypes {
        debug {
            // 開發、測試期
            
            applicationId "com.example.dev"
            resValue 'string', 'app_name', '測試版 app'
            
            // adMob app id
            resValue "string", "admob_app_id", "ca-app-pub-3940256099942544~3347511713"
            // 橫幅 測試
            resValue "string", "banner_id", "ca-app-pub-3940256099942544/6300978111"
            // 插頁 測試
            resValue "string", "interstitial_id", "ca-app-pub-3940256099942544/8691691433"
        }

        release {
            // 正式
            
            applicationId "com.example.prod"
            resValue 'string', 'app_name', '正式版 app'
            
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

            // adMob app id
            resValue "string", "admob_app_id", "ca-app-pub-blablaXXXXXXXXXX~XXXXXXXXXX"
            // 橫幅 正式
            resValue "string", "banner_id", "ca-app-pub-blablaXXXXXXXXXX/aaaaaaaaaa"
            // 插頁 正式
            resValue "string", "interstitial_id", "ca-app-pub-blablaXXXXXXXXXX/bbbbbbbbbb"
        }
    }

...
...
}
 

不僅如此,還可以設定 測試版 跟 正式版 不同的 applicationId,這麼做,就可以在同一支開發手機同時安裝 測試版 跟 正式版 app

功能表選擇 Build → Select Build Variant,會看到可編譯的版本的選項。


productFlavorsBuildTypes 的進階設定,可以變化出更多的 Build Variant,如下圖:


另有一個常見的情況:
某個特定的 API 在某版本起被棄用,Google 強制規定要改用新的 API(Google 還蠻常做這事的...所以要配合 Google,大約每半年要檢視自己的 app 是否能在各 Android 版本上正常運行);例如:
app 原本在 API SDK30 前都可正常運行,但自 SDK31 起須改變程式寫法,在 build.gradle 設定 minSdkVersion 31,程式改好後,可將新版的 apk 取不同的檔名,上架到 PlayStore,如此,就分出新舊版本了,手機中的 PlayStore app 會自動判別,挑選最適合手機的版本 -- 手機版本在 SDK30 前的 user 會下載安裝舊版的 app,而手機版本在 SDK31 後的 user 則會下載新版的 app,不會因為 app 改版而放棄舊版本手機的 user



沒有留言:

張貼留言