介绍签名的两种方式:

1、signapk.jar命令行方式:

如果你需要开发一个带有系统权限的app,往往需要配置SharedUserId,比如:

  1. </pre><pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.cxq.signdemo"
  4. android:sharedUserId="android.uid.shell">
  5. <application
  6. android:allowBackup="true"
  7. android:icon="@mipmap/ic_launcher"
  8. android:label="@string/app_name"
  9. android:supportsRtl="true"
  10. android:theme="@style/AppTheme">
  11. <activity android:name=".MainActivity">
  12. <intent-filter>
  13. <action android:name="android.intent.action.MAIN" />
  14. <category android:name="android.intent.category.LAUNCHER" />
  15. </intent-filter>
  16. </activity>
  17. </application>

此时,如果直接在AS中run,app是装不上的,需要先生成app,然后再使用系统文件对apk进行签名,

java -jar signapk.jar  platform.x509.pem platform.pk8 signDemo.apk signDemo_signed.apk

虽然能够满足使用,但是作为开发者,不免会遇到需要调试的情况,然后这种离线的签名方式,就没法调试。。。严重影响了开发的效率。

2、在线自动打包签名的方式:

需要准备的文件:

keytool-importkeypair (下载),或者COPY下面脚本。

platform.x509.pem、platform.pk8(位于../build/target/product/security)

其本质的原理是给apk加上开发者签名(jks文件),使用keytool-importkeypair 对jks文件进行系统签名,在出包的时候,直接使用带有系统签名的jks对apk进行签名,这样编译生成的apk文件就自带系统签名了

1、使用keytool-importkeypair对jks文件引入系统签名

把platform.x509.pem、platform.pk8和上一部生成的jks文件统一放到一个文件夹下,比如我的是放在工程目录的signApk目录下

      

将下载好的keytool-importkeypair配置一下,其实主要就是配置一下环境变量,不熟悉的可以阅读官方文档,然后使用下面这条命令(需要在linux下,用windows的可以去在linux下生成jks,然后复制出新的jks回原目录也可以)对jks文件引入系统签名

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

 

例如我的对应的就是:

./keytool-importkeypair -k SignKitking.jks -p 123456 -pk8 platform.pk8 -cert platform.x509.pem -alias SignKitking

运行完这条命令之后,我们就得到了有系统签名的jks

2、配置gradle(app)

在在android区域下(与defaultConfig同级)添加signingConfigs配置:

依次填写jks的路径,密码,别名等

apply plugin: 'com.android.application'
android {
compileSdkVersion
buildToolsVersion "27.0.3" defaultConfig {
applicationId "com.android.factorytest"
} signingConfigs {
release {
storeFile file("../signApk/SignKitking.jks")
storePassword ''
keyAlias 'SignKitking'
keyPassword ''
} debug {
storeFile file("../signApk/SignKitking.jks")
storePassword ''
keyAlias 'SignKitking'
keyPassword ''
}
} buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
} dependencies {
implementation files('src/main/libs/classes.jar')
implementation files('src/main/libs/upgrade_ja.jar')
}

3、运行

经过以上配置之后,点击run,app就可以直接安装到目标机器上了

keytool-importkeypair脚本内容:

#! /bin/bash
#
# This file is part of keytool-importkeypair.
# DEFAULT_KEYSTORE=$HOME/.keystore
keystore=$DEFAULT_KEYSTORE
pk8=""
cert=""
alias=""
passphrase=""
tmpdir="" scriptname=`basename $` usage() {
cat << EOF
usage: ${scriptname} [-k keystore] [-p storepass]
-pk8 pk8 -cert cert -alias key_alias This script is used to import a key/certificate pair
into a Java keystore. If a keystore is not specified then the key pair is imported into
~/.keystore in the user's home directory. The passphrase can also be read from stdin.
EOF
} cleanup() {
if [ ! -z "${tmpdir}" -a -d ${tmpdir} ]; then
rm -fr ${tmpdir}
fi
} while [ $# -gt ]; do
case $
in
-p | --passphrase | -passphrase)
passphrase=$
shift
;;
-h | --help)
usage
exit
;;
-k | -keystore | --keystore)
keystore=$
shift
;;
-pk8 | --pk8 | -key | --key)
pk8=$
shift
;;
-cert | --cert | -pem | --pem)
cert=$
shift
;;
-a | -alias | --alias)
alias=$
shift
;;
*)
echo "${scriptname}: Unknown option $1, exiting" >&
usage
exit
;;
esac
done if [ -z "${pk8}" -o -z "${cert}" -o -z "${alias}" ]; then
echo "${scriptname}: Missing option, exiting..." >&
usage
exit
fi for f in "${pk8}" "${cert}"; do
if [ ! -f "$f" ]; then
echo "${scriptname}: Can't find file $f, exiting..." >&
exit
fi
done if [ ! -f "${keystore}" ]; then
storedir=`dirname "${keystore}"`
if [ ! -d "${storedir}" -o ! -w "${storedir}" ]; then
echo "${scriptname}: Can't access ${storedir}, exiting..." >&
exit
fi
fi # Create temp directory ofr key and pkcs12 bundle
tmpdir=`mktemp -q -d "/tmp/${scriptname}.XXXX"` if [ $? -ne ]; then
echo "${scriptname}: Can't create temp directory, exiting..." >&
exit
fi key="${tmpdir}/key"
p12="${tmpdir}/p12" if [ -z "${passphrase}" ]; then
# Request a passphrase
read -p "Enter a passphrase: " -s passphrase
echo ""
fi # Convert PK8 to PEM KEY
openssl pkcs8 -inform DER -nocrypt -in "${pk8}" -out "${key}" # Bundle CERT and KEY
openssl pkcs12 -export -in "${cert}" -inkey "${key}" -out "${p12}" -password pass:"${passphrase}" -name "${alias}" # Print cert
echo -n "Importing \"${alias}\" with "
openssl x509 -noout -fingerprint -in "${cert}" # Import P12 in Keystore
keytool -importkeystore -deststorepass "${passphrase}" -destkeystore "${keystore}" -srckeystore "${p12}" -srcstoretype PKCS12 -srcstorepass "${passphrase}" # Cleanup
cleanup

