按需求来介绍功能:
打包的时候,打出多个包
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/ 下面打包的,就可以选择不用渠道的,也可以同时多选,手动打包缺点就是没法选择不同的签名,如果你有不同渠道不同签名的需求,那就要使用命令行打包,否则每次手动打包就要重新选择签名