Android : apk签名的多种方法以及key的配置

时间:2022-10-09 17:12:29

方法一:使用Android SDK中的签名工具给apk签名:

(1)Android源码的 build/target/product/security/ 目录下有 media.pk8、media.x509.pem、platform.pk8、platform.x509.pem、shared.pk8、shared.x509.pem、testkey.pk8、testkey.x509.pem等签名文件,不同的签名文件对应不同的权限,Android默认的签名文件为testkey.pk8、testkey.x509.pem。

Android : apk签名的多种方法以及key的配置

(2) Android SDK中的签名工具为 signapk.jar,具体路径:out/host/linux-x86/framework/signapk.jar,签名指令如下:

     java -jar signapk.jar platform.x509.pem platform.pk8 old.apk new.apk

8.0上验证需要额外的一些参数:    (直接在源码根目录执行签名,但是7.0以上采用 APK Signature Scheme v2,会导致安装不了,但是增加参数 --disable-v2 无效知道原因的朋友还请告知一下!)

    java -Xmx2048m -Djava.library.path="out/host/linux-x86/lib64" \
    -jar out/host/linux-x86/framework/signapk.jar  --disable-v2 \
    -w build/target/product/security/platform.x509.pem \
    build/target/product/security/platform.pk8 \
    old.apk new.apk

 方法二:通过Android.mk配置编译成签名apk:

  (1)编写Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := app //要签名的apk名称
LOCAL_SRC_FILES := app.apk //apk文件
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := .apk
LOCAL_BUILT_MODULE_STEM := package.apk
LOCAL_CERTIFICATE := platform //系统签名
LOCAL_DEX_PREOPT := false
LOCAL_PRIVILEGED_MODULE := true
include $(BUILD_PREBUILT)

    (2) 将apk放入.mk同目录(命名为app.apk),配置好sdk编译环境后执行mm指令编译,签名apk生成在:out/target/product/xxxx/system/priv-app/app/app.apk 。

注:LOCAL_CERTIFICATE := platform         表示使用系统签名
  LOCAL_DEX_PREOPT := false    不提前优化,无oat文件

  
方法三:Android studio配置key签名: (1)生成key: ------>生成本地key:

Android : apk签名的多种方法以及key的配置

----------------------------------------------------------------------------------------------------------------------

Android : apk签名的多种方法以及key的配置

---------------------------------------------------------------------------------------------------------

Android : apk签名的多种方法以及key的配置

------>生成系统平台key:

下载 keytool-importkeypair 工具,使用sdk的security文件生成对应平台的key:

./keytool-importkeypair -k [jks文件名] -p [jks的密码] -pk8 platform.pk8 -cert platform.x509.pem -alias [jks的别名]

如:
./keytool-importkeypair -k ./SignDemo.jks -p 123456 -pk8 platform.pk8 -cert platform.x509.pem -alias SignDemo

 

(2)使用key:

通过以上方法生成的SignDemo.jks更新到android studio原来设置的目录,下一步即可生成签名APK:

Android : apk签名的多种方法以及key的配置

签名apk生成路径:\xxxx\app\release

实质是运行 Sdk\build-tools\27.0.3\lib\apksigner.jar 进行签名:

  java -jar apksigner.jar sign        //执行签名操作
    --ks 你的jks路径            //jks签名证书路径
    --ks-key-alias 你的alias      //生成jks时指定的alias
    --ks-pass pass:你的密码    //KeyStore密码
    --key-pass pass:你的密码    //签署者的密码,即生成jks时指定alias对应的密码
    --out output.apk         //输出路径
    input.apk          //被签名的apk
补充:

 V1签名(jarsigner方式):

//jarsigner -verbose -keystore (签名地址) -signedjar (签名后的apk地址) (待签名apk地址) (别名)
jarsigner -verbose -keystore D:\itlao5.keystore -signedjar D:\itlao5_signed.apk D:\itlao5.apk itlao5

V2签名(apksigner方式):