Android Studio自动生成带系统签名的apk的更多相关文章

  1. Android Studio自动生成UML关系类图

    android studio 根据源码自动生成UML的插件介绍http://www.jianshu.com/p/cbccd831cf01 simpleumlhttps://plugins.jetbra ...

  2. Android Studio 自动生成 Java Doc

    Android Studio 生成 Java Doc 出现"编码GBK的不可映射字符"问题 错误的解决方案,复制粘贴一万遍也是错误的,下面是查找出来的,没有用的解决方案(还有几个, ...

  3. 【Android Studio安装部署系列】二十二、Android studio自动生成set、get方法

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 操作步骤 将光标放置我们所要生成get,set方法的实体类空白处——然后右键——选择Generate. 选择“Getter and Set ...

  4. Android Studio 打包生成apk

    打开AndroidStudio,并且打开想要生成apk文件的项目  点击工具栏上面的“Builder”  点击“Builder”之后在下拉菜单里面可以看到“Genarate Singed APK”,点 ...

  5. Android Studio 打包生成正式apk(XXX-release.apk)的两种方式

    { 方式一:使用Android Studio生成1.点击Build->Generate Signed apk,首次点击可能会提示输入操作系统密码2.弹出如下对话框,还没有生成过keystore ...

  6. Android AIDL自动生成Java文件测试

    /******************************************************************************** * Android AIDL自动生成 ...

  7. Android Studio环境下代码混淆+签名打包

    Android Studio环境下代码混淆+签名打包 作者 Mr_冯先生 关注 2016.08.21 01:10 字数 1040 阅读 734评论 5喜欢 34 注:本文使用的Android Stud ...

  8. (转载) Android studio如何生成aar包

    Android studio如何生成aar包 标签: Android studio如何生成aaAndroid studio aarAndroid 如何生成aar包 2016-12-21 14:42 1 ...

  9. eclipse下Android无法自动生成apk文件怎么办?

    eclipse下Android无法自动生成apk文件怎么办? 现象:创建android工程后,通过手动build/clean或自动build均无法在bin文件夹下生成.apk文件 解决方法:进入win ...

随机推荐

  1. nginx源码学习资源(不断更新)转

    原文地址:http://www.cnblogs.com/yjf512/archive/2012/06/13/2548515.html nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx ...

  2. Codeforces Gym 100286J Javanese Cryptoanalysis 傻逼暴力

    原题地址:http://codeforces.com/gym/100286/attachments/download/2013/20082009-acmicpc-northeastern-europe ...

  3. 使用Swagger生成Spring Boot REST客户端(支持Feign)(待实践)

    如果项目上使用了Swagger做RESTful的文档,那么也可以通过Swagger提供的代码生成器生成客户端代码,同时支持Feign客户端. 但是经过测试,生成Feign代码和REST客户端有些臃肿. ...

  4. MD5进行文件完整性校验的操作方法

    我组产品包含大量音频和图片资源,MD5主要就用来检测这些资源文件的完整性.主要思路是:先计算出所有资源文件的MD5值,存到一个xml文件中,作为标准的MD5值.然后把这个xml文件放到我们的产品中,每 ...

  5. 【java】java base64编码与解码

    参考地址:http://blog.csdn.net/zhou_kapenter/article/details/62890262 要求:JDK1.8+ 使用java原生工具类即可实现 [这里展示字符串 ...

  6. [Rust] Pass a JavaScript Function to WebAssembly and Invoke it from Rust

    In some cases it’s useful to be able to invoke a JavaScript function inside Rust. This session showc ...

  7. Solidworks如何运行Toolbox

    现在的问题不是没安装,没配置,这两项已经勾选了   Toolbox也配置到第五步了,但是没有什么"完成"按钮,我只能点击关闭把这个窗口关了,而且下次要拉一颗螺丝进来也不行   这样 ...

  8. 哈理工2015 暑假训练赛 zoj 2976 Light Bulbs

    MS    Memory Limit:65536KB    64bit IO Format:%lld & %llu SubmitStatusid=14946">Practice ...

  9. vs 总结

    1.可以通过 视图--->属性管理器 来直接配置opencv,一键搞定 2.按住shift键不放,然后移动方向键,可以选中一路数据点. 3.调试程序的利器,调用堆栈,可以定位到程序死的那一刻. ...

  10. Machine Learning—Online Learning

    印象笔记同步分享:Machine Learning-Online Learning