关于Android同一套代码打不同包实现

329 阅读1分钟

1、app Gradle android下添加 productFlavors节点 和 flavorDimensions 标识。如下代码

flavorDimensions 'default'
productFlavors {
    demo2 {
        applicationId "com.example.noticeTest"
        minSdk 21
        targetSdk 31
        versionCode 1
        versionName "1.9"
        manifestPlaceholders = [
                app_icon: "@mipmap/ic_launcher",
                app_name: "Test"]
    }
    demo {
        applicationId "com.example.noticedemo"
        minSdk 21
        targetSdk 31
        versionCode 2
        versionName "1.0"
        manifestPlaceholders = [
                app_icon: "@mipmap/icon",
                app_name: "Demo"]
    }
}

2、修改manifests下 app图标和名称。如下代码

android:icon="${app_icon}"
android:label="${app_name}"

**注意:必要时需添加以下代码解决冲突

tools:replace="icon,label"

3、manifests下 修改app图标和名称后若build报如下错误:

no value for <app_icon> is provided

需要在 defaultConfig下添加如下配置:

manifestPlaceholders = [
        app_icon: "@mipmap/ic_launcher",
        app_name: "Demo"]

4、第三方差异化配置需要添加到 manifestPlaceholders中。如下代码

manifestPlaceholders = [
        app_icon      : "@mipmap/icon",
        app_name      : "***",
        provider_name : "***",
        JPUSH_PKGNAME : applicationId,
        JPUSH_APPKEY  : "***",//值来自开发者平台取得的AppKey
        JPUSH_CHANNEL : "default_developer",]

5、provider 冲突问题,可通过添加 provider_name(如上图,名称可自取)或使用 applicationId。如下代码

 <provider
    android:name="cn.udesk.provider.UdeskExternalCacheProvider"
    android:authorities="${applicationId}.udesk_external_cache_provider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/udesk_provider_paths_external_cache" />
</provider>
 <provider
    android:name="cn.udesk.provider.UdeskExternalCacheProvider"
    android:authorities="${provider_name}"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/udesk_provider_paths_external_cache" />
</provider>

完成以上配置已经可以实现基础的差异化打包。

特别注意:

当 manifestPlaceholders 配置的值无效,都引用是 defaultConfig下 manifestPlaceholders 的配置时,可查看自己的Gradle配置里是否添加了一下代码:

productFlavors.all {
    flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}

此时需删除此部分代码,并将 UMENG_CHANNEL_VALUE 添加到各个 manifestPlaceholders中,如下:

manifestPlaceholders = [
        app_icon: "@mipmap/ic_launcher",
        app_name: "Demo",
        UMENG_CHANNEL_VALUE: name]