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

按需求来介绍功能:

打包的时候,打出多个包

1.不同包名

2.不同app名,不同icon

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

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

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

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

步骤:

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

在andriod对象下面加入

flavorDimensions 'aaa'

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

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

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

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

productFlavors {
    'TapTap' {
        dimension 'aaa'
        applicationId "com.canlonggame.mjyz.m4399"
        versionCode 2
        versionName "2.0"
        signingConfig signingConfigs.mjyz
        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,就是定义这个渠道独特的包名。

2.manifestPlaceholders这个属性是定义 AndriodMainfest.xml文件中变量的,

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

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

APP_ICON也是这样。

3.buildConfigField 这个变量就是定义一个变量,不用渠道包,变量值是不一样的,上诉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 想在不同渠道下面建立不同的Androidmainfest.xml文件,在渠道包文件夹下面右键=>new=>other=>android mainfest,然后在里面写一些你要加入的东西,点击文件下方有个

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

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

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.canlonggame.mjyz">

    <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/Theme.NoTitleBar.Fullscreen">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </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.srcDirs = ['../assets']
            jniLibs.srcDirs = ['libs']
        }
        oppo {
            assets.srcDirs += ['../oppoAssets']   注意这里使用'='或者'+=',前者会替换默认值,后者会追加路径
        }
    }

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

6.

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

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

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

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

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

//end

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值