先把下面几个文件放到一个文件夹sign
1) /out/host/Linux-x86/framework/signapk.jar
2) /build/target/product/security/platform.x509.pem
3) /build/target/product/security/platform.pk8
在Linux环境下,进入到刚创建的sign文件夹,执行下面的命令
java -jar signapk.jar platform.x509.pem platform.pk8 unsign.apk signed.apk
恭喜你,报错啦!错误长这样子
Exception in thread "main" java.lang.UnsatisfiedLinkError: no conscrypt_openjdk_jni-linux-x86_64 in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)
at java.lang.Runtime.loadLibrary0(Runtime.java:871)
at java.lang.System.loadLibrary(System.java:1124)
at org.conscrypt.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:54)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.conscrypt.NativeLibraryLoader$1.run(NativeLibraryLoader.java:297)
at org.conscrypt.NativeLibraryLoader$1.run(NativeLibraryLoader.java:289)
at java.security.AccessController.doPrivileged(Native Method)
然后,你开始问度娘,度娘啊,杜十娘,额...不好意思咋还唱起歌来了
度娘告诉你,prebuilts/sdk/tools/linux/lib64/libconscrypt_openjdk_jni.so,把这个文件也放到sign目录下,然后执行
java -Djava.library.path=. -jar signapk.jar platform.x509.pem platform.pk8 unsign.apk signed.apk
然后,别人成功了,然而,我特么你特么又报错了,这次错误长这样
FATAL ERROR in native method: RegisterNatives failed for 'org/conscrypt/NativeCrypto'; aborting...
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1934)
- locked <0x0000000670f868b0> (a java.util.Vector)
- locked <0x0000000670fc3a98> (a java.util.Vector)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1850)
at java.lang.Runtime.loadLibrary0(Runtime.java:871)
- locked <0x0000000670f9a110> (a java.lang.Runtime)
at java.lang.System.loadLibrary(System.java:1124)
at org.conscrypt.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:54)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
于是你开始质问度娘,娘啊,你咋能坑你娃呢?然后度娘又告诉你,遇事不要慌,先发个朋友圈...
你先把unsigned.apk放到和out同级的目录下,执行下面的命令
java -Djava.library.path="out/host/linux-x86/lib64" -jar out/host/linux-x86/framework/signapk.jar build/target/product/security/platform.x509.pem build/target/product/security/platform.pk8 unsign.apk signed.apk
之后,你就会发现,unsign.apk同目录下出现了个signed.apk,成功了!!!
最后总结下我成功的办法,也就两步
1.把unsigned.apk放到和out同级的目录下
2.安卓10执行
java -Djava.library.path="out/host/linux-x86/lib64" -jar out/host/linux-x86/framework/signapk.jar build/target/product/security/platform.x509.pem build/target/product/security/platform.pk8 unsign.apk signed.apk
安卓11执行,两个的差别是路径不同了
java -Djava.library.path="out/soong/host/linux-x86/lib64" -jar out/soong/host/linux-x86/framework/signapk.jar build/target/product/security/platform.x509.pem build/target/product/security/platform.pk8 unsign.apk signed.apk
需要注意的是,安卓11签名的时候需要jdk9, 可以通过 ls /usr/lib/jvm/ 查看当前是否安装了jdk9
public2@80-28:~/work/11/alps$ ls /usr/lib/jvm/
java-1.8.0-openjdk-amd64 java-8-openjdk-amd64 jdk-9.0.1
如果没安装了,先安装;安装的,将11\alps\build\make\envsetup.sh中的默认值改成 1.9的
export ANDROID_JAVA_HOME=$(get_abs_build_var ANDROID_JAVA_HOME)
export JAVA_HOME=$ANDROID_JAVA_HOME
#export ANDROID_JAVA_TOOLCHAIN=$(get_abs_build_var ANDROID_JAVA_TOOLCHAIN)
#这个位置改成jdk9的路径
export ANDROID_JAVA_TOOLCHAIN=/usr/lib/jvm/jdk-9.0.1/bin
export ANDROID_PRE_BUILD_PATHS=$ANDROID_JAVA_TOOLCHAIN:
export PATH=$ANDROID_PRE_BUILD_PATHS$PATH
这样才可以签名成功