随笔 - 127  文章 - 0  评论 - 313  阅读 - 213万

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包。

 

posted on   总李写代码  阅读(6225)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?

点击右上角即可分享
微信分享提示