• Android学习探索之App多渠道打包及动态添加修改资源属性


    前言:

         关于Android渠道打包是一个比较老的话题,今天主要记录总结一下多渠道打包以及如果动态配置修改一些资源属性。今天以公司实际需求为例进行演示,由于项目复用很多公共的业务组件,而且业务组件之间的跳转采用Scheme协议,每个业务组件的host地址不变,所以需要在打包的时候动态修改scheme协议名字。为了方便举例,首先我们这里假设我们一个App要打出两个不同的渠道,方便进行数据统计。

    第一步声明一个渠道参数 AndroidManifest.xml中

    <meta-data
     android:name="APP_CHANNEL"
     android:value="external" />

    为了方便通过gradle自动替换,value需要替换成标记位的方式

     <meta-data
      android:name="APP_CHANNEL"
      android:value="${APP_CHANNEL}" />

    第二步在gradle中利用productFlavors声明渠道类型,

      比如我们这里声明一个外部版本一个内部版本,manifestPlaceholders 替换AndroidManifest中的${APP_CHANNEL}值

        productFlavors {
            external {
                manifestPlaceholders = [APP_CHANNEL: "external"]
            }
            internal {
                manifestPlaceholders = [APP_CHANNEL: "internal"]
            }
        }

    上面的也可以修改成批量处理方式

        productFlavors {
            external {}
            internal {}
            productFlavors.all { flavor ->
                flavor.manifestPlaceholders = [APP_CHANNEL: name]
            }
        }

    第三步重新build项目会生成build选项,如下图所示:

    打包的话可以通过在android studio底栏中有个命令行工具Terminal,例如打包所有渠道可以执行下面的命令

    gradlew assembleRelease

    如果要打指定渠道的话,可以执行下面的命令,例如要打external外部版本

    gradle assembleExternalRelease

    也可以通过gradle projects里面生成的命令选项进行打包,生成的选项如图所示:

    第四步修改生成渠道包文件名

    buildTypes {
            release {
                //混淆
                minifyEnabled false
                //是否压缩对齐
                zipAlignEnabled true
                //清除不用的资源
                shrinkResources false
                //混淆脚本路径
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
                signingConfig signingConfigs.releaseConfig
                //自定义apk名字
                applicationVariants.all { variant ->
                    variant.outputs.each { output ->
                        output.outputFile = new File(
                                output.outputFile.parent,
                                "${applicationId}-${variant.productFlavors[0].name}-${versionName}-${releaseTime()}.apk".toLowerCase())
                    }
                }
            }
            debug {
                //debug时候也采用正式签名文件
                signingConfig signingConfigs.releaseConfig
            }
        }
    }

    第五步定制app scheme地址

     根据上面的渠道替换原理,只需添加一个scheme标记即可

    <activity
                android:name=".GoodsDetailActivity"
                android:theme="@style/AppTheme">
                <!--要想在别的App上能成功调起App,必须添加intent过滤器-->
                <intent-filter>
                    <!--协议部分,随便设置-->
                    <data
                        android:host="goods"
                        android:path="/goodsDetail"
                        android:port="8888"
                        android:scheme="${myScheme}"/>
                    <!--下面这几行也必须得设置-->
                    <category android:name="android.intent.category.DEFAULT"/>
                    <action android:name="android.intent.action.VIEW"/>
                    <category android:name="android.intent.category.BROWSABLE"/>
                </intent-filter>
            </activity>

    在gradle中添加替换

      manifestPlaceholders = [
                    myScheme: "XApp",
            ]

    替换指定属性,比如颜色值,使用如下代码

      resValue  "color", "app_theme_color", "#283146"

    总结:

        根据多渠道打包的原理来实现定制特定需要的app包。

  • 相关阅读:
    iOS开发allocWithZone介绍
    如何快速的查看一段代码的执行时间
    iOS关于setContentOffset的一些细节问题
    iOS开发libz.dylib介绍
    C#窗体无法接受Keydown事件
    visual studio 2010 C#编程时 没有.NET framework 2.0目标框架的解决办法
    StringBuilder类与String类的区别
    Refresh和Invalidate的比较
    正则表达式
    Queue 先进先出队列的操作
  • 原文地址:https://www.cnblogs.com/whoislcj/p/6927036.html
Copyright © 2020-2023  润新知