[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` 根據自己的情況配置
輸入命令行后,會出現類似下圖信息

## 發布到安卓市場
### 渠道:
百度(91,安卓市場),360,小米,騰訊,豌豆莢,華為,樂商店,機鋒市場,木螞蟻,應用匯,搜狗
http://app.baidu.com/apps
http://dev.#/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
按照提示輸入操作。輸入參考:

以下為參數整合,完整命令:
~~~
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)
- 前言
- 中文字體
- 移動Web適配方案
- !移動Web基礎!
- 詳解適配相關概念
- 移動開發之設計稿
- 移動適配方案(一)
- 移動適配方案(二)
- vw+rem 實現移動端布局
- 移動端適配之雪碧圖(sprite)背景圖片定位
- 適配 iPhoneX
- 前端開發實戰
- 打造自己的前端開發流程(Gulp)
- flexible.js案例講解
- viewport 與 flexible.js解讀
- 圖片與字體
- 踩過的坑
- 瀏覽器默認樣式
- 300ms點擊延遲和點擊穿透
- ios css
- CSS 常見問題
- Ionic v1混合開發
- Native App、Web App 、Hybrid App?
- ionic項目結構
- 混淆加密
- 解決問題
- cordova
- 環境配置
- 打包發布
- 問題
- 移動前端開發優化
- Web開發之抓包
- ===web移動開發資源===
- H5組件框架
- 調試集合
- 簡單h5調試
- whistle
- devtools-pro