Android Studio工程多渠道发布apk

今天整理了一下如何使用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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值