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

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

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


android中的两种打包方式,及多渠道打包_第1张图片

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


android中的两种打包方式,及多渠道打包_第2张图片

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


android中的两种打包方式,及多渠道打包_第3张图片

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


android中的两种打包方式,及多渠道打包_第4张图片

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

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


android中的两种打包方式,及多渠道打包_第5张图片

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


android中的两种打包方式,及多渠道打包_第6张图片

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


android中的两种打包方式,及多渠道打包_第7张图片


android中的两种打包方式,及多渠道打包_第8张图片

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

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

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

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

友盟多渠道打包:

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

//友盟统计要用到的"UMENG_APPKEY"            android:value=" 58c79e572ae85b5073000edf" /> //多渠道打包配置        "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

更多相关文章

  1. android 解析服务器数据使用json还是xml方式
  2. android内存溢出处理方式之一
  3. android 加载图片的三种方式
  4. Android 使用HttpClient方式提交POST请求
  5. android post方式传递参数并获取返回数据代码
  6. android 数据存储总结及各种存储方式
  7. Android 获得屏幕宽高的三种方式
  8. 如何修改Android5.1系统USB连接方式默认MTP

随机推荐

  1. android 实现静默安装、卸载(图)
  2. 个人对android中项目命名规则的整理
  3. Android(安卓)Studio中Can't resolve sym
  4. android ListView 样式 item样式,条目样式
  5. Android(安卓)Android利用Fiddler进行网
  6. Android面经| 问题归纳
  7. 横竖屏切换时候activity的生命周期 andro
  8. CrystaX NDK - 更强大的Android(安卓)NDK
  9. eclipse android开发环境 bug CDT包含路
  10. Android---2---TextView、Button、EditTe