今天整理了一下如何使用Android Studio发布多渠道apk (华为 OV 小米 等…) 及其.gradle配置
1.首先聊一聊多渠道的思路,无非就是productFlavors 这是Android Studio给的解决方案,我这边只不过把其用到全部实现到工程里,尤其是.gradle的配置 把各渠道的APPID和其它配置全部在这个文件配置完成,在分布到其它代码中直接调用。
2.讲一下我用的版本
1). Android Studio为2023 之所以没用2024是因为还要重新配置agp JDK 我这边就直接用我配置好的 看下图配置
用的4.2.2 对应7.5 JDK11 SDK是用的Unity自带的
如果是cocos2dx 或者其它引擎 SDK JDK自己根据需求配置
2).unity用的2021.3.20 导出再不多阐述
OK ! 接下来是正文
首先要把导出来的unity工程搞成一个壳子 这样我们以后只换 assets 和 jniLibs里的文件即可。看图:
那怎么才能把Unity导出的工程搞成这样呢
看下图:
要把unity导出的AS工程复制出一份当做壳子 原工程还要build用 以便日后更新.so和资源
把复制出来的工程的这里 注释掉
基本注释这两个地方然后把unityLibrary目录下的src下的assets java jniLibs res AndroidManifest.xml 复制到 launcher相同的目录下,差不多了,先不要把unityLibrary删除,万一哪里漏了可以在这里取。(因为我的初衷就是想要个AS多渠道的壳子,所以unityLibrary要去掉,不然每次重新编译.so会有些不方便,如果直接改原工程 那重新导出时会覆盖你在AS写的代码)
然后就是在Lanucher目录下的build.gradle里写代码 这就直接贴了:
apply plugin: 'com.android.application'
apply plugin: 'com.huawei.agconnect'
android {
signingConfigs {
release {
storeFile file('F:\\keystore\\key')
storePassword '123456'
keyAlias 'key'
keyPassword '123456'
}
debug {
storeFile file('F:\\keystore\\key')
storePassword '123456'
keyAlias 'key'
keyPassword '123456'
}
}
compileSdkVersion 30
buildToolsVersion '30.0.3'
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
defaultConfig {
minSdkVersion 22
targetSdkVersion 30
applicationId 'com.demo.platfrom'
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a'
}
versionCode 1
versionName '1.0'
}
aaptOptions {
noCompress = ['.unity3d', '.ress', '.resource', '.obb', '.bundle', '.unityexp'] + unityStreamingAssets.tokenize(', ')
ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~"
}
lintOptions {
abortOnError false
}
sourceSets.main {
jniLibs.srcDir 'libs'
jni.srcDirs = []
}
repositories {
flatDir {
dirs 'libs'
}
}
buildTypes {
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt')
signingConfig signingConfigs.debug
jniDebuggable true
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt')
signingConfig signingConfigs.debug
}
}
packagingOptions {
doNotStrip '*/armeabi-v7a/*.so'
doNotStrip '*/arm64-v8a/*.so'
}
bundle {
language {
enableSplit = false
}
density {
enableSplit = false
}
abi {
enableSplit = true
}
}
flavorDimensions 'platform'
productFlavors {
rootProjects {
ext {
//compileSdk = 28
RATE_APPNAME = "\"AppName\""
RATE_UMENG = "\"123456\""
xiaomi = [
APPID = ["AppId": "123456"],
APPKEY = ["AppKey": "123456"],
APPID = "\"123456\"",
APPID_AD = "\"123456\""
]
huawei = [
APPID = ["appid": "123456"],
CPID = ["cpid": "123456"],
APPID = "\"123456\"",
CPID = "\"123456\"",
APPADID = "\"123456\""
]
}
}
xiaomi {
dimension 'platform'
applicationId "com.xiaomi.demo.mi"
buildConfigField "String", "FLAVOR_ADAPTER_CLASS_NAME", "\"com.myflavoradapter.MyFlavorAdapterXiaoMi\""
buildConfigField "String", "RATE_PACKAGE", "\"com.xiaomi.market\""
buildConfigField "String", "RATE_UMENG", rootProjects.ext.RATE_UMENG
buildConfigField "String", "RATE_APPNAME", rootProjects.ext.RATE_APPNAME
buildConfigField "String", "RATE_APPID", rootProjects.ext.xiaomi[2]
manifestPlaceholders = rootProjects.ext.xiaomi[0] + rootProjects.ext.xiaomi[1]
buildConfigField "String", "RATE_APPID_AD", rootProjects.ext.xiaomi[3]
versionCode 1
versionName '1.0.0'
}
huawei {
dimension 'platform'
applicationId "com.huawei.demo.huawei"
buildConfigField "String", "FLAVOR_ADAPTER_CLASS_NAME", "\"com.myflavoradapter.MyFlavorAdapterHuawei\""
buildConfigField "String", "RATE_PACKAGE", "\"com.huawei.appmarket\""
manifestPlaceholders = rootProjects.ext.huawei[0] + rootProjects.ext.huawei[1]
buildConfigField "String", "RATE_UMENG", rootProjects.ext.RATE_UMENG
buildConfigField "String", "RATE_APPNAME", rootProjects.ext.RATE_APPNAME
buildConfigField "String", "RATE_APPID", rootProjects.ext.huawei[2]
buildConfigField "String", "RATE_APPID_AD", rootProjects.ext.huawei[4]
versionCode 1
versionName '1.0.0'
}
// 设置outputFileName,使用各自productFlavor中的versionName和versionCode
android.applicationVariants.all { variant ->
variant.outputs.all { output ->
def flavor = variant.flavorName // 获取产品名称
outputFileName = "OutPutappName-${flavor}-${variant.versionName}-${variant.versionCode}-time${releaseTime()}.apk"
}
}
}
// defaultConfig {
// // 修改 文件的默认名称
// setProperty("archivesBaseName", "Miduzuma-${versionName}-${versionCode}-time${releaseTime()}")
// }
dependencies {
// implementation project(':unityLibrary')
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'org.apache.httpcomponents:httpcore:4.4.2'
implementation 'androidx.multidex:multidex:2.0.0'
implementation 'androidx.appcompat:appcompat:1.0.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation files('libs/android-async-http-1.4.8.jar')
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
//友盟SDK
implementation 'com.umeng.umsdk:common:latest.integration'// 必选
implementation 'com.umeng.umsdk:asms:latest.integration'// 必选
implementation 'com.umeng.umsdk:apm:latest.integration'// 错误分析升级为独立SDK,看crash数据
//-----------------------------------分割线-----------------------------------//
huaweiImplementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs/huawei')
// huaweiImplementation 'androidx.legacy:legacy-support-v4:1.0.0'
// huaweiImplementation 'androidx.appcompat:appcompat:1.0.0'
// huaweiImplementation 'com.huawei.hms:iap:6.10.0.300'
// huaweiImplementation 'com.huawei.hms:hwid:6.9.0.301'
// huaweiImplementation 'com.huawei.hms:game:6.8.0.300'
// huaweiImplementation 'com.huawei.hms:hianalytics:6.4.0.300'
// huaweiImplementation 'com.huawei.hms:ads-lite:13.4.61.300'
// huaweiImplementation 'com.huawei.hms:ads-omsdk:1.3.35'
// huaweiImplementation 'com.squareup.okio:okio:1.14.0'
// huaweiImplementation 'com.squareup.okhttp3:okhttp:3.11.0'
// huaweiImplementation 'com.huawei.hms:ads-lite:13.4.71.300'
// huaweiImplementation 'com.huawei.hms:ads-omsdk:1.3.35'
//-----------------------------------分割线-----------------------------------//
//-----------------------------------分割线-----------------------------------//
//xiaomi
xiaomiImplementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs/xiaomi')
xiaomiImplementation 'com.squareup.okhttp3:okhttp:3.11.0'
//-----------------------------------分割线-----------------------------------//
}
}
static def releaseTime() {
return new Date().format("yyyy_MM_dd_HH.mm", TimeZone.getTimeZone("GMT+8"))
}
改完不要忘了同步
同步完成 !
1).接下来要看src目录下 java文件的代码怎么实现 现在我用截图表示,后续直接上工程了
添加文件放在src java.com.目录下
2). 初始化flavorAdapter
3). 在各渠道创建对应的java文件
3). 在导出的工程中build 或者运行一下,然后把 assets下和jniLibs中的文件替换到想要出包的渠道下的assets和jniLibs 如果想添加别的渠道 直接照葫芦画勺子就行了, 所有渠道的结构都和main的结构一样的,只要不同渠道的需求都在各自渠道中去实现,所有参数已经在.gradle里配置完成,在java文件中直接用BuildConfig.(变量名) 就直接用了 我工程里都有示例的。
这里可以选择 渠道
然后 就可以出包了
自己搞个签名 或者单位提供 尽量用同一个,上面的图最后一个选项是选择渠道,到时候选择渠道出包即可,
总结: 此方法适合自己管控 更多自定义,不受第三方SDK束缚。不喜勿喷
下面为工程示例 链接
https://github.com/QIGUOXIN/PlatfromDemo.git