基于android-11.0.0_r39,系统应用的手动签名方法和过程

简介: 本文介绍了基于Android 11.0.0_r39版本进行系统应用手动签名的方法和解决签名过程中遇到的错误,包括处理`no conscrypt_openjdk_jni-linux-x86_64`和`RegisterNatives failed`的问题。

片头

  • 基于android-11.0.0_r39
  • 这个版本签名工具的路径和之前android 9 的相比,有变化,操作过程及记录如下

1. 签名的命令

szhou@Android:~/aosp_works/aosp$ java -jar -Djava.library.path="/home/szhou/aosp_works/aosp/out/host/linux-x86/lib64/"  out/soong/host/linux-x86/framework/signapk.jar  myapk/platform.x509.pem myapk/platform.pk8 myapk/app-debug.apk myapk/app-debug-signed.apk

.

2. 签名的过程及错误

2.1 no conscrypt_openjdk_jni-linux-x86_64

szhou@Android:~/aosp_works/aosp$ java -jar -Djava.library.path="/home/szhou/aosp_works/aosp/out/host/linux-x86/lib64/"  out/soong/host/linux-x86/framework/signapk.jar  myapk/platform.x509.pem myapk/platform.pk8 myapk/app-debug.apk myapk/app-debug-signed.apk
Exception in thread "main" java.lang.UnsatisfiedLinkError: no conscrypt_openjdk_jni-linux-x86_64 in java.library.path: [/home/szhou/aosp_works/aosp/out/host/linux-x86/lib64/]
        at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2660)
        at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:829)
        at java.base/java.lang.System.loadLibrary(System.java:1867)
        at org.conscrypt.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:54)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at org.conscrypt.NativeLibraryLoader$1.run(NativeLibraryLoader.java:297)
        at org.conscrypt.NativeLibraryLoader$1.run(NativeLibraryLoader.java:289)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at org.conscrypt.NativeLibraryLoader.loadLibraryFromHelperClassloader(NativeLibraryLoader.java:289)
        at org.conscrypt.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:262)
        at org.conscrypt.NativeLibraryLoader.load(NativeLibraryLoader.java:162)
        at org.co

szhou@Android:~/aosp_works/aosp$ cp prebuilts/sdk/tools/linux/lib64/libconscrypt_openjdk_jni.so /home/szhou/aosp_works/aosp/out/host/linux-x86/lib64/
szhou@Android:~/aosp_works/aosp$

.

2.2 RegisterNatives failed for ‘org/conscrypt/NativeCrypto’

  • aosp源码下有好几个libconscrypt_openjdk_jni.so
  • 若复制的SO不正确,就会出现此错误,这个时候只需要查找aosp目录下的libconscrypt_openjdk_jni.so,即可找到正确的
