章节索引 :

Android 程序签名打包

在上一章,我们创建了自己的 Android 工程,并成功的在模拟器中运行起来。同时提到,工程目录中有一个 bin 目录,运行之后我们可以在此目录下找到我们的 apk。那么不难想到,我们在点“Run”之后,系统会编译我们的代码,并结合配置文件打出一个 apk。

众所周知 apk 是 Android 系统的安装包,在我们编写完代码,打包成 apk 之后,就可以将 apk 发布到应用市场,用户下载 apk 后就可以安装运行了。这一切看似简单但暗藏玄机,我们的 apk 一旦到了纷繁复杂的市场,就需要考虑很多问题。

比如如何将你发布的应用和其他开发者发布的应用区分开;如何确认用户下载的 apk 就是官方发布的而不是个人开发者;如何安全的完成应用升级等等一系列的问题。这些问题有些涉及商业,有些涉及系统安全,对于市场稳定性而言都是至关重要的,解决这些问题的,就是本章主角:Android 程序签名打包。大家可能对这个技术比较陌生,接下来我们从 what、why、how 这三个角度让大家对签名打包有一个清晰的认识。

1. 什么是签名

现在你写了一本书并签上自己的大名,将它出版之后放到各大书店,理想状态就是读者通过书名就能找到它。但是市面上的书不计其数,难免会有书名雷同,亦或是你的书大卖,市面上出现了盗版、翻版,这时候光靠书名已经没办法辨别,你的签名就能发挥作用了。今后如果你要出续集,同样,为了避免读者买到的是续集而不是同名的其他书,也需要在找到书名之后再次确认一下你的签名,两者一致才能认定这就是续集。

这一章提到的签名和现实中的签名非常类似,只不过在这里我们称为“数字签名”。

在 Android 系统中,所有安装到系统的App都必有一个数字证书,此数字证书用于标识应用程序的作者和应用程序之间的信任关系。Android 使用 Java 的数字证书相关的机制来给 apk 加盖数字证书,数字证书的私钥由开发者持有。

Android 使用证书作为标识应用程序作者的一种方式,和 Https 不同,Android 证书不需要由证书认证中心签名,开发者直接使用自制签名证书。所以我们在打包 apk 的时候,必须对 apk 用自己的证书做一次签名打包,用于在市场上唯一标识发布者的身份。一般 Android 有两种签名:

  1. 调试模式的签名: Android sdk 为应用自动生成一个签名证书,调试模式下签名的应用不能对外发布,因为由构建工具创建的证书是不安全的,应用商店不接受调试证书签名的 apk;
  2. 公布模式下签名: 需要生成自己的证书,可用于发布。

2. 为什么要做签名打包

关于签名打包的原因,上面已经提到过一些,主要是用于标识开发者的身份。这里再针对具体的应用场景阐述几个引入签名的优势:

  • 应用程序升级: 在应用程序发布更新时,如果用户已有此 App,并且签名和待升级的 apk 签名一致,那么用户可以无缝的升级到新版本。如果签名不一致,那么不会发生升级,此时相当于用户安装了两个完全独立的 App。
  • 应用程序模块化: Android 允许相同证书签名的应用程序运行在相同的进程中,此时系统会将它们作为单个应用程序处理。此时每个应用程序可以以模块化部署,在升级时可以独立地升级其中的某一个模块。
  • 代码、数据的授权共享: Android 提供了以签名为基础的权限机制,因此一个应用可以暴露功能给另一个用相同证书签名的应用使用,这样就可以在相同签名的应用程序之间共享代码和数据。

3. 如何签名打包

签名打包的方式有很多,这里介绍一种最简单的方式,直接使用Eclipse就可以为我们的 App 签名打包。

  1. 在 Eclipse 中选择“File” -> “Export”,选择“Android” -> “Export Android Application”;
  2. 这时候提示我们创建一个密钥库 keystore,选择 Create new keystore,然后指定一个保存证书的目录并设置证书密码;

创建密钥库

  1. 接着填写密钥库信息,填写证书文件的密码,使用期限和组织单位的信息,这样一个证书就生成好了。

密钥库信息

  1. 回到第一步,在 Export 的时候选择“Use existing keystore”,然后选择刚刚创建的证书,并输入密码,一路 next,搞定!

再看看 Eclipse 的 bin 目录,就会出现刚刚我们用自己的证书签名的 apk,待我们后面学习 Android 功能开发之后,你就可以用这种方式签名打包自己的 apk 进行发布了。

4. 小结

经过前面两章的学习,现在你已经可以完成一个 Android 项目的创建、运行、签名打包,剩下的也就是最重要—— Android 项目开发。接下来我们就正式进入 Android 基础知识,一步步进入 Android 的世界。

环境搭建,开发相关
Android 系统背景及结构概述 Android 开发环境搭建 Genymotion 的安装与使用 Android 工程解析及使用 Android 程序签名打包
常用 UI 布局
Android 的 UI 根基 View与View Android 线性布局 LinearLayout Android相对布局RelativeLayout Android 表格布局 TableLayout Android 网格布局 GridLayout Android 帧布局 FrameLayout Android绝对布局AbsoluteLayout
基础控件
Android 文本框 TextView Android 文本输入框 EditText 按钮 Button/ImageButton 选择框 RadioButton/Check 开关控件ToggleButton/Switch Android 图片控件 ImageView Android 进度条 ProgressBar Android 拖动条 SeekBar Android 评分条 RatingBar Android 滚动条 ScrollView 轮播滚动视图 ViewFlipper
Adapter 相关控件
Android 适配器 Adapter Android 列表控件 ListView Android 网格视图 GridView Android 下拉选择框 Spinner 自动补全文本框 AutoCompleteText 折叠列表 ExpandableListView
提示类控件
吐司提示:Toast 的使用方法 状态栏通知:Notification 对话框:AlertDialog 悬浮窗:PopupWindow
菜单类控件
菜单:Menu
其他控件
视频页面:ViewPager 侧滑菜单:DrawerLayout
事件处理机制
基于监听的事件处理机制 Handler 消息传递机制 触摸事件分发处理 AsyncTask:异步任务 Android 手势处理
Android 四大组件
活动:Activity 服务:Service 广播接收器:Broadcast Receiver 内容提供者 - Content Provider
数据存储
文件存储 SharedPreferences 存储 数据库:SQLite 的使用
网络编程
HTTP 使用详解 xml 数据解析 JSON 数据解析 网页视图:WebView Socket 网络接口
绘图与动画
图片资源:Drawable 位图:Bitmap
多媒体开发
媒体播放器:MediaPlayer 相机:Camera 音频录制:MediaRecorder
并发编程
多线程