// apksigner sign --ks (签名地址) --ks-key-alias (别名) --out (签名后的apk地址) (待签名apk地址)
apksigner sign --ks D:\itlao5.keystore --ks-key-alias itlao5 --out D:\itlao5_signed.apk D:\itlao5.apk

验证签名是否成:

apksigner verify -v --print-certs (apk地址)

每次生成签名apk都要选择 Build->Generate Signed APK 配置一下key,岂不是很麻烦?当然有简化方法,生成.jks后可以在项目的app目录下的build.gradle中进行配置,步骤如下:

  ① File -> Project structure -> Signing:

    Android : apk签名的多种方法以及key的配置

    ② File -> Project structure -> Flavors:

Android : apk签名的多种方法以及key的配置

  ③ File -> Project structure -> Build Types:

Android : apk签名的多种方法以及key的配置

通过以上配置步骤后,可在build.gradle中可以看到增加了如下配置信息(粗体),当然也可以手动直接在build.gradle中输入配置信息:

android {
signingConfigs {
release {
keyAlias
'SignDemo'
keyPassword ''
storeFile file('E:/project/androidStudio/signAPK/SignDemo.jks')
storePassword ''

}
}

......
buildTypes {
release { //生成release apk
zipAlignEnabled true //4字节对齐,减少运行内存消耗 
minifyEnabled true //false = 关闭混淆
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release

}
debug { //生成debug apk
zipAlignEnabled true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
} }

   然后通过Build Variants选择对应的项目版本,直接编译生成签名apk,省去之前每次选择key麻烦。

Android : apk签名的多种方法以及key的配置

  然而对于一些开源项目,直接在build.gradle中显式配置key,那密码等信息就泄露了,所以可以把相关信息定义在local.properties中,因为local.properties存储的是本地环境资源的一些相关信息,默认不加入代码版本管理,然后build.gradle中引用其变量即可:

  ①在local.properties中添加信息:

## This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Mon Nov :: CST
ndk.dir=C\:\\Users\\Administrator\\AppData\\Local\\Android\\Sdk\\ndk-bundle
sdk.dir=C\:\\Users\\Administrator\\AppData\\Local\\Android\\Sdk keystore.path=E\:/project/androidStudio/signAPK/SignDemo.jks
keystore.password=
keystore.alias=SignDemo
keystore.alias_password=

  ②在build.gradle中引用其定义的值:

    signingConfigs {
release {
//加载资源
Properties properties = new Properties()
InputStream inputStream = project.rootProject.file('local.properties').newDataInputStream()
properties.load(inputStream) //读取文件
def sdkDir = properties.getProperty('keystore.path')
storeFile file(sdkDir) //读取字段
def key_keyAlias = properties.getProperty('keystore.alias')
def key_keyPassword = properties.getProperty('keystore.password')
def key_storePassword = properties.getProperty('keystore.alias_password') keyAlias key_keyAlias
keyPassword key_keyPassword
storePassword key_storePassword
}
} ...... buildTypes {
release { //生成release apk
zipAlignEnabled true //4字节对齐,减少运行内存消耗 
minifyEnabled true //false = 关闭混淆
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release

}
}

通过以上方法就可以在build.gradle中隐式配置key,而Project Structure中就不用再配置key相关信息了:

Android : apk签名的多种方法以及key的配置

关于system app的提示:

  平台签名的apk,如果 AndroidManifest.xml 中指定是 android:sharedUserId="android.uid.system",即为system app:

Android : apk签名的多种方法以及key的配置

-end-

Android : apk签名的多种方法以及key的配置的更多相关文章

  1. [转]Android APK签名原理及方法

    准备知识:数据摘要 这个知识点很好理解,百度百科即可,其实他也是一种算法,就是对一个数据源进行一个算法之后得到一个摘要,也叫作数据指纹,不同的数据源,数据指纹肯定不一样,就和人一样. 消息摘要算法(M ...

  2. Android APK 签名 (转发)

    Cordova 3.5 为 Android APK 签名,生成可发布的 APK 程序文件  任侠  2014-06-07 00:04  移动开发  抢沙发  16,288 views  目录 [隐藏] ...

  3. Android APK 签名比对(转)

    Android apk签名的过程 1. 生成MANIFEST.MF文件: 程序遍历update.apk包中的所有文件(entry),对非文件夹非签名文件的文件,逐个生成SHA1的数字签名信息,再用Ba ...

  4. Android apk签名详解——AS签名、获取签名信息、系统签名、命令行签名

    Apk签名,每一个Android开发者都不陌生.它就是对我们的apk加了一个校验参数,防止apk被掉包.一开始做Android开发,就接触到了apk签名:后来在微信开放平台.高德地图等平台注册时,需要 ...

  5. Android apk签名的两种方法

    编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! 为了保证 ...

  6. Android apk签名方法介绍

    还望支持个人博客站:http://www.enjoytoday.cn 参考博客:http://www.enjoytoday.cn/posts/203 为什么要签名 在介绍签名方法之前,首先我们来了解下 ...

  7. Android APK签名

    一.为什么要签名? 开发Android的人这么多,完全有可能大家都把类名,包名起成了一个同样的名字,这时候如何区分?签名这时候就是起区分作用的. 由于开发商可能通过使用相同的Package Name来 ...

  8. android apk签名原理

    //这个md5跟腾讯的对应 public Signature getPackageSignature( ){ Context context=getContext(); String packageN ...

  9. 得到Android keystore签名的命令方法

    keytool -list -v -keystore keyfile.jks 上面这个命令是用来得到一些签名字符串,这些字符串用来在各种平台上填资料的 再来个手动签名的命令: jarsigner -v ...

随机推荐

  1. php curl get post

    post有3种. 1.post方式 privatefunction send_post($url,$post_data){ $ch = curl_init($url); curl_setopt($ch ...

  2. 【Linux】 诊断工具-strace

    1,别人家的总结: http://www.cnblogs.com/bangerlee/archive/2012/02/20/2356818.html 2,我自己碰到问题: 暂无. 3,使用场景: 程序 ...

  3. OpenGL【2 坐标转换】

    // OpenGL.cpp : 自定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include & ...

  4. C&num;动态表达式计算&lpar;续1&rpar;

    距上一帖近五天时间,让大家久等了,没想到关注这个话题的也不少人,正如有同志所说的想解决该问题其实是有太多的解决方法,比如动态构造类编译.调用vbscript或者可以采用javascript解析引擎或者 ...

  5. Mysql &lbrack;Err&rsqb; 1293 there can be only one TIMESTAMP column with CURRENT&lowbar;TIMESTAMP in DEFAULT or ON UPDATE clause

    问题: mysql数据 导入数据出错 [Err] 1293 - Incorrect table definition; there can be only one TIMESTAMP column w ...

  6. Motivation

    觉得一个需求不错,却没有意愿去做,唯一可能的意愿就是生活需要.可这并不能很好的带动起来什么,除了让自己觉得在逼自己. 后来在这个需求的基础上,延伸出新的需求,可能更适应生活.仍然没有意愿去动手,虽然生 ...

  7. Spring Boot &commat;EnableWebMvc 与 mvc 配置

    注意: 1.小心使用  @EnableWebMvc 注解 根据官方文档,尽量不要使用 @EnableWebMvc 注解,因为它会关闭默认配置. ① 你希望关闭默认配置,自己完全重新实现一个 @Enab ...

  8. 解决java新开页面被拦截的问题

    在开发中遇到from表单利用 target="_blank" 属性新开页面时被拦截. 用ajax让form表单提交,这时有可能浏览器会拦截新开页面,这时只 需要设置 ajax 同步 ...

  9. java I&sol;O系统 LineNumberReader类

    LineNumbeReader类可以很方便的读取文件的行号 package ch13; import java.io.*; import io.BufferedInputFile; public cl ...

  10. ios开发之--随机背景颜色

    记录个随机背景颜色的方法: + (UIColor*) randomColor{ NSInteger r = arc4random() % ; NSInteger g = arc4random() % ...