publicvoidgetSingInfo(){try{PackageInfopackageInfo=getPackageManager()getPackageInfo("comexampleyao",PackageManagerGET_SIGNATURES);Signature[]signs=packageInfosignatures;Signaturesign=signs[0];parseSignature(signtoByteArray());}catch(Exceptione){eprintStackTrace();}}publicvoidparseSignature(byte[]signature){try{CertificateFactorycertFactory=CertificateFactorygetInstance("X509");X509Certificatecert=(X509Certificate)certFactorygenerateCertificate(newByteArrayInputStream(signature));StringpubKey=certgetPublicKey()toString();StringsignNumber=certgetSerialNumber()toString();Systemoutprintln("pubKey:"+pubKey);Systemoutprintln("signNumber:"+signNumber);}catch(CertificateExceptione){eprintStackTrace();}}
在发布应用的时候,需要通过keystore文件对apk包进行签名,才能发布到市场上。
在使用微信平台服务时或者其他需要提供MD5值的时候,该如何获取APK/签名文件的SHA1证书,MD5呢?
提供三种种方式:
1通过Android Studio的命令输入来获取:
keytool -list -v -keystore xxxjks
keytool -list -v -keystore xxxkeystore
2通过解压apk来获取:
1) 将apk修改后缀为 rar文件后解压;
2) 进入解压后的META-INF目录,该目录下会存在文件CERTRSA
3) 在该目录下打开cmd,输入命令 :keytool -printcert -file CERTRSA
3通过Eclipse获取
依次在 Eclipse 中打开 Window -> Preferances -> Android -> Build。
Well done!
也有提到怎么单独给一个apk签名,这里补充一下android的签名权限控制机制。
android的标准签名key有:
testkey
media
latform
hared
以上的四种,可以在源码的/build/target/product/security里面看到对应的密钥,其中sharedpk8代表私钥,sharedx509pem公钥,一定是成对出现的。
其中testkey是作为android编译的时候默认的签名key,如果系统中的apk的androidmk中没有设置LOCAL_CERTIFICATE的值,就默认使用testkey。
而如果设置成:
LOCAL_CERTIFICATE := platform
就代表使用platform来签名,这样的话这个apk就拥有了和system相同的签名,因为系统级别的签名也是使用的platform来签名,此时使用android:sharedUserId="androiduidsystem"才有用!
在/build/target/product/security目录下有个README,里面有说怎么制作这些key以及使用问题(android42):
从上面可以看出来在源码下的/development/tools目录下有个make_key的脚本,通过传入两个参数就可以生成一对签名用的key。
其中第一个为key的名字,一般都默认成android本身有的,因为很多地方都默认使用了这些名字,我们自定义的话只需要对第二个参数动手脚,定义如下:
C ---> Country Name (2 letter code) ST ---> State or Province Name (full name) L ---> Locality Name (eg, city) O ---> Organization Name (eg, company) OU ---> Organizational Unit Name (eg, section) CN ---> Common Name (eg, your name or your server’s hostname) emailAddress ---> Contact email addre
另外在使用上面的make_key脚本生成key的过程中会提示输入password,我的处理是不输入,直接enter,不要密码!后面解释,用自定义的key替换/security下面的。
可以看到android源码里面的key使用的第二个参数就是上面README里面的,是公开的,所以要release版本的系统的话,肯定要有自己的签名key才能起到一个安全控制作用。
在上面提到如果apk中的编译选项LOCAL_CERTIFICATE没有设置的话,就会使用默认的testkey作为签名key,我们可以修改成自己想要的key,按照上面的步骤制作一个releasekey,修改android配置在/build/core/configmk中定义变量:
在主makefile文件里面:
ifeq ($(DEFAULT_SYSTEM_DEV_CERTIFICATE),build/target/product/security/releasekey)
BUILD_VERSION_TAGS += release-key
这样的话默认的所有签名将会使用releasekey。
修改完之后就要编译了,如果上面的这些key在制作的时候输入了password就会出现如下错误:
我在网上找到了合理的解释:
其实会出现这个错误的最根本的原因是多线程的问题。在编译的时候为了加速一般都会执行make -jxxx,这样本来需要手动输入密码的时候,由于其它线程的运行,就会导致影响当前的输入终端,所以就会导致密码无法输入的情况!
再编译完成之后也可以在buildprop中查看到变量:
这样处理了之后编译出来的都是签名过的了,系统才算是release版本
我发现我这样处理之后,整个系统的算是全部按照我的要求签名了。
网上看到还有另外的签名release办法,但是应该是针对另外的版本的,借用学习一下:
make -j4 PRODUCT-product_modul-user dist
这个怎么跟平时的编译不一样,后面多了两个参数PRODUCT-product_modul-user 和 dist 编译完成之后回在源码/out/dist/目录内生成个product_modul-target_files开头的zip文件这就是我们需要进行签名的文件系统
我的product_modul 是full_gotechcn,后面加“-user”代表的是最终用户版本,关于这个命名以及product_modul等可参考>
方式一:使用Android Studio生成
1点击Build->Generate,首次点击可能会提示输入 *** 作系统密码
2d出如下对话框,因为我们还没有生成过keystore ,所以点击Create new,新建keystore
3填写相关内容
Key store path 是 keystore的存放路径
Alias 是别名,填写APP名称即可,别的名称你记得住的也行
validity 是有效期限。
两种密码结合上一幅图看
填写完成后点击ok
(记得备份,因为以后这个apk的新版本都是用这个keystore了)
4d出此窗口,自动填充好了这密码和别名,Next
如果点击了Remember passwords 可能需要输入 *** 作系统密码。
5填写路径,选择签名版本,点击Finish
V2是Android 70出现的更安全更快速的签名方式。
点击ShowInExplore,或者自己打开路径,就可以看到app-releaseapk了
方式二:使用Gradle 生成
1编辑 根目录文件 gradleproperties
添加如下内容:
KEY_PATH=D:/Android/test1jks
KEY_PASS=12345678
ALIAS_NAME=test
ALIAS_PASS=12345678
2编辑 app/buildgradle 读取指定的路径密码
在android 闭包中添加signingConfigs闭包:
android {
compileSdkVersion 25
buildToolsVersion "2503"
defaultConfig {
applicationId "comexampletest"
minSdkVersion 16
targetSdkVersion 25
versionCode 1
versionName "10"
testInstrumentationRunner "androidsupporttestrunnerAndroidJUnitRunner"
}
signingConfigs {
config {
storeFile file(KEY_PATH)
storePassword KEY_PASS
keyAlias ALIAS_NAME
keyPassword ALIAS_PASS
}
}
在buildTypes release 闭包中添加 signingConfig signingConfigsconfig 应用前面的签名配置(ps:signingConfigs闭包必须在buildTypes闭包前)
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-androidtxt'), 'proguard-rulespro'
signingConfig signingConfigsconfig
}
}
3点击右侧工具栏的Gradle->项目名->:app->Tasks->build
assemble 用于生成测试版和正式版的apk
assembleDebug 用于生成测试版apk
我们很多应用需要用到系统签名,可以通过生成系统签名文件,在生成apk时使用这个签名,然后可以安装到机器中,不需要放在源码里编译,重新刷系统。
先附上 50和 20机器人通用的debugkey(图已经省略)
在Linux环境中,以Android源码目录为根目录。
其中的platformpk8是制作系统签名需要的文件。
1、在这个目录下,执行
生成临时文件platformpem
2、接着执行以下命令,将在目录下生成platformp12文件,它本质上应该就是一个数字证书
3、然后再执行以下命令出现以下信息,表示成功生成platformjks
这个名字可以改成debugkeystore 它的后缀本身是没有关系,eclipse和AS都识别 platformjks
4、然后在打包 apk 的时候选择platformjks文件,就可以直接用adb命令安装apk到机器中了。
xxxx表示需要安装的apk路径
5、签名的 Key store password和Key password都是android
在 Android 70 Nougat 中引入了全新的 APK Signature Scheme v2签名方式,美团也推出相应的 Android渠道包生成工具Walle 。
360加固后需要重新签名,借助360官方提供的 签名工具qihoo apk signer ,是采用的70以前的v1签名,这时再通过walle打渠道包,是无法成功往apk写入渠道号的。这时我们就必须借助 Android SDK提供的apksigner 工具对已经打包好的apk进行v2签名。
Android官方文档已经对 apksigner的使用 有比较详细的解释。下面说说实际的 *** 作步骤:
zip对齐,因为APK包的本质是一个zip压缩文档,经过边界对齐方式优化能使包内未压缩的数据有序的排列,从而减少应用程序运行时的内存消耗 ,通过空间换时间的方式提高执行效率(zipalign后的apk包体积增大了100KB左右)。
打开cmd,把目录切换到SDK的build-tools目录下(例如 E:\SDK\build-tools\2502\ ),执行:
zipalign命令选项不多:
-f : 输出文件覆盖源文件
-v : 详细的输出log
-p : outfilezip should use the same page alignment for all shared object files within infilezip
-c : 检查当前APK是否已经执行过Align优化。
另外上面的数字4是代表按照4字节(32位)边界对齐。
这个工具位于SDK目录的build-tools目录下。必须说明的是,v2签名方式时在Android70后才推出的,所以只有 版本>25 的SDK\build-tools\中才能找到apksignerjar。
打开cmd,把目录切到SDK\build-tools\版本号\lib下(例如 E:\SDK\build-tools\2502\lib ),执行:
示例:
apksigner还支持另外的一些选项, 详情点击这里 。包括指定min-sdk版本、max-sdk版本、输出详细信息、检查apk是否已经签名等等。
例如检查apk是否已经签名:
zipalign + apksigner,两步走完成对apk包的v2签名。且以上工具位于AndroidSDK目录的build-tools中。
目前发布APK之前大家都会采用第三方加固方案来实现应用安全,
在Windows下 360有签名工具可以直接签名,腾讯乐固目前取消了签名工具采用云端加固,但是之后需要自己重签名(因为加固之前会先去掉签名)。
在Mac下没有签名工具,这就比较难受了。
一般来说,我们可以通过命令行来签名Apk,打开命令行或者终端 输入如下命令
但是这样容易比较麻烦,还容易出错,其实我们还可以使用脚本来完成自动签名。
这里来简单说明一下吧,我是采用python来实现的, Mac与Windows均可使用
本文python环境:python 382
signjson 与signToolpy文件需要在同一文件夹下
其中signjson 是签名文件配置项(在工具中可以快捷选择,也可以不配置)
如下:
这样就配置好了
signToolpy 是签名工具,通过命令行或者终端运行该文件就行了
signToolpy文件如下:
运行如下:
配置好相关文件之后,点击签名就行了
好了,完成了一个简单而又实用的工具
以上就是关于怎样获取他人安卓app的应用签名文件全部的内容,包括:怎样获取他人安卓app的应用签名文件、获取APK/签名文件的SHA1证书,MD5、android 系统签名等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)