生成jks签名
1.选择Build > Generate Signed APK
2.选择项目app > Next
如果以前没有生成过 .jks密钥 文件,选择Create new,否则选择Choose existing
3.我们选择Create new新创建一个 .jks密钥 文件
4.选择签名文件的路径,把这些信息填完点击OK
5.选择Next继续完成下一步
Build Type 选择 release,由于我们还没有为项目添加任何第三方的打包渠道,所以此时No Flavors可以选择。
6.选择Finish,签名生成
注意:在第3步,我们选择了Create new去生成一个新的 .jks 密钥文件,之后我们在对项目进行打包签名时则可以直接选择Choose existing即可。
选择已经存在的.jks密钥文件,点击OK即可,后面步骤如前所描述。
多渠道打包
国内Android App市场很多,每次发版几十个渠道包。Android Gradle给我们提供了productFlavors,让我们可以很方便地对生成的APK包进行定制。
1.在AndroidManifest.xml文件中添加渠道表示标签
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".WebViewActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- UMeng 配置-->
<meta-data android:value="${UMENG_CHANNEL_VALUE}" android:name="UMENG_CHANNEL"/>
</application>
2.在build.gradle(Module: app)文件中添加多渠道
apply plugin: 'com.android.application'
android {
compileSdkVersion 24
buildToolsVersion "24.0.2"
defaultConfig {
applicationId "com.zqp2sh.webviewwraph5"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
// 添加多渠道
productFlavors {
xiaomi {}
qihu360 {}
baidu {}
wandoujia {}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:24.2.1'
testCompile 'junit:junit:4.12'
compile 'com.android.support:design:24.2.1'
}
添加完之后我们在点击一下Gradle 的构建按钮重新构建一下
回顾
此时我们在进行.jks密钥文件生成时,就会发现此时的Flavors会出现4个渠道选项,我们可以任意选择,如下:
选中之后,点击Finish即可进行签名打包,生成响应的apk:
3.测试
通过Java代码获取到meta标签中的value来测试是否成功实现了多渠道打包:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
// WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_webview);
getWindow().setBackgroundDrawableResource(android.R.color.transparent);
init();
initWebView();
String umeng_channel = getApplicationMetaValue("UMENG_CHANNEL");
Log.d("Science", umeng_channel);
}
/**
* 测试多渠道打包
*/
private String getApplicationMetaValue(String name) {
String value= "";
try {
ApplicationInfo appInfo =getPackageManager()
.getApplicationInfo(getPackageName(),
PackageManager.GET_META_DATA);
value = appInfo.metaData.getString(name);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return value;
}
测试代码添加完毕之后,我们现在点击AS左下角的Gradle,我们此时就可以看到我们刚才添加的xiaomi、qihu360、baidu、wandoujia都出现了,如下图:
此时我们双击[installBaiduDebug], apk成功的安装到你的手机上了,手机不会自动给你打开app,需要手动打开,然后就可以在控制台看到日志如下:
10-29 22:55:04.154 12335-12335/com.zqp2sh.webviewwraph5 D/Science: baidu
进入图示目录可以看到生成的响应apk,此时还没有签名:
注意:保持有手机与AS相连接
然后我们在双击[installXiaomiDebug],然后看看
''10-29 22:55:04.154 12335-12335/com.zqp2sh.webviewwraph5 D/Science: xiaomi
进入图示目录可以看到生成的响应apk,此时还没有签名:
其他的渠道也是一样的操作方式,不在一一说明。
小结: 这里我们在AndroidManifest.xml文件中添加了meta标签、在build.gradle(Module: app)中添加了渠道产品对应的渠道名称 ,最后我们测试多渠道打包,这里还最重要的一点就是: 没有让大家去运行什么命令,全部是让大家点击来实现的,其实点击就是在运行命令:
./gradew installXiaomiDebug
一键完成打包(全部产品)并签名
正如标题所示,我们如果要打包所有的产品,肯定不能像刚才一样一个一个来打,那么现在来使用另外一个按钮(命令)assemble,如下:
然后切换项目到Project视图,找到app>build>outputs>apk,结果如下我们看到所有版本的apk都有了,有debug版的,debug没有签名的,release没有签名的。
如果我们现在只想打包所有的release版本怎么办呢?看下面的图,如果想打release版就双击(assembleRelease),如果想打所有的debug版本就双击(assembleDebug)
现在我们就可以通过不同的按钮打包不同类型的apk了。
常用的打包命令
./gradlew assembleDebug 编译并打Debug包
./gradlew assembleRelease 编译并打Release的包
./gradlew installRelease Release模式打包并安装
./gradlew uninstallRelease 卸载Release模式包
.....
问题: 所有的apk生成了,但是没有签名是发布不了的,怎么办?
1.点击项目架构按钮,如下,或使快捷键:Command + ;
2.然后点击app>Signing > + ,然后填写上签名信息,最后点击OK
我们做的上述操作其实就是在build.gradle(Module: app)文件中添加如下信息:
此时我们把apk下面的apk文件删掉,然后双击assembleRelease,结果发现还是没有签名,你在逗我?
注意: 我们目前为止只是配置了签名信息,但是并没有给产品(apk)指定,我们只需要在build.gradle(Module: app)文件中添加如下的代码就 ok了,我们来试试看。
//指定签名为release
signingConfig signingConfigs.release
现在删掉apk文件夹下所有的apk,然后选择assembleRelease, 然后点击run按钮,如下图,这里的run会记录我们最近使用的run脚本名称.
现在我们来看看apk目录下的安装包是否签名:
补充
安装apk的命令(包名一样版本号一样,所以只能存在一个,在进行多个渠道apk安装测试时,一台手机上只能安装一个)
adb install apk路径/app-渠道名-release.apk
总结
我们在第一部分生成了.jks密钥文件,以便于后续部分的使用,然后进行多渠道打包:在manifast文件中添加了meta渠道标签,然后修改了gradle的文件添加了不同的渠道产品,最后我们在代码中读取了meta标签的value并且在进行了日志打印。最后我们又添加了签名配置,指定了给release版本的签名,签名的名称是release,并最终搞定了一键多渠道打包签名。
参考资料
http://blog.csdn.net/yy1300326388/article/details/48344411
http://blog.csdn.net/yy1300326388/article/details/48296221
http://wuxiaolong.me/2016/04/01/gradle4android3/
http://www.rocidea.com/roc-23118.aspx
http://mouxuejie.com/blog/2016-08-06/build-and-multichannel-package-practice/
http://www.jianshu.com/p/bb681879a291
http://blog.qiji.tech/archives/1050