Android Studio打包全攻略

1)手动打包html

项目写完了,如今须要把应用上传到市场,问题出现—怎么把代码变成.apk(Android的可安装文件)。

1. 建立签名文件
这里写图片描述 java

2. 填写好签名参数

这里写图片描述android

 

3. 生成APK
注意:签名的密码和密匙的密码注意保管,不要忘了,签名文件别泄漏了,也别搞丢了git

为何要打包

我最开始就有这个疑问,咱们的代码不是点了下运行按钮就直接安装到手机上了吗,咱们在在项目Project目录的build/outputs/apk目录下能够找到刚刚新鲜生成的app-debug.apk.直接把这个上传给市场不就好了吗。

这里写图片描述程序员

 

NO,固然不行,想一想手机安装App的时候怎么来区分各个APK的。
经过包名+签名 来肯定一个应用的惟一性,那个 debug.apk 只是系统用来给咱们调试用的,若是上传到市场,怎么来保证他的安全性。github

 

OK,咱们已经解决了第一步—怎么打包。上传上去后,市场反馈发现咱们的App写得太棒了,这时候老大让赶快多上些平台,主流的平台、非主流的平台都要放上去。
那么问题来了,为了方便统计各个平台的安装状况,配合运营推广,须要统计各个平台的安装状况。 web

分渠道打包

不错,咱们须要用到分渠道打包,那么咱们须要解决两个问题
1. 怎么区分各个平台的标识
2. 怎么每次版本更新都生成几十个包、几百个包
第一个简单,用过友盟打包的同窗确定不陌生这段代码安全

<meta-data android:name="UMENG_CHANNEL" android:value="Channel_ID"></meta-data>

value里面填的就是各个平台的值,好比填写uc、yyb(应用宝)、360、baidu替换掉Channel_ID,App安装好,能够读取这个值而后传给后台,从而实现区分各个平台的安装需求。
第二个问题:
在Eclipse时代,最开始我是手动打的,一次打30个包,每次最怕版本更新,基本一下午都在作机械运动,如今想起来手都在抽筋。
后来,学会了Ant自动打包,快却是快,只是配置太坑爹了,超级麻烦。
如今有了Android Studio,妈妈不再用担忧我不能愉快的打包了。
随便新建一个项目,修改Module:app build.gradleapp

apply plugin: 'com.android.application'
android {
    signingConfigs {
        config {
            keyAlias 'maker'
            keyPassword '1234make'
            storeFile file('/Users/Nevermore/AndroidStudioProjects/Blog/jks/makeapp.jks')
            storePassword 'make1234'
        }
    }
    compileSdkVersion 23
    buildToolsVersion "23.0.3"
    defaultConfig {
        applicationId "com.example.makeapp"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        debug {
            minifyEnabled false
            debuggable true
        }
 
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.config
            debuggable false
        }
    }
    //渠道配置
    productFlavors {
        uc {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "uc"]
        }
        _360 {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "360"]
        }
        baidu {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
        }
        yyb {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "yyb"]
        }
    }
}
 
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.3.0'
}

 

咱们须要配置:工具

signingConfigs这是刚才咱们新建的密匙信息 buildTypes 打包类型,包括了Debug和Release productFlavors打包渠道就在这儿配置咯 同时在AndroidManifest里面加上,渠道标识(注意红色背影的字符串必定要对得上)

<manifest package="example.com.makeapk" xmlns:android="http://schemas.android.com/apk/res/android">
  <application>
     <meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_VALUE}"> ...省略 </meta-data>
   </application>
</manifest>

 

如今还有个问题—代码写完了怎么生成渠道包呢

OK,在命令行输入 gradlew assembleRelease,表示生成全部Release包,生成的包在build\outputs\apk目录下,若是你要生成指定的包(uc|360|baidu),指定的版本(Release|Debug),右边的Gradle Project能够帮到你
这里写图片描述

 


4. 删除多余的 unaligned.apk
执行完-gradlew assembleRelease,发现一个问题,生成的不只有咱们须要的包,unaligned.apk类型的Apk也输出来了

这里写图片描述

unaligned.apk 是还没执行对齐命令的包,是中间形态,这个须要删除,不必不知道为何Gradle没有帮咱们删了这没啥用的玩意儿,问题是咱们也不想一个一个的手动删除。好吧,写了一个脚本命令,在输出文件夹的命令行执行以下:

find . -name "*-unaligned.apk" | xargs rm -rf

优化gradle代码
刚才写的代码

productFlavors {
        uc {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "uc"]
        }
        _360 {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "360"]
        }
        baidu {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
        }
        yyb {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "yyb"]
        }
}


有些冗余,修改下减小咱们的代码量

productFlavors {
        uc {}
        _360 {}
        baidu {}
        yyb {}
    }
    productFlavors.all { flavor ->
        flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
 }

是否是美观多了

6. Gradle对新人来讲语法有学习曲线,能不能再容易一点

我们有工具啊,打开顶部Build
这里写图片描述

选择红色部分,里面的编辑框能够帮助咱们更快的熟悉Gradle

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

来看看代码和编辑框的具体关系吧

这里写图片描述

7. 打包太多,须要清理一下

这里写图片描述


炉火纯青 快速打包 - 直接修改渠道号

想一想,若是只是打渠道包的话,没有必要对整个项目进行编译,来生成渠道号。
若是能直接修改apk的渠道号,而不须要再从新签名能节省很多打包的时间。幸运的是咱们找到了这种方法。直接解压apk,解压后的根目录会有一个META-INF目录。
若是在META-INF目录内添加空文件,能够不用从新签名应用。所以,经过为不一样渠道的应用添加不一样的空文件,能够惟一标识一个渠道。
采用这种方式,每打一个渠道包只需复制一个apk,在META-INF中添加一个使用渠道号命名的空文件便可。
这种打包方式速度很是快,900多个渠道不到一分钟就能打完。
没错,这就是美团的打包策略

使用方式:https://github.com/GavinCT/AndroidMultiChannelBuildTool
使用本工具,Android 程序员仅需将 ChannelUtil.java 放入到工程里使用,之后打包的事情就不用本身动手了。
安装个 Python 环境,运行一下 MultiChannelBuildTool.py,谁均可以打包了!
毕竟实践是检验真理的惟一标准:
拷贝一个,咱们刚刚生成的app-uc-release.apk到项目目录

  

这里写图片描述

果真厉害,1S就出来这么多包。

反编译看看,包打得对不对
命令行 

  apktool d xxx.apk

这里写图片描述


打开目录,首先确认咱们生成的XML里面的标识符
这里写图片描述


而后看到,美团极速打包方案也完成

这里写图片描述


可是,使用Gradle生成4个渠道,咱们花了 26.5秒 人家 只花了目测 1s

源文地址

相关文章
相关标签/搜索