[TOC]
写在前面
本文针对AppCan平台开发应用时,经常遇到的Android证书问题做一个解释,但大多数概念是跟原生开发通用的~
什么是Android打包证书?
Android打包证书,即Android开发者证书,与iOS打包证书作用相同,其意义在于可以使用其签名后的App,可以唯一确定开发者身份;用证书签名后的app,其中包含了证书信息,而证书一般来说不可伪造。
“无证书,不应用”
-
Android开发者证书,与iOS开发者证书一样重要,应用开发中一定要重视起来,做到“无证书,不应用”。
-
因证书是自行生成,证书申请后要妥善保管,一旦丢失则无法找回。
Android证书形式
一般为扩展名为keystore的文件,新版工具(AndroidStudio)生成的证书扩展名可能为jks,但实质相同。
生成方法
在线工具制作
方法1
进入AppCan大众版官网 ,登录后进入大众版打包界面(开发界面) --- 证书管理 --- Android证书,此标签中包含了填写证书信息的页面,同时有一个创建证书的入口,可以通过这里填写相关信息,制作证书;制作完成之后,有个下载证书的链接,下载后自行保存好即可使用。
方法2
进入协同开发,证书管理中也有创建证书,使用方法同方法1,但是可能目前暂时没有提供下载功能(可以去提需求~)。
方法3
使用3.2以上版本的DSS打包服务(Mac mini,界面默认是绿色的那个版本),证书管理中也存在创建证书功能,使用方法同方法1,但同样暂时没有下载功能。
本地制作
(需要电脑中安装了JDK)进入JDK的bin目录:
运行如下命令:
keytool -genkey -keyalg RSA -validity 20000 -alias appcan -keystore appcan.keystore
其中下面参数可以自行定义:
-validity 20000
代表有效期天数
-alias appcan
代表证书别名为appcan
-keystore appcan.keystore
代表生成的keystore证书文件目标路径
执行之后,命令会要求输入一系列证书相关的开发者信息,这些信息可以按照具体情况自行输入(包括公司名称、所在位置等,这些信息仅用于保存在证书内,打包时目前不会作什么校验,所以也没有什么格式,尽量英文填写即可)

命令完成后,bin目录中会生成appcan.keystore
查看证书详情命令
keytool -list -keystore "appcan.keystore"
然后按照提示输入你设置的keystore密码即可。
AppCan测试证书(打包服务默认证书)相关答疑
使用打包服务默认证书有什么隐患?
-
由于证书代表了一个开发者,如果大家都使用同样的证书,很容易产生安全问题,比如:你开发了一个App,使用了AppCan默认证书,另一个盗版App就有了模拟你的App的可能性,因为他同样可以使用AppCan默认证书打包,自定义包名改为跟你的应用相同(包名为Android应用唯一标识,且为公开的),这样盗版App甚至可以覆盖你的应用进行安装;如果使用自定义证书打包,则只要保证证书不被泄露,就可以防止出现这种形式的盗版(相同包名不同证书的apk无法覆盖安装);
-
360手机市场去年就已经禁止了使用AppCan默认证书打包的App了(具体表现就是,无法在360手机市场上架);
-
微信分享时,如果使用AppCan测试证书注册了微信开放平台的App,则会出现禁止分享的提示(具体表现可以参见官网文档中心的Android微信接入指南);
为何不直接更换打包服务器的默认证书来解决360和微信问题?
因为的确有不少的开发者仍然使用了AppCan默认证书,如果直接更改AppCan默认证书,则会导致现有应用再次打包后,出现无法覆盖安装旧版本的问题,造成现存的部分App的一些麻烦;为了防止给现有应用带来影响,默认测试证书不做更换(不过微信分享近期突然无法使用的问题,我们就无能为力了);
应用上线了,突然意识到用了测试证书,想要更换证书怎么办?
前面已经说过,更换证书打包会导致无法覆盖安装的问题(根据不同手机系统,会有“应用未安装”、“安装失败”、“证书冲突”等提示)。
所以,如果必须要更换证书,这里给出两个思路(仅供参考)
1、在应用内通过增量升级或者其他内容的方式,引导和告知用户,卸载重新安装新证书的版本。
-
比如,您可以通过增量升级的补丁包方式,更新应用的启动时逻辑,增加一个检查当前版本功能,通过uexWidgetOne.getCurrentWidgetInfo();获取当前应用版本号,从而判断对应的逻辑,比如去请求一个mas接口,获取更新地址,然后使用uexWidget.startApp();接口使用浏览器启动一个写好的页面,页面中可以用来说明如何卸载应用,以及新版本下载链接,并告知用户为何要这样做等等。
-
获取应用版本号:
uexWidgetOne.getCurrentWidgetInfo();
接口使用详见说明文档:
[获取当前widget信息](http://newdocx.appcan.cn/newdocx/docx?type=1252_1249#getCurrentWidgetInfo 获取当前widget信息 "获取当前widget信息")
- 启动浏览器:
var main = "android.intent.action.VIEW";
var add = '{"data":{"scheme":"http://www.appcan.cn/"}}';
uexWidget.startApp(1, main, add);
接口使用详见说明文档:
[启动第三方应用(Android)](http://newdocx.appcan.cn/newdocx/docx?type=1251_1249#startApp 启动第三方应用(Android) "启动第三方应用(Android)")
网友评论