szhou@Android:~/aosp_works/aosp$ cp prebuilts/sdk/tools/linux/lib64/libconscrypt_openjdk_jni.so /home/szhou/aosp_works/aosp/out/host/linux-x86/lib64/
szhou@Android:~/aosp_works/aosp$ java -jar -Djava.library.path="/home/szhou/aosp_works/aosp/out/host/linux-x86/lib64/"  out/soong/host/linux-x86/framework/signapk.jar  myapk/platform.x509.pem myapk/platform.pk8 myapk/app-debug.apk myapk/app-debug-signed.apk
FATAL ERROR in native method: RegisterNatives failed for 'org/conscrypt/NativeCrypto'; aborting...
        at java.lang.ClassLoader$NativeLibrary.load0(java.base@11.0.4/Native Method)
        at java.lang.ClassLoader$NativeLibrary.load(java.base@11.0.4/ClassLoader.java:2430)
        at java.lang.ClassLoader$NativeLibrary.loadLibrary(java.base@11.0.4/ClassLoader.java:2487)
        - locked <0x0000000455c07640> (a java.util.HashSet)
        at java.lang.ClassLoader.loadLibrary0(java.base@11.0.4/ClassLoader.java:2684)
        at java.lang.ClassLoader.loadLibrary(java.base@11.0.4/ClassLoader.java:2649)
        at java.lang.Runtime.loadLibrary0(java.base@11.0.4/Runtime.java:829)
        - locked <0x0000000455c07aa0> (a java.lang.Runtime)
        at java.lang.System.loadLibrary(java.base@11.0.4/System.java:1867)
        at org.conscrypt.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:54)
        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(java.base@11.0.4/Native Method)
        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(java.base@11.0.4/NativeMethodAccessorImpl.java:62)
        at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(java.base@11.0.4/DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(java.base@11.0.4/Method.java:566)
        at org.conscrypt.NativeLibraryLoader$1.run(NativeLibraryLoader.java:297)
        at org.conscrypt.NativeLibraryLoader$1.run(NativeLibraryLoader.java:289)
        at java.security.AccessController.doPrivileged(java.base@11.0.4/Native Method)
        at org.conscrypt.NativeLibraryLoader.loadLibraryFromHelperClassloader(NativeLibraryLoader.java:289)
        at org.conscrypt.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:262)
        at org.conscrypt.NativeLibraryLoader.load(NativeLibraryLoader.java:162)
        at org.conscrypt.NativeLibraryLoader.loadFirstAvailable(NativeLibraryLoader.java:106)
        at org.conscrypt.NativeCryptoJni.init(NativeCryptoJni.java:50)
        at org.conscrypt.NativeCrypto.<clinit>(NativeCrypto.java:63)
        at org.conscrypt.OpenSSLProvider.<init>(OpenSSLProvider.java:58)
        at org.conscrypt.OpenSSLProvider.<init>(OpenSSLProvider.java:51)
        at org.conscrypt.OpenSSLProvider.<init>(OpenSSLProvider.java:47)
        at com.android.signapk.SignApk.main(SignApk.java:1038)
已放弃 (核心已转储)
szhou@Android:~/aosp_works/aosp$

2.3 查找正确的libconscrypt_openjdk_jni.so

  • 从之前经验,必须使用编译时生成的,也就是soong下的这个
  • 若有不确定,逐个复制到out/host/linux-x86/lib64/目录下测试即可
szhou@Android:~/aosp_works/aosp/out$ find . -name libconscrypt_openjdk_jni.so
./soong/.intermediates/external/conscrypt/libconscrypt_openjdk_jni/linux_glibc_x86_64_shared/libconscrypt_openjdk_jni.so
./soong/host/linux-x86/lib64/libconscrypt_openjdk_jni.so
./host/linux-x86/lib64/libconscrypt_openjdk_jni.so
szhou@Android:~/aosp_works/aosp/out$ cp ./soong/.intermediates/external/conscrypt/libconscrypt_openjdk_jni/linux_glibc_x86_64_shared/libconscrypt_openjdk_jni.so^C
szhou@Android:~/aosp_works/aosp/out$ cd .. 
szhou@Android:~/aosp_works/aosp$ cp ./soong/.intermediates/external/conscrypt/libconscrypt_openjdk_jni/linux_glibc_x86_64_shared/libconscrypt_openjdk_jni.so /home/szhou/aosp_works/aosp/out/host/linux-x86/lib64/
cp: 无法获取'./soong/.intermediates/external/conscrypt/libconscrypt_openjdk_jni/linux_glibc_x86_64_shared/libconscrypt_openjdk_jni.so' 的文件状态(stat): 没有那个文件或目录
szhou@Android:~/aosp_works/aosp$ cp ./out/soong/.intermediates/external/conscrypt/libconscrypt_openjdk_jni/linux_glibc_x86_64_shared/libconscrypt_openjdk_jni.so /home/szhou/aosp_works/aosp/out/host/linux-x86/lib64/
szhou@Android:~/aosp_works/aosp$ java -jar -Djava.library.path="/home/szhou/aosp_works/aosp/out/host/linux-x86/lib64/"  out/soong/host/linux-x86/framework/signapk.jar  myapk/platform.x509.pem myapk/platform.pk8 myapk/app-debug.apk myapk/app-debug-signed.apk

