android中的两种打包方式,及多渠道打包

签名时什么:
android应用文件(apk)中保存的一个特别字符串
签名的作用:
用来标识不同的应用开发者的身份,比如开发者A,开发者B,如果一个开发者开发多款应用最好使用同一个签名。

为什么要签名:
1.系统要求的,Android系统要求每一个Android应用程序都必须经过数字签名才能安装到系统中,也就是说,如果一个Android应用程序没有经过数字签名是不能安装到系统中的(平时连接手机直接安装手机上的apk,打包的时候取得是系默认的签名文件,也是已经签名了的)。
2.不同程序员开发的应用程序包名可能会相同,这就导致一个应用覆盖另一个应用。如果只有包名概念,那么如果B应用与A应用包名一样,那就实现了B覆盖了A,这样显然是不对的。但事实上我们安装的应用,经管包名一样,但也不会覆盖,就是因为签名不一样,只要签名不一样,就不会被覆盖.(包名一样,签名不一样,在同一台手机上安装,就会有提示,需要卸载再安装。)

常规打包方方式:
第一种:选择菜单栏里的build,打开后选择Generate Signed Apk就会看到这样的一个界面:


这里写图片描述

当然第一次进入这个界面,Key store path是空的,这个时候选择create new一个新的就可以了,进入这个界面:


这里写图片描述

在这里填写一下,最上面选个保存路径,不要乱填,后面打包时候会用到,以后直接拿来用就可以了,不至于每次都重新new一个。完了点击ok就可以了。完了返回上个界面,点击next,进入下面这个页面:


这里写图片描述

看最上面APK Destination Folder这个路径是打包生成apk的路径,一般都会选app\build\outputs\apk,第一次可能没有apk这个目录,在工程目录中的build下的目录生成一个apk文件夹就可以了。我们打包后的apk就在这里了。点击Finish,之后就完成打包了,可以在对应目录中看到这样:


这里写图片描述

这里是选择了打好几个包,你这里如果选release,则打出的是release.apk,如果刚刚build Type里选择的是debug,则打出的是debug.apk 这里就结束了。

第二种,用命令方式打包:
打开Project Structrue,或者点击鼠标右键打开open moudle setting也能进入下面这个界面:


这里写图片描述

第一次进来,是没有release的,这个是我加的,显示的是config,选中,改为release或者debug,可以同时添加这两种,右侧,把对应刚刚签名填的对应信息输入,点击ok就可以了。完了后,我们再次打开,这次选中BuildTypes,在Signing Config这里选release,如果是debug就选debug好了。这时候app下的build.gradle里会显示这样的配置:


这里写图片描述

这里我选了一个release,如果你选择两种的话,debug也会相应的显示出来。结束配置,开始敲命令了:


这里写图片描述


这里写图片描述

从下面这张图,通过BUILD SUCCESSFUL可以看出我们打包成功了,这里打了6个apk包,用时1分过点。

最后我们看看多渠道打包(利用友盟实现多渠道打包):

渠道的概念:
就是channel,例如百度,小米,360,安卓市场等等,每一个都是一个渠道,而每一个对应这个渠道的apk文件叫渠道包。

经常听到某某某说要打几百个渠道包,为什么要提供如此多的渠道包?
应用在请求网络时携带渠道信息,方便后台统计,因此我们在安装包里添加不同的标识,去区别。

友盟多渠道打包:

其实我们刚刚实现的就是,只是要加入相应的配置,才能完成,看清单文件….
在Manifest.xml下加这样两个配置:

//友盟统计要用到的
<meta-data
            android:name="UMENG_APPKEY"
            android:value=" 58c79e572ae85b5073000edf" />

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

下面那个value的这串“${UMENG_CHANNEL_VALUE}”一定要在build.gradle下指定一个值,不然Mainfest.xml这个就编译不过去,为了这点纠结了好一会,加入这样一行代码,在defaultConfig下:

 // 默认是umeng的渠道
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "umeng"]

在build.gradle的根目录android下,加入这样的配置:

  // 友盟多渠道打包
    productFlavors {
        wandoujia {}
        _360 {}
        baidu {}
        xiaomi {}
        tencent {}
        taobao {}
        ........
    }

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

最后是整个build.gradle代码,看看就明白了:

apply plugin: 'com.android.application'

android {

    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "user.example.com.um_statistics"
        minSdkVersion 17
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        // 默认是umeng的渠道
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "umeng"]
    }

    signingConfigs {
        release {
            keyAlias 'amelon'
            keyPassword 'password'
            storeFile file('C:/Users/user/Desktop/amelon.jks')
            storePassword 'password'
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            renderscriptDebuggable false
        }
    }

    // 友盟多渠道打包
    productFlavors {
        wandoujia {}
        _360 {}
        baidu {}
        xiaomi {}
        tencent {}
        taobao {}
    }

    productFlavors.all { flavor ->
        flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }
   //给apk添加对应的版本号:
   applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith('.apk')) {
                def fileName = outputFile.name.replace(".apk", "-${defaultConfig.versionName}.apk")
                output.outputFile = new File(outputFile.parent, fileName)
            }
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.umeng.analytics:analytics:latest.integration'
    compile 'com.android.support:appcompat-v7:25.1.0'
    testCompile 'junit:junit:4.12'
}

配置好后,用上面两种常规打包方法,就会把productFlavors下的所有渠道包都打完。

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

优点:打包速度非常快,几百个包一分钟就能打完。
**缺点:**google如果变换了打包规则,当在META-INF时添加文件需要重新打包时,这种方式就不适合了。还有就是不安全,可以通过工具被修改渠道包。

具体用法参考:美团打包原理及用法

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

优点: 打包速度快,相对于美图打包来说,提高了修改渠道名的门槛,对应有加密方式,渠道名不容易被修改。
缺点:仍然存在不安全风险,会被修改渠道包。

结论:更多的还是都在用友盟的多渠道打包,会慢,但更安全

好了就到这里了。有问题拍砖,多多指教,代码就不上传了,貌似真没那个必要……忽然想到一句叫余生请多多指教,嗯嗯,相互指教吧,闻道有先后,术业有专攻,如是而已…..

转载请标明:http://blog.csdn.net/zxyudia/article/details/62216014

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值