android gradle多渠道打包和打包选定的so文件夹

一.简介

1.相信用过umeng的小伙伴都知道umeng上有个UMENG_CHANNEL这个是用来查看应用的渠道,在打包时我们可能要把apk发布到各个应用市场,为了统计各应用市场的下载情况,我们就要根据不同的应用市场打不同channel值的包,而每次都要修改channel值重新打包也是不太方便的,所以我们今天看看使用gradle多渠道打包。
2.还有就是我们使用第三方的jar时往往要导入第三方的so文件包括,arm64-v8a\armeabi\armeabi-v7a\mips\mips64\x86\x86_64,但是有时会出现一种情况就是有的第三方没有提供arm64-v8a的so有的提供了,这时我们libs目录下有arm64-v8a这个文件夹生成apk时就会包含这个文件夹,但没有相应so的第三方调用在相应的机型上就会出现错误。所以我们必须去掉arm64-v8a这个文件夹。

二实现

1.在androidMamifest中配置如下:

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

2.在gradle里的渠道:

productFlavors {
    LDAND001 {
        ndk {//这里控制apk要生成的so文件
            abiFilters "armeabi-v7a"
            abiFilters "armeabi"
            abiFilters "x86"
            abiFilters "x86_64"
        }
    }
    LDAND002 {
        ndk {
            abiFilters "armeabi-v7a"
            abiFilters "armeabi"
            abiFilters "x86"
            abiFilters "x86_64"
        }
    }
    LDAND003 {
        ndk {
            abiFilters "armeabi-v7a"
            abiFilters "armeabi"
            abiFilters "x86"
            abiFilters "x86_64"
        }
    }
    LDAND004 {
        ndk {
            abiFilters "armeabi-v7a"
            abiFilters "armeabi"
            abiFilters "x86"
            abiFilters "x86_64"
        }
    }
    LDAND005 {
        ndk {
            abiFilters "armeabi-v7a"
            abiFilters "armeabi"
            abiFilters "x86"
            abiFilters "x86_64"
        }
    }
    LDAND006 {
        ndk {
            abiFilters "armeabi-v7a"
            abiFilters "armeabi"
            abiFilters "x86"
            abiFilters "x86_64"
        }
    }
    LDAND008 {
        ndk {
            abiFilters "armeabi-v7a"
            abiFilters "armeabi"
            abiFilters "x86"
            abiFilters "x86_64"
        }
    }
    LDAND009 {
        ndk {
            abiFilters "armeabi-v7a"
            abiFilters "armeabi"
            abiFilters "x86"
            abiFilters "x86_64"
        }
    }
    LDAND0012 {
        ndk {
            abiFilters "armeabi-v7a"
            abiFilters "armeabi"
            abiFilters "x86"
            abiFilters "x86_64"
        }
    }
    LDAND0014 {
        ndk {
            abiFilters "armeabi-v7a"
            abiFilters "armeabi"
            abiFilters "x86"
            abiFilters "x86_64"
        }
    }
    LDAND0018 {
        ndk {
            abiFilters "armeabi-v7a"
            abiFilters "armeabi"
            abiFilters "x86"
            abiFilters "x86_64"
        }
    }
    LDAND0019 {
        ndk {
            abiFilters "armeabi-v7a"
            abiFilters "armeabi"
            abiFilters "x86"
            abiFilters "x86_64"
        }
    }
    LDAND0020 {
        ndk {
            abiFilters "armeabi-v7a"
            abiFilters "armeabi"
            abiFilters "x86"
            abiFilters "x86_64"
        }
    }
    BLKEE_VM {
        ndk {
            abiFilters "armeabi-v7a"
            abiFilters "armeabi"
            abiFilters "x86"
            abiFilters "x86_64"
        }
    }
    Blkee {
        ndk {
            abiFilters "armeabi-v7a"
            abiFilters "armeabi"
            abiFilters "x86"
            abiFilters "x86_64"
        }
    }
}

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

这样写完后打包时如下图:

android gradle多渠道打包和打包选定的so文件夹

由于打的包较多可能要等一会,我平时用的时候有时快有时慢,如果大家想测一下打的渠道对不对可以用一下方法测试一下:
try {
    PackageManager packageManager = getPackageManager();
    ApplicationInfo applicationInfo = packageManager.getApplicationInfo("应用的包名", PackageManager.GET_META_DATA);
    if (applicationInfo != null) {
        if (applicationInfo.metaData != null) {
            String channelName = applicationInfo.metaData.getString("meta-dataname");
            Toast.makeText(this,channelName,Toast.LENGTH_SHORT).show();
        }
    }
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}

关注订阅号:

android gradle多渠道打包和打包选定的so文件夹