3. 查看APK的签名

szhou@Android:~/aosp_works/aosp$ keytool 
密钥和证书管理工具

命令:

 -certreq            生成证书请求
 -changealias        更改条目的别名
 -delete             删除条目
 -exportcert         导出证书
 -genkeypair         生成密钥对
 -genseckey          生成密钥
 -gencert            根据证书请求生成证书
 -importcert         导入证书或证书链
 -importpass         导入口令
 -importkeystore     从其他密钥库导入一个或所有条目
 -keypasswd          更改条目的密钥口令
 -list               列出密钥库中的条目
 -printcert          打印证书内容
 -printcertreq       打印证书请求的内容
 -printcrl           打印 CRL 文件的内容
 -storepasswd        更改密钥库的存储口令

使用 "keytool -?, -h, or --help" 可输出此帮助消息
使用 "keytool -command_name --help" 可获取 command_name 的用法。
使用 -conf <url> 选项可指定预配置的选项文件。
szhou@Android:~/aosp_works/aosp$ keytool  -printcert -jarfile myapk/app-debug-signed.apk 
签名者 #1:

签名:

所有者: EMAILADDRESS=android@android.com, CN=Android, OU=Android, O=Android, L=Mountain View, ST=California, C=US
发布者: EMAILADDRESS=android@android.com, CN=Android, OU=Android, O=Android, L=Mountain View, ST=California, C=US
序列号: ff0641323cf95512
生效时间: Tue Dec 23 14:43:41 CST 2014, 失效时间: Sat May 10 14:43:41 CST 2042
证书指纹:
         SHA1: 41:79:1C:9B:8F:AF:15:XX:AC:D5:AA:F5:92:10:XX:42:46:7D:82:77
         SHA256: 2D:37:0C:21:XX:DF:D5:53:D2:A7:96:31:4B:XX:92:5F:B3:8A:DE:EF:XX:86:4C:92:0B:BB:BB:12:88:7D:XX:XX
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3

扩展: 

#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 22 XX B8 1B XX 57 D6 4A   85 82 6D 0F 8D 54 31 78  "....W.J..m..T1x
0010: 64 A4 CF 0A                                        d...
]
]

#2: ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
  CA:true
  PathLen:2147483647
]

#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 22 F8 B8 1B C8 XX D6 4A   85 82 6D 0F 8D XX 31 78  "....W.J..m..T1x
0010: 64 A4 CF 0A                                        d...
]
]


szhou@Android:~/aosp_works/aosp$ java -jar -Djava.library.path="/home/szhou/aosp_works/aosp/out/host/linux-x86/lib64/"  out/soong/host/linux-x86/framework/signapk.jar  myapk/platform.x509.pem myapk/platform.pk8 myapk/app-debug.apk myapk/app-debug-signed.apk

.

4. 结束语

走过路过,有用到的,记得给点个赞哈~

