Android Studio自动生成带系统签名的apk
介绍签名的两种方式:
1、signapk.jar命令行方式:
如果你需要开发一个带有系统权限的app,往往需要配置SharedUserId,比如:
- </pre><pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.cxq.signdemo"
- android:sharedUserId="android.uid.shell">
- <application
- android:allowBackup="true"
- android:icon="@mipmap/ic_launcher"
- android:label="@string/app_name"
- android:supportsRtl="true"
- android:theme="@style/AppTheme">
- <activity android:name=".MainActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </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的更多相关文章
- Android Studio自动生成UML关系类图
android studio 根据源码自动生成UML的插件介绍http://www.jianshu.com/p/cbccd831cf01 simpleumlhttps://plugins.jetbra ...
- Android Studio 自动生成 Java Doc
Android Studio 生成 Java Doc 出现"编码GBK的不可映射字符"问题 错误的解决方案,复制粘贴一万遍也是错误的,下面是查找出来的,没有用的解决方案(还有几个, ...
- 【Android Studio安装部署系列】二十二、Android studio自动生成set、get方法
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 操作步骤 将光标放置我们所要生成get,set方法的实体类空白处——然后右键——选择Generate. 选择“Getter and Set ...
- Android Studio 打包生成apk
打开AndroidStudio,并且打开想要生成apk文件的项目 点击工具栏上面的“Builder” 点击“Builder”之后在下拉菜单里面可以看到“Genarate Singed APK”,点 ...
- Android Studio 打包生成正式apk(XXX-release.apk)的两种方式
{ 方式一:使用Android Studio生成1.点击Build->Generate Signed apk,首次点击可能会提示输入操作系统密码2.弹出如下对话框,还没有生成过keystore ...
- Android AIDL自动生成Java文件测试
/******************************************************************************** * Android AIDL自动生成 ...
- Android Studio环境下代码混淆+签名打包
Android Studio环境下代码混淆+签名打包 作者 Mr_冯先生 关注 2016.08.21 01:10 字数 1040 阅读 734评论 5喜欢 34 注:本文使用的Android Stud ...
- (转载) Android studio如何生成aar包
Android studio如何生成aar包 标签: Android studio如何生成aaAndroid studio aarAndroid 如何生成aar包 2016-12-21 14:42 1 ...
- eclipse下Android无法自动生成apk文件怎么办?
eclipse下Android无法自动生成apk文件怎么办? 现象:创建android工程后,通过手动build/clean或自动build均无法在bin文件夹下生成.apk文件 解决方法:进入win ...
随机推荐
- 关于SIP一些总结
SIP(session Initiation protocol)会话初始协议,是应用层信令控制协议,主要应用于创建.修改.释放多媒体会话. 一般而言,SIP只负责不同UE之间的协商与通信,比如媒体能力 ...
- synchronized初识
作用域: 1.对象实例内--->People jack = new Jack(); ①此作用域内的synchronized锁 ,可以防止多个线程同时访问这个对象的synchronized方法 ② ...
- RMA Sales Order – Stuck with “Awaiting Return Disposition”
RMA Sales Order – Stuck with “Awaiting Return Disposition” Action : (Prod) ð Login to Unix ð su – ...
- 【gradle】mac下 gradle默认本地仓库位置
gradle默认会把包缓存到用户目录的.gradle目录下,如果你打开.gradle\caches\modules-2\files-2.1,你会发现很多的jar包.mac上的话 ,也就是在/Users ...
- 怎么下载google商店的扩展程序?
首先,你有机会进入到了外网! 浏览器输入:chrome://extensions 复制唯一的ID进入:http://crx.2333.me/ ,然后下载即可!
- [Python-MATLAB] 在Python中调用MATLAB的API
可以参考官方的说明文档: http://cn.mathworks.com/help/matlab/matlab_external/get-started-with-matlab-engine-for- ...
- Vue生命周期方法。
- MapReduce简述、工作流程及新旧API对照
什么是MapReduce? 你想数出一摞牌中有多少张黑桃.直观方式是一张一张检查而且数出有多少张是黑桃. MapReduce方法则是: 1. 给在座的全部玩家中分配这摞牌. 2. 让每一个玩家数自己手 ...
- POJ 1703 Find them, Catch them(种类并查集)
题目链接 这种类型的题目以前见过,今天第一次写,具体过程,还要慢慢理解. #include <cstring> #include <cstdio> #include <s ...
- python day - 8 文件
文件的相关操作 1.文件的两种路径 绝对路径:需要从根目录下一层一层往下去找,文件或者程序所在的地方,中间所经过的所有的路径到你要找的文件或程序,就是绝对路径. 相对路径:只需要将要找的文件或者程序, ...