介绍签名的两种方式:

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. 在springboot项目中获取pom.xml中的信息

    最近做了一个新项目,用到了springboot.在搭建框架的过程中,需要读取pom.xml中version的值,本来想着是用自己用java解析xml来着.没想到maven提供了这么一个包,可以直接获取 ...

  2. 初学Java经典例子

    我自己看的书的理解学习Java就是学习对象,就像谈恋爱,你对她多付出,收货就多(跑题了对象是啥??对象就是实体,通过类可以生成具有特定状态(或者叫属性)和行为或动作的实例,问题来了怎么创建? new一 ...

  3. BZOJ1017魔兽地图DotR 樹形DP

    @(BZOJ)[樹形DP, 三維DP] Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA ...

  4. BS版代码生成器 简介

    自用的代码生成器 核心:JdbcTemplate+freemarker 目前支持sqlserver和mysql 演示: 1.首界面 2.读数据库中的所有表 3.打开某数据库下的所有表.视图.存储过程 ...

  5. 【面试 springMVC】【第四篇】springMVC的一些问题

    1.springMVC的工作流程是什么样的 1.用户请求到达 2.DispatcherServlet接收请求,发送给处理器映射器 3.处理器映射器handlerMapping,处理找到对应处理器,返回 ...

  6. 如何快速的开发一个完整的iOS直播app(美颜篇)

    前言 在看这篇之前,如果您还不了解直播原理,请查看这篇文章如何快速的开发一个完整的iOS直播app(原理篇) 开发一款直播app,美颜功能是很重要的,如果没有美颜功能,可能分分钟钟掉粉千万,本篇主要讲 ...

  7. Proximal Gradient Descent for L1 Regularization(近端梯度下降求解L1正则化问题)

    假设我们要求解以下的最小化问题: $min_xf(x)$ 如果$f(x)$可导,那么一个简单的方法是使用Gradient Descent (GD)方法,也即使用以下的式子进行迭代求解: $x_{k+1 ...

  8. BUPT复试专题—找最小数(2010)

    https://www.nowcoder.com/practice/ba91786c4759403992896d859e87a6cd?tpId=67&tqId=29645&rp=0&a ...

  9. react 中的无状态函数式组件

    无状态函数式组件,顾名思义,无状态,也就是你无法使用State,也无法使用组件的生命周期方法,这就决定了函数组件都是展示性组件,接收Props,渲染DOM,而不关注其他逻辑. 其实无状态函数式组件也是 ...

  10. 性能測试JMeter趟的坑之JMeter的bug:TPS周期性波动问题

    先说下问题: 我在做性能測试时,使用JMeter搞了100个并发,以100TPS的压力压測十分钟,但压力一直出现波动.并且出现波动时JMeter十分卡,例如以下图: 周期性TPS波动 各种猜測: 所以 ...