相关文章
|
2天前
|
JSON API Android开发
探索安卓开发之旅:打造你的第一个天气应用
在这篇文章中,我们将一起踏上一段激动人心的旅程,学习如何在安卓平台上开发一个简单的天气应用。通过实际操作和代码示例,我们将逐步构建一个能够显示当前位置天气情况的应用。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供清晰的指导和启发性的见解,帮助你理解和掌握安卓开发的基础知识。让我们一起探索代码的世界,解锁新技能,实现你的创意和梦想。
|
1天前
|
IDE Android开发 iOS开发
探索安卓与iOS系统的技术差异:开发者的视角
本文深入分析了安卓(Android)与苹果iOS两大移动操作系统在技术架构、开发环境、用户体验和市场策略方面的主要差异。通过对比这两种系统的不同特点,旨在为移动应用开发者提供有价值的见解,帮助他们在不同平台上做出更明智的开发决策。
|
1天前
|
Ubuntu Shell API
Ubuntu 64系统编译android arm64-v8a 的openssl静态库libssl.a和libcrypto.a
Ubuntu 64系统编译android arm64-v8a 的openssl静态库libssl.a和libcrypto.a
|
6天前
|
安全 Java API
Java 泛型在安卓开发中的应用
在Android开发中,Java泛型广泛应用于集合类、自定义泛型类/方法、数据绑定、适配器及网络请求等场景,有助于实现类型安全、代码复用和提高可读性。例如,结合`ArrayList`使用泛型可避免类型转换错误;自定义泛型类如`ApiResponse&lt;T&gt;`可处理不同类型API响应;RecyclerView适配器利用泛型支持多种视图数据;Retrofit结合泛型定义响应模型,明确数据类型。然而,需注意类型擦除导致的信息丢失问题。合理使用泛型能显著提升代码质量和应用健壮性。
|
2天前
|
XML 数据可视化 Android开发
Android应用界面
Android应用界面中的布局和控件使用,包括相对布局、线性布局、表格布局、帧布局、扁平化布局等,以及AdapterView及其子类如ListView的使用方法和Adapter接口的应用。
8 0
Android应用界面
|
13天前
|
监控 安全 Java
Kotlin 在公司上网监控中的安卓开发应用
在数字化办公环境中,公司对员工上网行为的监控日益重要。Kotlin 作为一种基于 JVM 的编程语言,具备简洁、安全、高效的特性,已成为安卓开发的首选语言之一。通过网络请求拦截,Kotlin 可实现网址监控、访问时间记录等功能,满足公司上网监控需求。其简洁性有助于快速构建强大的监控应用,并便于后续维护与扩展。因此,Kotlin 在安卓上网监控应用开发中展现出广阔前景。
11 1
|
5月前
|
移动开发 安全 Android开发
构建高效Android应用:Kotlin协程的实践与优化策略
【5月更文挑战第30天】 在移动开发领域,性能优化始终是关键议题之一。特别是对于Android开发者来说,如何在保证应用流畅性的同时,提升代码的执行效率,已成为不断探索的主题。近年来,Kotlin语言凭借其简洁、安全和实用的特性,在Android开发中得到了广泛的应用。其中,Kotlin协程作为一种新的并发处理机制,为编写异步、非阻塞性的代码提供了强大工具。本文将深入探讨Kotlin协程在Android开发中的应用实践,以及如何通过协程优化应用性能,帮助开发者构建更高效的Android应用。
|
5月前
|
API 调度 Android开发
打造高效Android应用:探究Kotlin协程的优势与实践
【5月更文挑战第27天】在移动开发领域,性能优化和响应速度是衡量应用质量的关键因素。随着Kotlin语言的普及,协程作为其核心特性之一,为Android开发者提供了一种全新的并发处理方式。本文深入探讨了Kotlin协程在Android应用开发中的优势,并通过实例演示如何在实际项目中有效利用协程提升应用性能和用户体验。
|
5月前
|
移动开发 Android开发 开发者
构建高效Android应用:探究Kotlin协程的优势与实践
【5月更文挑战第21天】在移动开发领域,性能优化和流畅的用户体验是至关重要的。随着Kotlin语言在Android平台的广泛采纳,其并发处理的强大工具—协程(Coroutines),已成为提升应用响应性和效率的关键因素。本文将深入分析Kotlin协程的核心原理,探讨其在Android开发中的优势,并通过实例演示如何有效利用协程来优化应用性能,打造更加流畅的用户体验。
61 4
|
5月前
|
物联网 区块链 Android开发
构建高效Android应用:Kotlin与Jetpack的实践之路未来技术的融合潮流:区块链、物联网与虚拟现实的交汇点
【5月更文挑战第30天】 在移动开发领域,效率和性能始终是开发者追求的核心。随着技术的不断进步,Kotlin语言以其简洁性和现代化特性成为Android开发的新宠。与此同时,Jetpack组件为应用开发提供了一套经过实践检验的库、工具和指南,旨在简化复杂任务并帮助提高应用质量。本文将深入探索如何通过Kotlin结合Jetpack组件来构建一个既高效又稳定的Android应用,并分享在此过程中的最佳实践和常见陷阱。