close

最近開始厭煩,反覆安裝app的正式版與開發版

安裝好又要重新登入,只為了看一些小東西。

以前的解決方式是,用兩台手機(好野人),開發與正式分別安裝在不同台。

但一般做法如何? 最近因工作需求,稍微實作的一下。

OS:

因程式碼都相同,只是產不同版本的話,以前的我就只能傻傻的更換package name並更動很多配置。

更動後還要額外測試是否正確。說真的頗花時間的。

過了五年了,又碰到該議題,應該有更加便利的方式處理吧

 

 

目的: 在同一裝置上,同時安裝dev 開發版與product 正式版

關鍵字

applicationIdSuffix、manifestPlaceholders

官方資料

就以概念來說好了,device os 如何判斷app的唯一性,

Anser:

android: package name

os: bundle id

藉由此概念,來找尋簡單方便調整 package name 的方式。以下我以android為例。

 

多版本

google 官方提出 使用uild.gradle 中的參數便可快速處理該問題

重要參數

applicationIdSuffix: 此參數代表在原本的package name 後面再加入字元。如:dev、alpha 、beta 等等字眼

android {
    defaultConfig {
        applicationId "com.example.myapp"
    }
    buildTypes {
        dev {
            applicationIdSuffix ".dev"
        }
        pro {
            applicationIdSuffix ".pro"
        }
    }
}

更動後,便可以在同一裝置安裝多版本了。沒想要意外的簡單。

不過事情還沒完,還要加入差異,用來區別dev / product的app

最常見的就是, app name, app icon, versionName 

 

動態 更動 App 名稱與 icon

大家都知道 Android 的 app name 與 app icon  會在AndroidManifest中做設定,定死了後面要調整不太容易

這邊只說官方提供的方式,manifestPlaceholders 

1. 先在 buildTypes中新增參數

android {
    buildTypes {
        release {
            manifestPlaceholders = [
                    icon_paht:"@mipmap/ic_launcher",
                    app_name:"@string/app_name",
            ]
        }
        dev {
            applicationIdSuffix ".dev"
            manifestPlaceholders = [
                    icon_paht:"@mipmap/ic_launcher_dev",
                    app_name:"@string/app_name_dev",
            ]
        }
    }
    ...
}

2. 調整 AndroidManifest 設定

<application
    android:icon="${icon_path}"
    android:label="${app_name}"

這樣就可以參考到對應值。

 

延伸問題

1. App 本身有用Deeplink/Applink。當使用deeplink時,若都有安裝的話,會開啟正式版的 (因為會先開啟沒有suffix的版本)。

建議如下:

domain 不調整,針對pathPrefix 路徑調整便可。這樣applink domain 不用更動, 也不會再想其他地方放assetlinks.json
參考方式
調整方式可用 manifestPlaceholders 方式處理

 

2. Firebase libs 找不到 dev 版本的package name 

我個人覺得很好的方式為, 在Firebase 專案中 新增 app, 並更新 google-services.json 便可

這邊有種種好處

1. Remote config 設定方便, 可以用 condition 的方式指定特定app ,對於串接remote config 來說, app 就不需要針對不同版本做更動

2. FCM: 因專案相同,這樣一來後端也不需要針對不同版本搞不同專案(FCM 會根據 裝置中的 app 產生唯一的token )

3. Crashlytics: 針對不同的app 紀錄 crash, 避免資料交叉污染。 ga 也可用相同方式濾掉 開發者的行為

 

arrow
arrow

    Owen Chen 發表在 痞客邦 留言(0) 人氣()