基于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. 结束语

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

相关文章
|
3天前
|
开发框架 Android开发 iOS开发
探索安卓与iOS开发的差异:构建未来应用的指南
在移动应用开发的广阔天地中,安卓与iOS两大平台各占半壁江山。本文将深入浅出地对比这两大操作系统的开发环境、工具和用户体验设计,揭示它们在编程语言、开发工具以及市场定位上的根本差异。我们将从开发者的视角出发,逐步剖析如何根据项目需求和目标受众选择适合的平台,同时探讨跨平台开发框架的利与弊,为那些立志于打造下一个热门应用的开发者提供一份实用的指南。
14 5
|
1天前
|
Android开发 开发者 Kotlin
告别AsyncTask:一招教你用Kotlin协程重构Android应用,流畅度飙升的秘密武器
【9月更文挑战第13天】随着Android应用复杂度的增加,有效管理异步任务成为关键。Kotlin协程提供了一种优雅的并发操作处理方式,使异步编程更简单直观。本文通过具体示例介绍如何使用Kotlin协程优化Android应用性能,包括网络数据加载和UI更新。首先需在`build.gradle`中添加coroutines依赖。接着,通过定义挂起函数执行网络请求,并在`ViewModel`中使用`viewModelScope`启动协程,结合`Dispatchers.Main`更新UI,避免内存泄漏。使用协程不仅简化代码,还提升了程序健壮性。
7 1
|
9天前
|
XML Java Android开发
探索Android开发之旅:打造你的第一个应用
【9月更文挑战第4天】在这篇专为初学者设计的文章中,我们将一起踏上激动人心的Android开发之旅。从设置开发环境到实现一个简单的“Hello World”应用,每一步都充满了发现和学习。文章将引导你理解Android开发的基础知识,并鼓励你动手实践。让我们开始吧,创造你的第一款Android应用,开启技术世界的新篇章!
|
10天前
|
Android开发 UED 开发者
Android经典实战之WindowManager和创建系统悬浮窗
本文详细介绍了Android系统服务`WindowManager`,包括其主要功能和工作原理,并提供了创建系统悬浮窗的完整步骤。通过示例代码,展示了如何添加权限、请求权限、实现悬浮窗口及最佳实践,帮助开发者轻松掌握悬浮窗开发技巧。
26 1
|
11天前
|
存储 缓存 搜索推荐
打造个性化天气应用:Android 平台上的天气预报小助手
【9月更文挑战第2天】在这篇文章中,我们将一起探索如何从零开始构建一个简单却功能强大的天气应用。通过这个指南,你将学会如何在 Android 平台上使用 Java 编程语言和相关 API 来创建你自己的天气预报小助手。文章不仅提供了代码示例,还深入讨论了设计思路、用户界面优化以及数据管理等关键方面,旨在帮助初学者理解并实现一个完整的应用项目。
|
5天前
|
开发工具 Android开发 iOS开发
探索安卓与iOS开发的差异:构建未来应用的关键考量
在数字时代的浪潮中,安卓和iOS这两大操作系统如同双子星座般耀眼夺目,引领着移动应用的潮流。它们各自拥有独特的魅力和深厚的用户基础,为开发者提供了广阔的舞台。然而,正如每枚硬币都有两面,安卓与iOS在开发过程中也展现出了截然不同的特性。本文将深入剖析这两者在开发环境、编程语言、用户体验设计等方面的显著差异,并探讨如何根据目标受众和项目需求做出明智的选择。无论你是初涉移动应用开发的新手,还是寻求拓展技能边界的资深开发者,这篇文章都将为你提供宝贵的见解和实用的建议,帮助你在安卓与iOS的开发之路上更加从容自信地前行。
|
Java 调度 Android开发
android体系课-系统启动流程-之zygote进程启动过程源码分析
笔者刚开始学习Android的时候也和大部分同学一样,只会使用一些应用层面的知识,对于一些比较常见的开源框架如<mark>RxJava</mark>,<mark>OkHttp</mark>,<mark>Retrofit</mark>,以及后来谷歌推出的<mark>协程</mark>等,都只在使用层面,对于他们<mark>内部原理</mark>,基本没有去了解觉得够用就可以了,又比如Activity,Service等四大组件的使用原理,系统开机过程,Launcher启动过程等知之甚少,知其然而不知其所以然,结果就是出现某些问题,不知道从哪里找原因,只能依赖万能的百度,但是百度看多了,你会发现自己
|
Java 调度 Android开发
android体系课-系统启动流程-之SystemServer启动过程源码分析
笔者刚开始学习Android的时候也和大部分同学一样,只会使用一些应用层面的知识,对于一些比较常见的开源框架如<mark>RxJava</mark>,<mark>OkHttp</mark>,<mark>Retrofit</mark>,以及后来谷歌推出的<mark>协程</mark>等,都只在使用层面,对于他们<mark>内部原理</mark>,基本没有去了解觉得够用就可以了,又比如Activity,Service等四大组件的使用原理,系统开机过程,Launcher启动过程等知之甚少,知其然而不知其所以然,结果就是出现某些问题,不知道从哪里找原因,只能依赖万能的百度,但是百度看多了,你会发现自己