安卓productFlavors多渠道打包简单使用

时间:2025-01-18 19:32:56

按需求来介绍功能:

打包的时候,打出多个包

1.不同包名

2.不同app名,不同icon

3.代码里同一个变量名,但是对应不同的值

4.根据不同渠道引入不同的sdk,以及不同渠道不同java代码

5.不同渠道,又一个公用的assets文件夹,有私有的assets文件夹

6.不同渠道不同libs文件夹

步骤:

(1)打开app文件夹下面的

在andriod对象下面加入

flavorDimensions 'aaa'

这玩意我也不知道是什么,大概是代表一个维度,解决上诉问题,我们只需要一个维度就够了,

(2)然后新建各个渠道配置

还是在andriod这个对象下,添加productFlavors这个对象,里面配置了3个渠道,渠道中的

dimension 属性要对应上诉建立的维度

productFlavors {
    'TapTap' {
        dimension 'aaa'
        applicationId ".m4399"
        versionCode 2
        versionName "2.0"
        signingConfig 
        manifestPlaceholders = [
                APP_NAME: "app_name",
                APP_ICON: "@drawable/icon"
        ]       
        buildConfigField "String","Data_Ani_Name",'"TapTap"'
    }
    'hykb' {
        dimension 'aaa'
        buildConfigField "String","Data_Ani_Name",'"好游快爆"'
    }
    'ghzs' {
        dimension 'aaa'
        buildConfigField "String","Data_Ani_Name",'"光环助手"'
    }
}

上诉配置的介绍:

1.看上诉taptap渠道信息中有一个applicationId,就是定义这个渠道独特的包名。

这个属性是定义 文件中变量的,

上诉定义了APP_NAME: "app_name",我们在这样写

android:label="${APP_NAME}",那么打包后app名就会应用这里的APP_NAME这个变量

APP_ICON也是这样。

这个变量就是定义一个变量,不用渠道包,变量值是不一样的,上诉taptap渠道中的意思就是定义一个string类型的变量,变量名Data_Ani_Name,变量值是TapTap,注意看上诉变量值TapTap是用单引号括起来的双引号,然后怎么在代码中用呢,

BuildConfig.Data_Ani_Name ,BuildConfig这个对象,在你配置好上诉渠道后,点击编译后,会自动生成,在 app/build/generated/source这个文件夹下面

4.还有就是解决不同渠道引入不同sdk,

正常引入是

implementation()

单独一个渠道引入是 渠道名+implementation,如 TapTapImplementation()

这样写之后,我们只有把 build variants 选择到我们定义的taptap,才能访问到第三方sdk

4.1 怎么不同渠道写不同的代码:

新建渠道文件夹,在app/src下面,main文件夹的同级新建你渠道名文件夹,然后下面的目录要跟main里面的目录一样,一般就是src右键new=>directory,名字是你渠道名,然后右键渠道文件夹,

new=>directory,java文件夹,然后右键java文件夹new=>package,跟你main文件夹下面一样的包名,然后在每个渠道文件夹下面的包名文件夹下面就可以新建一个main中没有的java文件,在MainActivity中调用它,各自写不同的代码。

eg:最后打包的时候,渠道文件夹中的文件会和main文件夹的文件合并的,合并规则大概是,资源一样的话,会被渠道包的覆盖,java文件不能同名,会报错,所以我们上面的方案是只在渠道文件夹下面新建main中没有的一个java文件,xml文件会按一定规则合并,非常复杂。

4.2 想在不同渠道下面建立不同的文件,在渠道包文件夹下面右键=>new=>other=>android mainfest,然后在里面写一些你要加入的东西,点击文件下方有个

merged mainfest 按钮可以查看合并后的mainfest文件,我们打包apk时,mainfest文件会合成一个,把你的main中的,变体中的,第三方sdk中的mainfest文件都会合成一个,我们可以在这查看合并后的文件,是不是你想要的

4.3 之前我有个方案,多渠道写不同java代码,是在渠道中新建了一个入口类,继承了main中的入口类,这样就导致了入口类名字不一样了,因为变体中java不能同名。我就只能在变体中修改mainfest中的入口类那个标签

<manifest xmlns:andro
    xmlns:tools="/tools"
    package="">

    <application>
        <activity android:name=".MainActivity"
            tools:node= "remove"></activity>
        <activity android:name=".AppActivity"
            android:launchMode="singleTask"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="adjustPan|stateAlwaysVisible"
            android:configChanges="orientation|keyboardHidden|screenSize|screenLayout"
            android:theme="@android:style/">
            <intent-filter>
                <action android:name="" />

                <category android:name="" />
            </intent-filter>
        </activity>
    </application>

</manifest>

主要就是用到了 tool:node="remove",删除android:name='.MainActivity' 的activty

然后加上下面我们新设置的入口类,mainfest的标签activity的唯一标记andriod:name是标签的唯一值,是在合并时寻找标签的依据

5.

方法1:关于不同渠道sdk中的assets,res文件夹,直接复制过来,放在自己项目src/维度名/,文件夹下面即可,选择这个渠道打包时,会把assets,res,文件夹和main维度合并的

方法2:

sourceSets {
        // 默认构建维度,所有版本都会包含的assets
        main {
             = ['../assets']
             = ['libs']
        }
        oppo {
             += ['../oppoAssets']   注意这里使用'='或者'+=',前者会替换默认值,后者会追加路径
        }
    }

我们公用的assets文件就是 '../assets',oppo渠道最终会把两个文件夹的东西在打包的时候,都打到包中的assets文件夹中 

6.

对于不同渠道需要引入不同的so文件,就是x86,那几个文件夹下的.so文件,直接把渠道的

lib文件夹整个复制到app/ 文件夹下,文件夹名自己取一个,使用下面的配置,

+= ['vivolibs'],  这个东西的作用就是打包时,把这个维度的

这个文件夹下的so文件夹也要打包进去

sourceSets {
        main {
             = ['../assets']
             = ['libs']
        }
        oppo {
             = ['../assets','../oppoAssets']
        }
        vivo {
             = ['../assets','../vivoAssets']
             += ['vivolibs']
        }
    }

//end

最后就是打出包来,我是在build/generate siged apk/ 下面打包的,就可以选择不用渠道的,也可以同时多选,手动打包缺点就是没法选择不同的签名,如果你有不同渠道不同签名的需求,那就要使用命令行打包,否则每次手动打包就要重新选择签名