美文网首页Android开发经验谈Android开发Android开发
Android 多渠道打包(同一个工程不同包名,不同服务器地址等

Android 多渠道打包(同一个工程不同包名,不同服务器地址等

作者: Kandy_JS | 来源:发表于2018-06-14 15:54 被阅读289次

    一、参考

    1、多渠道打包——同一台设备上同时安装你的正式与测试环境APP
    2、Android多渠道打包没你想的那么复杂
    3、多渠道打包之动态修改App名称,图标,applicationId,版本号,添加资源

    二、应用场景

    1、一个APP针对多个应用市场,需要在不同应用市场看日活啊等等的
    2、同一个工程代码,但是需要用到不同的省市区、挂在不同的服务器下面,等于多个有一样功能但又互相独立的APP,可以多个同时安装在手机上面
    3、其他

    三、效果图

    icon2.png myapp.png yourapp.png

    四、实例:以应用场景2作为案例

    1、app/build.gradle 文件的修改,增加:productFlavors

    1.1、defaultConfig注释掉原本的applicationId,不然会和多渠道内的包名有冲突
    1.2、versionCode和versionName也可以配置进productFlavors中去,不多说
    1.3、buildTypes暂时就用默认的
    1.4、productFlavors下一般有这几部分组成

    定义 内容
    applicationId 某个取到的应用包名
    resValue 针对资源文件,包含string.xml等,注意两点,(1)keyname一定要有且一致 (2)原本main目录下的keyname注释掉,分别增加多渠道通道的资源文件库,后面会截图显示
    buildConfigField 自动建立BuildConfig文件中的动态常量,注意String值的话是‘ “ xxx ” ’这样的格式
    manifestPlaceholders 清单文件里可动态替换的内容,这里一般由打包的apk名字,还有fileprovider等等,还有各种第三方key,比如友盟,极光推送等等

    1.5、学习几个英语单词,加深理解

    英文 中文
    Variants 变体 - 所以应该叫‘多变体打包’--好难听
    Flavors 特点 - 变体的特点/渠道的特点--就是需要替换的动态常量
    Channel 渠道 - 这个才是渠道吗~~AS里完全没有,但是好听呀
    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 26
        buildToolsVersion "26.0.2"
        defaultConfig {
            //因为多渠道已经有包名了,此处注释掉
            //applicationId "com.flavor.test.flavortestapp"
            minSdkVersion 14
            targetSdkVersion 26
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
    
        //默认的,会有release和隐藏的debug
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    
        /**
         * 多渠道打包
         * 1、applicationId      = 软件-包名
         * 2、app_name           = 资源文件string.xml下的,需要建立不同的res目录
         * 3、BASE_SERVER_URL    = 基础服务器地址,在自动创建BuildConfig下
         * 4、APP_File_Provider  = 文件provider,一般是包名+fileprovider命名
         * 5、其他所需要配置的百度Key,极光推送key,友盟key等等...
         * */
        productFlavors {
    
    
            //我的APP
            my_app{
                applicationId "com.flavor.myapp"
                resValue "string", "app_name", "APP-我的"
                buildConfigField "String"   , "APP_File_Provider"      , '"com.flavor.myapp.fileprovider"'
                buildConfigField "String"   , "BASE_SERVER_URL"        , '"http://my/app/"'
                //manifest里面的值
                manifestPlaceholders = [
                        MTA_CHANNEL_VALUE   : "my_app",
                        FILE_PROVIDER       : "com.flavor.myapp.fileprovider" ]
            }
    
    
            //你的APP
            your_app{
                applicationId "com.flavor.yourapp"
                resValue "string", "app_name", "APP-你的"
                buildConfigField "String"   , "APP_File_Provider"      , '"com.flavor.yourapp.fileprovider"'
                buildConfigField "String"   , "BASE_SERVER_URL"        , '"http://your/app/"'
                //manifest里面的值
                manifestPlaceholders = [
                        MTA_CHANNEL_VALUE   : "your_app",
                        FILE_PROVIDER       : "com.flavor.yourapp.fileprovider" ]
            }
    
    
        }
    
        /**
         * 打包导出apk时候的名字,或者各种服务的key配置等等
         * */
        applicationVariants.all { variant ->
            variant.outputs.each { output ->
                def outputFile = output.outputFile
    
                //如果打包release版本,则包名为  xx取到.apk
                if (variant.buildType.name.equals('release')) {
                    def fileName = "Channel${defaultConfig.versionName}_${variant.productFlavors[0].name}"+releaseTime()+".apk"
                    output.outputFile = new File(outputFile.parent, fileName)
                }
            }
        }
    
    
    }
    
    //打包时间
    def releaseTime() {
        return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
            exclude group: 'com.android.support', module: 'support-annotations'
        })
        compile 'com.android.support:appcompat-v7:26.+'
        compile 'com.android.support.constraint:constraint-layout:1.0.2'
        testCompile 'junit:junit:4.12'
    }
    
    

    2、需要修改的工程目录和调试

    这里my_app和your_app目录下的mipmap和values分别就改了唯一需要动态改变的图片和值,比如string.xml下的app_name,原本main下values中string.xml的app_name注释掉


    aa.png
    <resources>
        <string name="app_name">APP-你的</string>
    </resources>
    

    3、清单文件

    manifest.png

    相关文章

      网友评论

      • YiiY34:请问楼主,为什么我同样设定义常量 编译的时候他就提示起冲突了
        BuildType(release): buildConfigField 'API_BASE_URL' value is being replaced
      • 4d7207d7c043:l楼主能加下qq:2818473718,请教下你关于多渠道打包的问题,谢谢
      • JarryLeo:请问楼主,我用你的打包导出修改 apk名称的代码 outputFile 提示是只读,怎么回事?AS3.0.1
        JarryLeo:@liu灰1314 嗯,可以了。谢啦
        Kandy_JS:我这边打包没问题诶,applicationVariants 这个在android{}内,releasetime()方法在最外层,是不是这个问题?
        liu灰1314:试试这种写法
        applicationVariants.all { variant ->
        variant.outputs.all {
        outputFileName = "Apk_${variant.flavorName}_v${variant.versionName}_${buildTime()}.apk"
        }
        }

      本文标题:Android 多渠道打包(同一个工程不同包名,不同服务器地址等

      本文链接:https://www.haomeiwen.com/subject/uvdyeftx.html