第三方apk 系统签名

一、背景

    自己或者客户的第三方apk需要用到很多系统权限,所以要内置到系统目录下,变成系统自带的APP,如果不用系统文件生成的签名安装,会导致APP远程更新失败提示签名错误。

二、环境准备
1.Ubuntu系统(推荐1804版本及以上)

    安装JAVA-JDK11(如果已经有可以跳过)

    先检查JDK版本,不是11的话往下看

    java -version
 

    运行下面的命令安装Jdk11,要选择的地方选择Y,等待安装完成即可

    sudo apt install openjdk-11-jdk
 

2.Android系统源码一套

需要用到源码根目录以下几个文件
    
 - signapk.jar(系统路径:/out/host/linux-x86/framework/signapk.jar )
 - libconscrypt_openjdk_jni.so (系统路径:/out/soong/host/linux-x86/lib64/libconscrypt_openjdk_jni.so)
 - platform.pk8 (系统路径:build/target/product/security)
 - platform.x509.pem (系统路径:build/target/product/security)

 另外需要准备不带签名的第三方APK文件
 - Test.apk

3.操作步骤

    将第2步的libconscrypt_openjdk_jni.so文件改名为:conscrypt_openjdk_jni-windows-x86_64.so

    在ubuntu新建一个文件夹apk_sign,将第2步列举的文件都放进去

    执行命令

    java -Djava.library.path=. -jar signapk.jar platform.x509.pem platform.pk8 Test.apk signed.apk
 

    这步会生成一个文件叫signed.apk,就是已经完成系统签名的APK,但是这个是一次性的,下面继续介绍生成证书的步骤

    依次执行下面的命令
    1.生成shared.priv.pem 文件

    openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out shared.priv.pem -nocrypt
        1

    2.生成shared.pk12文件

    openssl pkcs12 -export -in platform.x509.pem -inkey shared.priv.pem -out shared.pk12 -name bubble
 

    3.生成jks 或者 keystone文件

    keytool -importkeystore -deststorepass android -destkeypass  android -destkeystore bubble.jks -srckeystore shared.pk12 -srcstoretype PKCS12 -srcstorepass android -alias bubble
 

    生成的bundle.jks拷贝到app源代码目录下,并在app文件夹下面的build.gradle加入以下配置

   android{
        signingConfigs {
            release {
                keyAlias 'bubble'
                keyPassword 'android'
                storePassword 'android'
                storeFile file('../keystore/bubble.jks')
            }
        }
    }

编译生成的APK就可以放到系统目录下正常使用了
三、报错提示

    没有openssl环境

Exception in thread "main" java.lang.ExceptionInInitializerError
        at org.conscrypt.OpenSSLBIOInputStream.<init>(OpenSSLBIOInputStream.java:34)
        at org.conscrypt.OpenSSLX509Certificate.fromX509PemInputStream(OpenSSLX509Certificate.java:119)
        at org.conscrypt.OpenSSLX509CertificateFactory$1.fromX509PemInputStream(OpenSSLX509CertificateFactory.java:220)
        at org.conscrypt.OpenSSLX509CertificateFactory$1.fromX509PemInputStream(OpenSSLX509CertificateFactory.java:216)
        at org.conscrypt.OpenSSLX509CertificateFactory$Parser.generateItem(OpenSSLX509CertificateFactory.java:94)
        at org.conscrypt.OpenSSLX509CertificateFactory.engineGenerateCertificate(OpenSSLX509CertificateFactory.java:272)
        at java.security.cert.CertificateFactory.generateCertificate(CertificateFactory.java:339)
        at com.android.signapk.SignApk.readPublicKey(SignApk.java:184)
        at com.android.signapk.SignApk.main(SignApk.java:1007)
Caused by: java.lang.IllegalArgumentException: Failed to load any of the given libraries: [conscrypt_openjdk_jni-linux-x86_64, conscrypt_openjdk_jni-linux-x86_64-fedora, conscrypt_openjdk_jni]
        at org.conscrypt.NativeLibraryLoader.loadFirstAvailable(NativeLibraryLoader.java:160)
        at org.conscrypt.NativeCryptoJni.init(NativeCryptoJni.java:49)
        at org.conscrypt.NativeCrypto.<clinit>(NativeCrypto.java:53)
Exception in thread "main" java.lang.ExceptionInInitializerError
        at org.conscrypt.OpenSSLBIOInputStream.<init>(OpenSSLBIOInputStream.java:34)
        at org.conscrypt.OpenSSLX509Certificate.fromX509PemInputStream(OpenSSLX509Certificate.java:119)
        at org.conscrypt.OpenSSLX509CertificateFactory$1.fromX509PemInputStream(OpenSSLX509CertificateFactory.java:220)
        at org.conscrypt.OpenSSLX509CertificateFactory$1.fromX509PemInputStream(OpenSSLX509CertificateFactory.java:216)
        at org.conscrypt.OpenSSLX509CertificateFactory$Parser.generateItem(OpenSSLX509CertificateFactory.java:94)
        at org.conscrypt.OpenSSLX509Certificat

在这里插入图片描述

    JDK版本不对,升级到1.8+,推荐11

Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError:
com/android/signapk/SignApk has been
compiled by a more recent version of the Java Runtime (class file version 53.0),
this version of the Java Runtime only recognizes class file versions up to 52.0

在这里插入图片描述

    缺少conscrypt_openjdk_jni-windows-x86_64.so文件(系统文件libconscrypt_openjdk_jni.so改名而来)

Exception in thread "main" java.lang.UnsatisfiedLinkError:
 no conscrypt_openjdk_jni-linux-x86_64 in java.library.path:
 [/usr/java/packages/lib, /usr/lib/x86_64-linux-gnu/jni, /lib/x86_64-linux-gnu, /usr/lib/x86_64-linux-gnu, /usr/lib/jni, /lib, /usr/lib]

 

                        
原文链接:https://blog.csdn.net/qq_42071369/article/details/131666399

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值