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

摘要:
)Java-Xmx2048-Djava。图书馆path=“out/host/linux-x86/lib64”-jarout/host/lilinux-x86/framework/signapk.jar-disable-v2-wbuild/target/product/security/platform.x509.pem build/targel/product/security/platform.pk8 old.apknew.apk方法2:通过Android.mk配置apk编译为签名apk:write Android.mkLOCAL_path:=$include$LOCAL_MODULE:=app//要签名的apk名称为LOCAL_SRC_FILES:=app。apk//apk文件LOCAL_MODULE_CLASS:=APPSLOCAL_MODULE_SUFFIX:=.apkLOCAL_BUILT_MODULE_STEM:=package.apkLOCAL_CERTIFICATE:=platform//系统签名LOCAL_DEX_PREOPT:=falseLOCAL_PRIVILEGED_MODULE:=true包含$将apk放在与.mk相同的目录中。配置sdk编译环境后,执行mm指令编译。签名apk在以下位置生成:out/target/product/xxxx/system/priv-app/app/app.apk。

  方法一:使用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的配置第1张

    (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的配置第2张

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

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

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

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

------>生成系统平台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的配置第5张

签名apk生成路径:xxxxapp elease

实质是运行 Sdkuild-tools27.0.3libapksigner.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的配置第6张

     ② File -> Project structure -> Flavors:

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

   ③ File -> Project structure -> Build Types:

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

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

android {
    signingConfigs {
        release {
            keyAlias 'SignDemo'
            keyPassword '123456'
            storeFile file('E:/project/androidStudio/signAPK/SignDemo.jks')
            storePassword '1234546'
        }
    }
......
    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的配置第9张

  然而对于一些开源项目,直接在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 26 16:21:41 CST 2018
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=123456
keystore.alias=SignDemo
keystore.alias_password=123456

  ②在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的配置第10张

关于system app的提示:

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

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

-end-

免责声明:文章转载自《Android : apk签名的多种方法以及key的配置》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Java中针对Yaml格式数据操作记录C# 文件导出 EXCEL下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python实现快捷输入(类似WeGame的一键喊话)

故事背景:   表弟跟我说,他玩游戏玩的不是很好,导致经常被队友互动,但是自己的手速有限,经常在互动中败阵。   因此,尝试做一款小工具,帮助表弟取得和队友互动的胜利! 逻辑设计:   监听键盘上的某个按键   当该按键被按下时,调用数据库(或者远程接口)的数据   将获取到的数据写进Windows的剪贴板   模拟粘贴快捷键(Ctrl + V),将数据文...

Unity 生成 Android App Bundle(aab) (一)

Android App Bundle   Android App Bundle 是一种发布格式,其中包含您应用的所有经过编译的代码和资源,它会将 APK 生成及签名交由 Google Play 来完成。   Google Play 会使用您的 App Bundle 针对每种设备配置生成并提供经过优化的 APK,因此只会下载特定设备所需的代码和资源来运行您的...

Android签名总结

http://www.cnblogs.com/wanqieddy/p/3556060.html signapk.jar与eclipse export插件默认赋予程序一个DEBUG权限的签名 signapk.jar包含有系统权限(system api, permission),而eclipse export插件默认赋予程序一个DEBUG权限的签名。 D:...

解决 i18n properties文件中文必须是unicode的问题

解决 i18n properties文件中文必须是unicode的问题 i18n  unicode  UTF-8  目前产品需要做国际化,但 java 的 I18N 资源文件中中文必须转换成 unicode 才行。虽然并不会有问题,但实在是不方便,通过查看 ResourceBundler 类的源码,发现其内部类 Control 在读取资源文件时,使用的...

springboot制作自定义starter

自定义starterSpringBoot中的starter是一种非常重要的机制,能够抛弃以前繁杂的配置,将其统一集成进 starter,应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启 动相应的默认配置。starter让我们摆脱了各种依赖库的处理,需要配置各种信息的困扰。 SpringBoot会自动通过...

Java中primitive type的线程安全性

Java中primite type,如char,integer,bool之类的,它们的读写操作都是atomic的,但是有几个例外: long和double类型不是atomic的,因为long和double都是8字节的,而在32位的CPU上,其机器字长为32位,操作8个字节需要多个指令操作。 ++i或者i++,因为要先读后写,也是多步操作。 这些情况下,...