ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # Android ## 签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本的一致性(如自动更新不会因为版本不一致而无法安装)。 ## 预备知识 先了解两件事情: Keytool 是一个有效的安全钥匙和证书的管理工具. Android 要求所有的程序必须有签名,否则就不会安装该程序。 ## 关闭调试信息 ### 去掉console调试插件 进入APP项目,执行: `cordova plugin rm org.apache.cordova.console //去掉console调试插件` ### Android 相关文件修改 更改APP目录下的platforms/android/AndroidManifest.xml文件 `<application android : debuggable = "true" android : hardwareAccelerated = "true" android : icon = "@drawable/icon" android : label = "@string/app_name" >` 把android:debuggable 改为false: `<application android : debuggable = "false" android : hardwareAccelerated = "true" android : icon = "@drawable/icon" android : label = "@string/app_name" >` 使用Cordova生成发布版本 `cordova build --release android` 看到 Build Successful 说明构件成功,通过apk文件名可以看到现在的安装文件时未签名的unsigned。如果**需要发布到应用商店,我们需要进行签名并优化**。 ## Android APK 手动打包流程 Android app 的打包流程大致分为**build , sign , align**三部分。 1. **build** 是构建 APK 的过程,分为 debug 和 release 两种。release 是发布到应用商店的版本。 2. **sign** 是为 APK 签名。不管是哪一种 APK 都必须经过数字签名后才能安装到设备上,签名需要对应的证书(keystore),大部分情况下 APK 都采用的自签名证书,就是自己生成证书然后给应用签名。 3. **align** 是压缩和优化的步骤,优化后会减少 app 运行时的内存开销。 debug 版本的的打包过程一般由开发工具(比如 Android Studio)自动完成的。 开发工具在构建时会自动生成证书然后签名,不需要我们操心。 而 release 版本则需要开发者自己生成证书文件。 Cordova 作为 hybrid app 的框架不像纯 Android 开发那么自动化,所以第一次打 release 包我们需要了解一下手动打包的过程。 ## build 执行`cordova build android`命令。 默认是debug模式,会使用` debug.keystore` 来生成以下两个文件: ~~~ XXXX-debug.apk(signed, unaligned) XXXX-debug-unaligned.apk(signed, aligned) ~~~ `debug.keystore`的位置: ~~~ win7 : C:\Users\Administrator\.android\ ~~~ ### sign 1. 首先需要先生成一个数字签名文件(keystore):   Java自带的keytool工具是个密钥和证书管理工具。   在JDK 1.4以后的版本中都包含了这一工具,它的位置为`<JAVA_HOME>\bin\keytool.exe`。   它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务。它还允许用户储存他们的通信对等者的公钥(以证书形式)。   keytool 将密钥和证书储存在一个所谓的密钥仓库(keystore)中。缺省的密钥仓库实现将密钥仓库实现为一个文件。它用口令来保护私钥。   JKS和JCEKS是Java密钥库(KeyStore)的两种比较常见类型(我所知道的共有5种,JKS, JCEKS, PKCS12, BKS,UBER)。   JKS的Provider是SUN,在每个版本的JDK中都有,JCEKS的Provider是SUNJCE,1.4后我们都能够直接使用它。   JCEKS在安全级别上要比JKS强,使用的Provider是JCEKS(推荐),尤其在保护KeyStore中的私钥上(使用TripleDes)。 2. 然后我们就可以用下面的命令对 APK 签名了: jarsigner是JDK中包含的用于JAR文件签名和验证的工具。 ` jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore HelloWorld-release-unsigned.apk alias_name` **注意**: alias_name与上面所的应该是一致的 ### align **最后一步**:在Android SDK中包含了一个工具名为Zipalign,它可以优化你的APK程序包,它首次被引入是在Android 1.6版本的SDK软件开发工具包中。我们都知道APK的MIME其实就是一个Zip压缩文件,通过Zipalign可以让你的应用程序运行更快,Android123猜测从原理上来讲应该是优化Zip文件的解压速度,毕竟这个工具的文件名为zip对齐。 在Android平台中,数据文件存储在apk文 件中,可以多进程的访问,如果你开发过Win32可能知道程序的粒度对齐问题,不错虽然不是PE格式的文件,在Zip中一样,资源的访问可以通过更好的对 其优化,而zipalign使用了4字节的边界对齐方式来影射内存,通过空间换时间的方式提高执行效率。 `zipalign -v 4 android-apk/android-release-unsigned.apk android-apk/cordova-demo.apk` ### 查看apk的签名 查看签名是否成功,可将签名后的文件,后缀名apk的改为zip,解压。 在该目录下,输入如下命令: `keytool -printcert -file META-INF/CERT.RSA` `META-INF/TEST.RSA` 根据自己的情况配置 输入命令行后,会出现类似下图信息 ![查看apk的签名](https://box.kancloud.cn/188992205f3c7746b84e32dece45a767_1442x142.png) ## 发布到安卓市场 ### 渠道: 百度(91,安卓市场),360,小米,腾讯,豌豆荚,华为,乐商店,机锋市场,木蚂蚁,应用汇,搜狗 http://app.baidu.com/apps http://dev.360.cn/mod/developer/ http://dev.xiaomi.com/ http://open.qq.com/ http://developer.wandoujia.com/ http://zhushou.sogou.com/open/ http://dev.appchina.com/market/dev/index.action http://open.lenovo.com/developer/ http://developer.huawei.com/consumer/cn/devunion/openPlatform/html/memberCenter.html#modifyApp# http://dev.mumayi.com/ http://dev.gfan.com/ 特别是360,360的先上传安装包,网上加固后下载安装包再签名再上传 ### 需要的材料: 1. icon (256*256 512*512 1024*1024 且圆角和直角都有) 2. app截屏(480*800 4-8张) 3. 资质(软件著作证书 税务登记证 营业执照 组织机构代码证) 4. 身份证正反面 5. app的相关内容填写(均不得包含关键词,最,平台,什么的):一句话简介,应用简介,当前版本更新内容 ## 附录: ### [获取Android签名打包keystore或者.jks文件的MD5](http://jingyan.baidu.com/article/75ab0bcbb3bf08d6864db2b0.html) ### 关于.jks与.keystore 签名文件在Android Studio中为.jks 在eclipse时为.keystore文件 ### [证书格式转换](https://www.trustasia.com/tools/cert-converter.htm) 提供 PEM JKS PKCS12 3种证书格式相互转换 ## **总结** 自从Cordova从4.0开始,涉及到cordova的项目,就**会自动去下载google推荐的Gradle(项目自动构建工具)来构建APK**。**所以我现在打包release版本的发布apk时,都是用 Gradle 配置自动打包!** 所以使用老方法无法生成带签名的APK,可按以下步骤解决: 1.生成JKS类型的证书(test.keystore,默认是jks),在命令行下执行: 签名方法参考如下: 1. 使用JDK的keytool工具,在当前目录下生成keystore文件 keytool -genkey -v -keystore lzwme-release-key.keystore -alias lzwme -keyalg RSA -validity 365 按照提示输入操作。输入参考: ![](http://lzw.me/wp-content/uploads/2014/06/keytool_genkey.jpg) 以下为参数整合,完整命令: ~~~ keytool -genkey -v -alias testAlias -keyalg RSA -keystore test.keystore dname “CN=xxx.net,OU=xxx,O=xxx,L= beiijng,ST=beijing,C=china” -storepass * -keypass * -validity 36500 ~~~ 然后复制生成的 keystore 文件到目录 platforms/android/的目录下。 *其中参数-validity为证书有效天数,这里我们写的大些20000天。还有在输入密码时没有回显,只管输入就可以了,一般位数建议使用20位,最后需要记下来后面还要用。* 2.在项目/platforms/android目录下新建`release-signing.properties`文件,填入: ~~~ key.store=./gzichan_release.jks /*Xee:相对路径/test.keystore*/ key.store.password=yf**** /*签名密码*/ key.alias=XXXE手通 key.alias.password=yf**** ~~~ 3.命令行下执行` cordova build android –release`或者 `cordova build --release android`编译即可,在/platforms/android/build/outputs/apk下就会生成已签名的安装包android-release.apk。 我觉得一般情况使用 build.json 就足够了。有兴趣的可以看这个 [Cordova 官方教程](https://cordova.apache.org/docs/en/latest/guide/platforms/android/index.html#setting-gradle-properties) ### 完整命令行操作: ~~~ cordova plugin rm cordova-plugin-console ionic build android --release --prod --device -- --keystore="../android.keystore" --storePassword=android --alias=mykey --password=myKeyPassword cd platforms cd android cd build cd outputs cd apk zipalign -v 4 android-release.apk WanCheTT.apk // 或者直接(将在项目的根目录下生存WanCheTT.apk) zipalign -v 4 ./platforms/android/build/outputs/apk/android-release.apk WanCheTT.apk ~~~ # IOS with xcode ``` $ gulp build --env production $ ionic build ios ``` open `platforms/ios/ProkectName.xcodeproj` choose `Generic iOS Device` for `Set the active scheme` click `Product > Archive` Upload to App Store or Export(Save for Enterprise Deployment) 代码 ## 参考 https://segmentfault.com/a/1190000005177715 [ionic云打包](https://segmentfault.com/a/1190000008076771)