Android Studio 多渠道打包

本秂侑毒 提交于 2021-01-08 18:32:25

友盟的多渠道打包

在AndroidManifest中添加<meta-data 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.lanyu96.loadinglayout">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:ignore="ExtraText">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!--多渠道打包        -->
        <meta-data
            android:name="UMENG_CHANNEL"
            android:value="${UMENG_CHANNEL_VALUE}" />

    </application>

</manifest>

然后修改app级别的gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.lanyu96.loadinglayout"
        minSdkVersion 23
        targetSdkVersion 28
        versionCode 2
        versionName '2.3'
        //解决报错 All flavors must now belong to a named .....
        flavorDimensions "versionCode"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    //多渠道打包方式 1 (未优化前)
//    productFlavors{
//        wandoujia{
//            manifestPlaceholders = [UMENG_CHANNEL_VALUE:"wandoujia"]
//        }
//        xiaomi{
//            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
//        }
//    }

    //多渠道打包方式 2 (优化 , 当进行大量渠道打包时 , 减少代码量 )
//    productFlavors {
//        wandoujia {

//        }
//        xiaomi {

//        }
//        productFlavors.all {
//            flavor ->
//                flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
//        }
//    }

    //多渠道打包方式 3 (优化2 , 在生成的包后添加当前版本信息)
    productFlavors {
        wandoujia {

        }
        xiaomi {

        }
        huawei {

        }
        productFlavors.all {
            flavor ->
                flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
        }
        applicationVariants.all { variant ->
            variant.outputs.all { output ->
                def fileName
                if (outputFile != null && outputFile.name.endsWith('.apk')) {
                    fileName = outputFile.name.replace(".apk", "-${defaultConfig.versionName}.apk")
                    outputFileName = fileName
                }
            }
        }
    }

}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    //noinspection GradleCompatible
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

然后选择自己的证书, 打包就可以了 , app文件夹下就会有对应渠道的Apk包, 如果要增加渠道只需在上方的代码中添加 对应渠道名称即可

获取渠道信息 , 可以借助我封装的工具类  传送门

缺点 : 打包效率比较低下 , 如果是几十个包还可以应付 , 打一个包最快的话需要十几秒 , 慢的话需要几分钟不等 , 跟机器性能很有关系

但是是最安全稳定的 , 推荐使用此类方法

 

美团多渠道打包

 原理 : 把一个Android应用包当作zip文件包进行解压 , 然后发现在签名生成的目录下(META_INF)添加一个空文件不需要重新签名 . 利用这个机制 , 该文件下的文件名就是渠道名 . 这种方式不需要重新签名等步骤 , 非常高效.

缺点 : google如果哪天更改打包规则 , 使得在 META-INF中建立空文件还需要重新打包 , 这种方式将不可用

一些不法的渠道商很容易通过工具修改渠道 , 如果一个渠道商,通过网络劫持和篡改渠道的组和方式来获取暴利 , 对于程序开发者来说可能会存在着巨大的经济损失

操作, 通过python脚本  具体 可以参考GitHub上的介绍 传送门

 

360多渠道打包

原理 : apk文件本质就是zip文件 , 利用zip文件 "可以添加comment(摘要) " 的数据结构特点 , 在文件的末尾写入任意数据 , 而不用重新解压zip文件,我们就可以将渠道信息写入到摘要区

优点是 : 5M的apk , 一秒能打包300个 , 在下载apk的同时 , 服务端可以写入一些信息 , 例如邀请码 , 分享信息等 

缺点 : 渠道信息也很容易修改 , 虽然可以加密 , 只是提高了修改的门槛 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!