在开发android程序的过程中,我们使用ant debugant installd这两个命令就够了,不涉及到APK的签名。

但是在正式发布我们的Android程序时,需要对APK签名。ant release生成一个release版程序。

ant release在package这一步会生成一个未签名的apk:xxx-release-unsigned.apk。然后试图用ant.properties里面给出的keystore文件对这个apk签名,生成xxx-release.apk。如果ant.properties没有给出keystore,不会生成签名的apk。这时你运行ant installr就会失败,因为ant找不到xxx-release.apk

解决方法有两种:(1)在ant.properties文件中设置key.store和key.alias,然后重新运行ant releaseant installr命令。(2)自己用命令对xxx-release-unsigned.apk签名和zipalign,生成xxx-release.apk,然后再运行ant installr

不管用哪种方法,我们都要先准备好keystore文件。JDK提供了keytool程序,可以生成key.store文件。

keytool.exe -genkey -alias jollywing.android.keystore -keyalg RSA -validity 36500 -keystore android.keystore
  • -genkey 表示要进行的动作是生成keystore.
  • -alias 是这个keystore的别名。
  • -keyalg 表示生成密钥对的算法。
  • -validity 表示有效期,这里36500接近100年。
  • -keystore 指定最终生成的keystore文件名。

运行命令,会提示输入密钥库口令。这个口令在给apk签名时还会问到。

然后会询问一些信息,你的姓名、你的组织、你所在的地区等。

最后还会询问key.alias的密钥口令,直接回车,表示使用和密钥库相同的口令。

命令运行成功,还会得到一个警告信息:

JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore android.keystore -destkeystore android.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

我们可以运行警告信息中的命令,把密钥库转换成标准格式。这一步可选。

然后我们可以签名了。两种方式,一种是用ant release命令签名,另一种是手动签名。

如果用ant release命令签名,我们把android.keystore放在工程根目录下,即和build.xml和ant.properties相同的目录。然后编辑ant.properties,增加以下内容。

key.store=android.keystore
key.alias=jollywing.android.keystore
key.store.password=<刚才设置的密钥库口令>
key.alias.password=<刚才设置的密钥库别名口令>

如果android.keysotre没放在工程根目录下,最好使用绝对路径指明keystore文件放在哪里。

然后ant releaseant installr就OK了。

最后再讲一下自己用命令对xxx-release-unsigned.apk进行签名。

使用jdk中的jarsigner命令(apk就是一个jar包文件)。

jarsigner -keystore <keystore文件的路径> <xxx-release-unsigned.apk的路径> 密钥库别名

命令运行后,xxx-release-unsigned.apk就是已经签名的了。

zipalign -v 4 <xxx-release-unsigned.apk的路径> <要生成的xxx-release.apk的路径>

zipalign命令放在android sdk的build-tools目录下。

好了,一个可以发布的apk新鲜出炉了,adb install <xxx-release.apk的路径>试试看吧。如果xxx-release.apk放在工程的bin目录下,也可以直接运行ant installr

2017-11-25 周六

用命令行发布android程序的更多相关文章

  1. unity3d发布Android程序

    unity3d是一个跨平台的游戏开发引擎,可以使用c#开发各种平台上的游戏,如windows,Mac,Android,windows phone,IOS,Flash等.下面说下如何将开发好的unity ...

  2. 命令行创建Android应用,生成签名,对APK包签名并编译运行

    一.命令行创建Android应用 android create project -n HelloWorld -t android-22 -p HelloWorld1 -k org.crazyit.he ...

  3. [Android] 基于 Linux 命令行构建 Android 应用(七):自动化构建

    本章将演示如何基于 Linux 命令行构建 Android 应用,在开始本章之前,希望你已经阅读之前几章内容. 本文环境为 RHEL Sandiego 32-bits,要基于 Linux CLI 构建 ...

  4. [Android] 基于 Linux 命令行构建 Android 应用(二):命令行管理项目

    创建 Android 项目 在命令行创建 Android 项目需要用到 android 工具(该工具由 Android SDK 提供,位于 <sdk>/tools/ 目录下.).它能自动生 ...

  5. 命令行创建Android应用,命令行生成签名文件,命令行查看签名信息,对APK包签名并编译运行

    一.命令行创建Android应用 android create project -n HelloWorld -t android-22 -p HelloWorld1 -k org.crazyit.he ...

  6. 一个使用命令行编译Android项目的工具类

    一个使用命令行编译Android项目的工具类 简单介绍 编译apk项目须要使用的几个工具,基本都在sdk中,它们各自是(Windows系统): 1.aapt.exe 资源打包工具 2.android. ...

  7. win10 uwp 使用 msbuild 命令行编译 UWP 程序

    原文:win10 uwp 使用 msbuild 命令行编译 UWP 程序 版权声明:博客已迁移到 http://lindexi.gitee.io 欢迎访问.如果当前博客图片看不到,请到 http:// ...

  8. 使用命令行编译Qt程序

    code[class*="language-"], pre[class*="language-"] { color: rgba(51, 51, 51, 1); ...

  9. windos命令行下的程序编写

    1.命令行下写程序. 写程序一定要用IDE?不,我还可以用记事本呢.呵呵,写程序一定要用记事本?? ———————————————— 命令行下输入copy con test.txt后回车可在相应目录下 ...

随机推荐

  1. ArrayMap代码分析

    Java提供了HashMap,但是HashMap对于手机端而言,对内存的占用太大,所以Android提供了SparseArray和ArrayMap.二者都是基于二分查找,所以数据量大的时候,最坏效率会 ...

  2. ORA-01654 : 表空间不足

    参考: Oracle表空间不足ORA-01654 查看表空间和表的使用率 ORA-01654 索引 无法通过 表空间扩展 Oracle 查看表空间的大小及使用情况sql语句 一.基础查询 1.查看表空 ...

  3. Node json

    //1:加载相关模块 http express mysqlconst http = require("http");const mysql = require("mysq ...

  4. html DOM導航

    getElementByTagname()獲取所有相同標籤的節點列表,length表示節點的長度: lastchild表示最後一個子節點,firstchild表示第一個子節點,parentnode表示 ...

  5. Git提交代码失败: empty ident name (for <>) not allowed

    使用git提交代码,报错如下: 下午2:56 Commit failed with error 0 files committed, 1 file failed to commit: 升级 empty ...

  6. Bootstrap滚动监控器

    前面的话 滚动监听插件是用来根据滚动条所处的位置来自动更新导航项的.滚动导航条下面的区域并关注导航项的变化,下拉菜单中的条目也会自动高亮显示.本文将详细介绍Bootstrap滚动监控器 基本用法 滚动 ...

  7. maven 父工程 消除重复 对子模块进行管理 主要继承依赖

     子类继承父类的 可以不需要groupid与versionid

  8. mybatis 一对多的注入 指的是连表查询时候 将不同的查询结果以列表存储对象形式 注入进去 多对一指的是 查询多条结果但都是一样的 只需注入一条

    mybatis 一对多的注入 指的是连表查询时候 将不同的查询结果以列表存储对象形式 注入进去 多对一指的是 查询多条结果但都是一样的 只需注入一条

  9. File操作

    对文件进行操作(只操作小文件) bool Exists(string path) 判断文件是否存在 FileStream Create(string path) 创建文件 void Move(stri ...

  10. BZOJ1018[SHOI2008]堵塞的交通——线段树

    题目描述 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总 ...