美文网首页Android开发android学习
Android多环境配置打包

Android多环境配置打包

作者: 依风听雨锋 | 来源:发表于2018-05-29 16:46 被阅读27次

    需求

    打包多个app,App名称,应用图标,包名,启动页都不一样,如果打包一个,然后又替换一下资源,再打下一个,真的会疯了,一次还好,要是有啥bug需要改,又得重新来一遍。。。

    app名称-->resValue

    如下使用,需要注意的是,在string.xml中不能有相同的字段,否则会报错。 bool、color、dimen也可以使用同样的方法配置

    productFlavors {
            myapp1 {
                
                resValue "string", "app_name", "myapp1"
                resValue "bool", "isrRank", 'false'
            }
        }
    

    string:类型 app_name:字段名 myapp1:字段的值,最后生成R.string.app_name = "myapp1"

    应用图标-->manifestPlaceholders

    使用manifestPlaceholders配置添加,常用于AndroidManifest中 meta-data中数据配置,比如友盟,高德地图,百度地图的key
    build.gradle

     productFlavors {
            myapp1 {
                manifestPlaceholders = [
                        UMENG_APPKEY:"key值",
                        app_icon:"@drawable/ic_launcher_myapp1"
                ]
            }
    }
    

    AndroidManifest.xml

    <application
            android:allowBackup="true"
            android:icon="${app_icon}"
            android:label="@string/app_name"
            android:largeHeap="true"
            android:theme="@style/AppTheme">
     <meta-data
                android:name="UMENG_APPKEY"
                android:value="${UMENG_APPKEY}" />
    </application>
    

    包名-->applicationId

    使用这个,也可以方便的区分开测试和生产的包,可以使一台手机安装两个包(Android上安装APK,看是否是同一个app,就是看包名是否一致,不一致则认为是两个不同的app)

     productFlavors {
            myapp1 {
                applicationId 'com.myapp1'
            }
     } 
    

    启动页图片-->buildConfigField

    buildConfigField这个应该用得也挺多的,比如生产环境和开发环境,接口地址肯定是不一样的,这时候,就可以通过buildConfigField去配置接口地址,配置完成之后会在BuildConfig.java中生成对应的字段,比如下面的代码:

    productFlavors {
            myapp1 {
                buildConfigField 'String', "API_ENV", '"http://192.168.165.191:8081/api/"'
                buildConfigField "Integer", "SPLASH", "R.drawable.screen_myapp1"
            }
            prod {
                buildConfigField 'String', "API_ENV", '"http://xx.xx/api/"'
                buildConfigField "Integer", "SPLASH", "R.drawable.screen_prod"
            }
    

    对应的在BuildConfig.java文件中会生成:

    public static final String API_ENV = "http://192.168.165.191:8081/api/";
    public static final Integer SPLASH = R.drawable.screen_myapp1;
    

    使用的时候直接调用BuildConfig.API_ENV就可以获取到当前环境的地址。极大的简便了每次打包修改环境的麻烦(或许会觉得这样接口地址很容易被反编译的找到,但是接口地址,直接抓包也很容易拿到。。。)。同样的启动页也可以直接调用mIvSplash.setBackgroundResource(BuildConfig.SPLASH)设置

    通过以上方式,我们基本可以 通过 gradle 动态设定应用标题,应用图标,替换常量,设置不同包名,更改渠道等等。

    切换运行时环境

    在左下角打开Build Variant选项,选择需要的运行配置,每个环境都有debug和release选择


    切换运行时环境

    完整代码

    build.gradle

    android {
        flavorDimensions 'api'
        productFlavors {
            myapp1 {
                resValue "string", "app_name", "myapp1"
                buildConfigField 'String', "API_ENV", '"http://192.168.165.191:8081/api/"'
                buildConfigField "Integer", "SPLASH", "R.drawable.screen_myapp1"
                manifestPlaceholders = [
                        app_icon:"@drawable/ic_launcher_myapp1"
                ]
                applicationId 'com.myapp1'
            }
            myapp2 {
                resValue "string", "app_name", "myapp2"
                buildConfigField 'String', "API_ENV", '"http://xx.xx/api/"'
                buildConfigField "Integer", "SPLASH", "R.drawable.screen_myapp2"
                manifestPlaceholders = [
                        app_icon:"@drawable/ic_launcher_myapp2"
                ]
                applicationId 'com.myapp2'
            }
        }
    }
    

    AndroidManifest.xml

    <application
            android:allowBackup="true"
            android:icon="${app_icon}"
            android:label="@string/app_name"
            android:largeHeap="true"
            android:theme="@style/AppTheme">
    </application>
    

    参考

    Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)

    相关文章

      网友评论

        本文标题:Android多环境配置打包

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