【Android 基础】多渠道打包小结之应用的打包签名

学习android也有一段时间了,现在趁着假期总结下一些重要的知识点。

应用的打包签名

打包:打包就是根据签名和其他标识生成安装包。
签名:
1.在android应用文件(apk)中保存的一个特别字符串
2.用来标识不同的应用开发者:开发者A,开发者B
3.一个应用开发者开发的多款应用使用同一个签名

就好比是一个人写文章,签名就相当于作者的署名。
如果两个应用都是一个开发者开发的,那么签名就是一样的。
这个开发者,可以是个人,也可以是公司、团体。

为什么要签名:

原因1:
最简单直接的回答: 系统要求的。
Android系统要求每一个Android应用程序必须要经过数字签名才能够安装到系统中,也就是说如果一个Android应用程序没有经过数字签名,是没有办法安装到系统中的!
原因2:
不同程序员开发的应用包名可能会相同, 导致一个应用覆盖掉另一个应用。
如果只有包名的概念,那么如果B应用与已经安装的A应用包名一样,那就实现覆盖。不合理!
而事实上是装不上B的,它会提示,存在包名一致,但是签名不一样的。这就不会覆盖。

如何为apk签名:

用来声明签名的文件:

1 默认的debug.keystore:

debug签名的应用程序不能在Android Market上架销售,它会强制你使用自己的签名。
不同电脑使用此文件生成的签名不一样。那就意味着如果你换了机器进行apk版本升级,那么将会出现上面那种程序不能覆盖安装的问题。

2使用eclipse生成的xx.keystore
3使用AS生产的xx.jks

打包自己签名的APK(使用AS):

如果没有key store文件,那就创建一个
这里写图片描述
这里写图片描述

这里指定一个文件名。注意:在as中,签名文件keystore类型的文件变为jks格式的文件。输入的是该keystore的文件名
这里写图片描述

这里写图片描述
上面的密码是用来访问最上面的path路径文件的密码。而最上面的文件用来生成一个签名字符串。
下面Alias是一个别名。接下来的密码:是用来生成一个签名的时候,还需要的一个密码。与上面的密码可以不一致。
再下面的25,指的是有效期。google应用市场规定应用的有效期不低于25年。还可以改为100年。也就是说100年以后,我们的xxx.jks签名文件就失效了。
指明生成的apk的位置,Build Type:release:发布版 debug:测试版。
这里写图片描述
点击finish,稍等一会
默认在As工程中bin下生成的apk文件也有签名。只是用到了debug_keystore(测试)的模式。而我们想发布到应用市场的话,那就需要我们自己提供一个签名,不能用默认的。

在代码中获得应用的签名

public void getSingInfo() {
    try {
        PackageInfo packageInfo = getPackageManager().getPackageInfo(
                "cn.xxx.test", PackageManager.GET_SIGNATURES);
        Signature[] signs = packageInfo.signatures;
        Signature sign = signs[0];
        parseSignature(sign.toByteArray());
    } catch (Exception e) {
        e.printStackTrace();
    }
}
public void parseSignature(byte[] signature) {
    try {
        CertificateFactory certFactory = CertificateFactory
                .getInstance("X.509");
        X509Certificate cert = (X509Certificate) certFactory
                .generateCertificate(new ByteArrayInputStream(signature));
        String pubKey = cert.getPublicKey().toString();
        String signNumber = cert.getSerialNumber().toString();
        Log.e("TAG", "pubKey:" + pubKey);
        Log.e("TAG", "signNumber:" + signNumber);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

注意事项:

千万不要把xxx.keystore/xxx.jks文件弄丢了,弄丢了换签名文件的话,用户安装时必须先卸载才能成功安装,应用市场上的排行就会从0开始了。

万一丢了只能重新签名了:

案例:
公司程序员A写的应用,然后走了。后来来了一个程序员B把应用更新以后,又重新打包发布,使用的签名不一致。那完了。
导致出现更新不了应用的情况。必须把应用卸载了才能重新装。那想象一下,如果一个20万用户的应用,在更新时,发现安装不了。那可能随后就卸载了。或者就不更新了。
另外还影响的是:应用市场有下载量排名,如果重新签名,那就得重头来算。

一些小问题:

现象:
错误在Android导出APK包时出现,编译调试时却不出现。
错误信息:
Error:(16) Error: “baidutieba_client_inavailable” is not translated in “en” (English) [MissingTranslation]
Error:(63) Error: “baidutieba” is not translated in “en” (English) [MissingTranslation]
Error:(67) Error: “share_to_baidutieba” is not translated in “en” (English) [MissingTranslation]
错误截图:
这里写图片描述

解决办法:
在报错的文件里面的resources 标签内增加两个属性即可:

<?xml version="1.0" encoding="utf-8" ?>  
<resources xmlns:tools="http://schemas.android.com/tools"  
  tools:ignore="MissingTranslation">  
</resources> 
发布了89 篇原创文章 · 获赞 37 · 访问量 23万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章