apk签名-signapk.jar
如果做平台app开发,需要签platform签名,除了通过adroid.bp或者android.mk的方式使用AOSP整个大工程中签名外,还可以直接通过signapk.jar的方式进行签名,效率更高更快捷简便。
首先我们来回顾下AOSP平台签名的办法。
Android.mk 使用LOCAL_CERTIFICATE宏定义,值为platform。
LOCAL_PATH:= $(call my-dir)########################################
# NCI Configuration
########################################
include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_SRC_FILES := \$(call all-java-files-under, src)LOCAL_SRC_FILES += \$(call all-java-files-under, nci)LOCAL_PACKAGE_NAME := NfcNci
LOCAL_CERTIFICATE := platformLOCAL_JNI_SHARED_LIBRARIES := libnfc_nci_jniLOCAL_JAVA_LIBRARIES := mediatek-telephony-baseLOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 com.nxp.nfcLOCAL_PROGUARD_ENABLED := disabledinclude $(BUILD_PACKAGE)include $(call all-makefiles-under,$(LOCAL_PATH))
android.bp 使用certificate标签,值写’platform"。
package {default_applicable_licenses: ["Android-Apache-2.0"],
}genrule {name: "statslog-Nfc-java-gen",tools: ["stats-log-api-gen"],cmd: "$(location stats-log-api-gen) --java $(out) --module nfc --javaPackage com.android.nfc"+ " --javaClass NfcStatsLog",out: ["com/android/nfc/NfcStatsLog.java"],
}// NCI Configuration
android_app {name: "NfcNci",srcs: ["src/**/*.java","nci/**/*.java",":statslog-Nfc-java-gen",],platform_apis: true,certificate: "platform",jni_libs: ["libnfc_nci_jni"],static_libs: ["androidx.appcompat_appcompat"],optimize: {enabled: false,},
}
以上两种方式需要进行前期整个编译系统工具链的编译准备工作,如果我们仅仅是为了快速签名,编码工作放置在Android studio工程里边进行。效率将大大提升。
准备工作:
我们只需要从在研Android工程中取得签名私钥和公钥进行签名。java 11环境。
- 公私密钥获取;
//build/target/product/目录
-rw-rw-r-- 1 user user 1218 May 6 09:48 bluetooth.pk8
-rw-rw-r-- 1 user user 1399 May 6 09:48 bluetooth.x509.pem
-rw-rw-r-- 1 user user 1217 May 6 09:48 media.pk8
-rw-rw-r-- 1 user user 1399 May 6 09:48 media.x509.pem
-rw-rw-r-- 1 user user 1219 May 6 09:50 networkstack.pk8
-rw-rw-r-- 1 user user 1399 May 6 09:50 networkstack.x509.pem
-rw-rw-r-- 1 user user 1218 May 6 09:47 platform.pk8
-rw-rw-r-- 1 user user 1399 May 6 09:47 platform.x509.pem
-rw-rw-r-- 1 user user 1219 May 6 09:47 releasekey.pk8
-rw-rw-r-- 1 user user 1399 May 6 09:47 releasekey.x509.pem
-rw-rw-r-- 1 user user 1217 May 6 09:49 sdk_sandbox.pk8
-rw-rw-r-- 1 user user 1399 May 6 09:49 sdk_sandbox.x509.pem
-rw-rw-r-- 1 user user 2662 Jun 12 12:06 shared.pk12
-rw-rw-r-- 1 user user 1217 May 6 09:48 shared.pk8
-rw-rw-r-- 1 user user 1399 May 6 09:48 shared.x509.pem
-rw-rw-r-- 1 user user 1217 Apr 19 16:56 testkey.pk8
-rw-rw-r-- 1 user user 1675 Apr 19 16:56 testkey.x509.pem
其中platform.pk8就是我们的私钥,platform.x509.pem就是我们的公钥。
- 签名工具signapk.jar包获取。
其也可以从Android项目工程里边获取到(这里以Android 13)为例,源码目录和编译结果。
// 源码目录
/build/tools/signapk/
-rw-rw-r-- 1 user user 1310 May 17 19:30 Android.bp
-rw-rw-r-- 1 user user 40 May 17 19:30 OWNERS
-rw-rw-r-- 1 user user 40 May 17 19:30 SignApk.mf
drwxrwxr-x 3 user user 4096 May 17 19:30 src
drwxrwxr-x 2 user user 4096 May 17 19:30 test// android.bp
//
// Copyright (C) 2008 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// the signapk tool (a .jar application used to sign packages)
// ============================================================
package {default_applicable_licenses: ["Android-Apache-2.0"],
}
java_binary_host {name: "signapk",srcs: ["src/**/*.java"],manifest: "SignApk.mf",static_libs: ["apksig","bouncycastle-unbundled","bouncycastle-bcpkix-unbundled","conscrypt-unbundled",],jni_libs: ["libconscrypt_openjdk_jni"],// The post-build signing tools need signapk.jar (and its shared libraries,// handled in their own Android.bp files)dist: {tag: ".jar",targets: ["droidcore"],},
}// 编译结果
/out/soong/host/linux-x86/framework/
-rw-rw-r-- 1 user user 991094 May 17 20:57 apksigner.jar
-rw-rw-r-- 1 user user 1839296 May 17 20:57 boot_signer.jar
-rw-rw-r-- 1 user user 5966938 May 17 20:53 d8.jar
-rw-rw-r-- 1 user user 243200 May 17 20:57 jarjar.jar
-rw-rw-r-- 1 user user 6799007 May 17 20:53 manifest-merger.jar
-rw-rw-r-- 1 user user 76636731 May 17 20:58 metalava.jar
-rw-rw-r-- 1 user user 1636347 May 17 20:58 sdkparcelables.jar
-rw-rw-r-- 1 user user 2966159 May 17 20:58 signapk.jar
-rw-rw-r-- 1 user user 5238302 May 17 20:58 turbine.jar
-rw-rw-r-- 1 user user 1834529 May 17 20:58 verity_signer.jar
-rw-rw-r-- 1 user user 120110 May 17 20:58 xsdc.jar/out/target/product/targetxxx_k419/obj/PACKAGING/otatools_intermediates/otatools/framework$ ls -l
total 7460
-rw-rw-r-- 1 user user 991094 May 17 20:58 apksigner.jar
-rw-rw-r-- 1 user user 1839296 May 17 20:58 boot_signer.jar
-rw-rw-r-- 1 user user 2966159 May 17 20:58 signapk.jar
-rw-rw-r-- 1 user user 1834529 May 17 20:58 verity_signer.jar
将jar包拷贝到本地。
- JAVA 11环境准备
本文不赘述,可自行查找文档。
签名过过程中,这里可能遇到一下几个报错。
1) java 8版本过低,signapk是在Android 13工程里边使用java 11编译的。需要将java环境切换到11环境。
user@swd:/local/sdb/src$ /usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar signapk.jar ./platform.x509.pem ./platform.pk8 Testdemo.apk Testdemo_signed.apk
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 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0at java.lang.ClassLoader.defineClass1(Native Method)at java.lang.ClassLoader.defineClass(ClassLoader.java:763)at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)at java.net.URLClassLoader.access$100(URLClassLoader.java:74)at java.net.URLClassLoader$1.run(URLClassLoader.java:369)at java.net.URLClassLoader$1.run(URLClassLoader.java:363)at java.security.AccessController.doPrivileged(Native Method)at java.net.URLClassLoader.findClass(URLClassLoader.java:362)at java.lang.ClassLoader.loadClass(ClassLoader.java:424)at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)at java.lang.ClassLoader.loadClass(ClassLoader.java:357)at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)
2)找不到libconscrypt_openjdk_jni.so; 同样可以从Android工程的编译目标里边去找到。
user@swd:/local/sdb/src$ /usr/lib/jvm/java-11-openjdk-amd64/bin/java -jar signapk.jar ./platform.x509.pem ./platform.pk8 Testdemo.apk Testdemon_signed.apk
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]at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2670)at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:830)at java.base/java.lang.System.loadLibrary(System.java:1873)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.conscrypt.NativeLibraryLoader.loadFirstAvailable(NativeLibraryLoader.java:106)at org.conscrypt.NativeCryptoJni.init(NativeCryptoJni.java:50)at org.conscrypt.NativeCrypto.<clinit>(NativeCrypto.java:64)at org.conscrypt.OpenSSLProvider.<init>(OpenSSLProvider.java:60)at org.conscrypt.OpenSSLProvider.<init>(OpenSSLProvider.java:53)at org.conscrypt.OpenSSLProvider.<init>(OpenSSLProvider.java:49)at com.android.signapk.SignApk.main(SignApk.java:1068)Suppressed: 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]at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2670)at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:830)at java.base/java.lang.System.loadLibrary(System.java:1873)at org.conscrypt.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:54)at org.conscrypt.NativeLibraryLoader.loadLibraryFromCurrentClassloader(NativeLibraryLoader.java:318)at org.conscrypt.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:273)... 8 moreSuppressed: java.lang.UnsatisfiedLinkError: no conscrypt_openjdk_jni 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]... 21 moreSuppressed: java.lang.UnsatisfiedLinkError: no conscrypt_openjdk_jni 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]at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2670)at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:830)at java.base/java.lang.System.loadLibrary(System.java:1873)at org.conscrypt.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:54)at org.conscrypt.NativeLibraryLoader.loadLibraryFromCurrentClassloader(NativeLibraryLoader.java:318)at org.conscrypt.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:273)... 8 moreSuppressed: java.lang.UnsatisfiedLinkError: no conscrypt 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]... 21 moreSuppressed: java.lang.UnsatisfiedLinkError: no conscrypt 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]at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2670)at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:830)at java.base/java.lang.System.loadLibrary(System.java:1873)at org.conscrypt.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:54)at org.conscrypt.NativeLibraryLoader.loadLibraryFromCurrentClassloader(NativeLibraryLoader.java:318)at org.conscrypt.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:273)... 8 more
libconscrypt_openjdk_jni.so 位置。
user@swd:~/samba/coding/targetxxx/out/soong/host/linux-x86/lib64$ ls -l
total 147680
-rwxrwxr-x 1 user user 2478432 May 17 20:45 libbase.so
-rwxrwxr-x 1 user user 2104080 May 17 20:57 libbrillo.so
-rwxrwxr-x 1 user user 1279848 May 17 20:57 libbrillo-stream.so
-rwxrwxr-x 1 user user 97840 May 17 20:45 libcgrouprc.so
-rwxrwxr-x 1 user user 18948392 May 17 20:57 libchrome.so
-rwxrwxr-x 1 user user 12570832 May 17 20:46 libconscrypt_openjdk_jni.so
-rwxrwxr-x 1 user user 7067056 May 17 20:43 libcrypto-host.so
-rwxrwxr-x 1 user user 19376 May 17 20:44 libcrypto_utils.so
-rwxrwxr-x 1 user user 5334576 May 17 20:43 libc++.so
-rwxrwxr-x 1 user user 212312 May 17 20:45 libcutils.so
-rwxrwxr-x 1 user user 1288304 May 17 20:44 libevent-host.so
-rwxrwxr-x 1 user user 197224 May 17 20:44 libext2_blkid-host.so
-rwxrwxr-x 1 user user 31392 May 17 20:44 libext2_com_err-host.so
-rwxrwxr-x 1 user user 109184 May 17 20:44 libext2_e2p-host.so
-rwxrwxr-x 1 user user 1579128 May 17 20:47 libext2fs-host.so
-rwxrwxr-x 1 user user 255208 May 17 20:47 libext2_quota-host.so
-rwxrwxr-x 1 user user 44688 May 17 20:44 libext2_uuid-host.so
-rwxrwxr-x 1 user user 45744 May 17 20:47 libext4_utils.so
-rwxrwxr-x 1 user user 189752 May 17 20:44 libfdt.so
-rwxrwxr-x 1 user user 574784 May 17 20:47 libfec.so
-rwxrwxr-x 1 user user 357824 May 17 20:45 libhidl-gen-utils.so
-rwxrwxr-x 1 user user 433136 May 17 20:56 libhidlmetadata.so
-rwxrwxr-x 1 user user 16669600 May 17 20:44 libicui18n-host.so
-rwxrwxr-x 1 user user 9982520 May 17 20:44 libicuuc-host.so
-rwxrwxr-x 1 user user 530264 May 17 20:45 liblog.so
-rwxrwxr-x 1 user user 1382984 May 17 20:48 liblpdump.so
-rwxrwxr-x 1 user user 2237584 May 17 20:47 liblp.so
-rwxrwxr-x 1 user user 979528 May 17 20:45 libpcre2.so
-rwxrwxr-x 1 user user 3460288 May 17 20:45 libprocessgroup.so
-rwxrwxr-x 1 user user 27677328 May 17 20:47 libprotobuf-cpp-full.so
-rwxrwxr-x 1 user user 4465064 May 17 20:45 libprotobuf-cpp-lite.so
-rwxrwxr-x 1 user user 405824 May 17 20:45 libselinux.so
-rwxrwxr-x 1 user user 148848 May 17 20:47 libsparse-host.so
-rwxrwxr-x 1 user user 5821664 May 17 20:46 libsqlite.so
-rwxrwxr-x 1 user user 11488 May 17 20:46 libsquashfs_utils.so
-rwxrwxr-x 1 user user 3042256 May 17 20:46 libssl-host.so
-rwxrwxr-x 1 user user 367568 May 17 20:47 libtinyxml2.so
-rwxrwxr-x 1 user user 12502584 May 17 20:47 libvintf.so
-rwxrwxr-x 1 user user 5141736 May 17 20:47 libxml2.so
-rwxrwxr-x 1 user user 312624 May 17 20:47 libz-host.so
-rwxrwxr-x 1 user user 773648 May 17 20:47 libziparchive.so
user@swd:~/samba/coding/targetxxx/out/soong/host/linux-x86/lib64$user@swd:~/samba/coding/targetxxx/out/target/product/targetxxx_k419/obj/PACKAGING/otatools_intermediates/otatools/lib64$ ls -l
total 101512
-rwxrwxr-x 1 user user 2478432 May 17 20:58 libbase.so
-rwxrwxr-x 1 user user 2104080 May 17 20:58 libbrillo.so
-rwxrwxr-x 1 user user 1279848 May 17 20:58 libbrillo-stream.so
-rwxrwxr-x 1 user user 97840 May 17 20:58 libcgrouprc.so
-rwxrwxr-x 1 user user 18948392 May 17 20:58 libchrome.so
-rwxrwxr-x 1 user user 12570832 May 17 20:58 libconscrypt_openjdk_jni.so
-rwxrwxr-x 1 user user 7067056 May 17 20:58 libcrypto-host.so
-rwxrwxr-x 1 user user 19376 May 17 20:58 libcrypto_utils.so
-rwxrwxr-x 1 user user 5334576 May 17 20:58 libc++.so
-rwxrwxr-x 1 user user 212312 May 17 20:58 libcutils.so
-rwxrwxr-x 1 user user 1288304 May 17 20:58 libevent-host.so
-rwxrwxr-x 1 user user 197224 May 17 20:58 libext2_blkid-host.so
-rwxrwxr-x 1 user user 31392 May 17 20:58 libext2_com_err-host.so
-rwxrwxr-x 1 user user 109184 May 17 20:58 libext2_e2p-host.so
-rwxrwxr-x 1 user user 1579128 May 17 20:58 libext2fs-host.so
-rwxrwxr-x 1 user user 255208 May 17 20:58 libext2_quota-host.so
-rwxrwxr-x 1 user user 44688 May 17 20:58 libext2_uuid-host.so
-rwxrwxr-x 1 user user 45744 May 17 20:58 libext4_utils.so
-rwxrwxr-x 1 user user 574784 May 17 20:58 libfec.so
-rwxrwxr-x 1 user user 357824 May 17 20:58 libhidl-gen-utils.so
-rwxrwxr-x 1 user user 433136 May 17 20:58 libhidlmetadata.so
-rwxrwxr-x 1 user user 16669600 May 17 20:58 libicui18n-host.so
-rwxrwxr-x 1 user user 9982520 May 17 20:58 libicuuc-host.so
-rwxrwxr-x 1 user user 530264 May 17 20:58 liblog.so
-rwxrwxr-x 1 user user 2237584 May 17 20:58 liblp.so
-rwxrwxr-x 1 user user 979528 May 17 20:58 libpcre2.so
-rwxrwxr-x 1 user user 3460288 May 17 20:58 libprocessgroup.so
-rwxrwxr-x 1 user user 4465064 May 17 20:58 libprotobuf-cpp-lite.so
-rwxrwxr-x 1 user user 405824 May 17 20:58 libselinux.so
-rwxrwxr-x 1 user user 148848 May 17 20:58 libsparse-host.so
-rwxrwxr-x 1 user user 5821664 May 17 20:58 libsqlite.so
-rwxrwxr-x 1 user user 11488 May 17 20:58 libsquashfs_utils.so
-rwxrwxr-x 1 user user 3042256 May 17 20:58 libssl-host.so
-rwxrwxr-x 1 user user 312624 May 17 20:58 libz-host.so
-rwxrwxr-x 1 user user 773648 May 17 20:58 libziparchive.so
user@swd:~/samba/coding/targetxxx/out/target/product/targetxxx_k419/obj/PACKAGING/otatools_intermediates/otatools/lib64$
以上两个目录均可获取,拷贝到本地目录。
【签名命令】
/usr/lib/jvm/java-11-openjdk-amd64/bin/java -jar -Djava.library.path=. signapk.jar ./platform.x509.pem ./platform.pk8 Testdemo.apk Testdemo_signed.apk
格式:
java -jar -Djava.library.path=. 当前目录 signapk.jar [公钥] [私钥] [老输入apk名称] [新输出签名apk名称]
相关文章:
apk签名-signapk.jar
如果做平台app开发,需要签platform签名,除了通过adroid.bp或者android.mk的方式使用AOSP整个大工程中签名外,还可以直接通过signapk.jar的方式进行签名,效率更高更快捷简便。 首先我们来回顾下AOSP平台签名的办法。 Android.mk 使…...

【100个高大尚求职简历】简历模板+修改教程+行业分类简历模板 (涵盖各种行业) (简历模板+编辑指导+修改教程)
文章目录 1 简历预览2 简历下载 很多人说自己明明投了很多公司的简历,但是都没有得到面试邀请的机会。自己工作履历挺好的,但是为什么投自己感兴趣公司的简历,都没有面试邀请的机会。反而是那些自己没有投递的公司,经常给自己打电…...
Nginx平滑升级版本或添加模块
文章目录 一、Nginx 平滑升级二、升级失败 回滚操作三、遇到问题 一、Nginx 平滑升级 一般有两种情况下需要升级 nginx,一种是确实要升级 nginx 的版本,另一种是要为 nginx 添加新的模块。 Nginx平滑升级其原理简单概括: (1&am…...

高阶复杂网络重建:从时间序列中重建高阶网络
论文链接:https://www.nature.com/articles/s41467-022-30706-9 一、为什么要研究高阶网络? 复杂网络跟我们生活息息相关,例如社交网络的信息传播,疾病的感染扩散和基因调控网络的相互作用等。越来越多的研究突破了传统网络中两…...

Day05 03-MySQL主从-主主原理与搭建详解
文章目录 第十六章 MySQL的系统架构(主从架构)16.1 MySQL集群架构的介绍16.1.1 主从架构介绍16.1.2 主从复制的原理 16.2 MySQL主从复制的实现16.2.1 环境说明16.2.2 主库配置16.2.3 从库配置16.2.4 主从复制测试 16.3 MySQL主主复制的实现16.3.1 主主复…...

STL之vector
目录 vector模拟实现一. vector的基本框架二. 常用方法及实现1.初始化和清理a. 默认构造函数b. 析构函数 2. 迭代器a. beginb. end 3.数据访问a. sizeb. capacityc. operator[]d. frontc. back 4.增删查改操作a. reserveb. resizec. insertd. push_backe. erasef. pop_back 5.构…...

2020年CSP-J认证 CCF非专业级别软件能力认证第一轮真题-单项选择题解析
2020 CCF认证第一轮(CSP-J)真题 一、单项选择题 (共15题,每2分,共30分;每题有且有一个正确选项) 1、在内存储器中每个存储单元都被赋予一个唯一的序号,称为 A、下标 B、序号 C、地址 D、编号 答案:C…...

vscode Delete `␍⏎·····`
在公司拉取代码报错 Delete ␍⏎,首先问题的关键是换行导致,相信你看别的博客也知道为什么了,但是我使用别的博客的解决办法,没搞定,无论是配置 auto 还是命令行执行,都不行 下面介绍我的解决办法 我使用…...

读书笔记-《ON JAVA 中文版》-摘要16[第十六章 代码校验]
文章目录 第十六章 代码校验1. 测试1.1 单元测试1.2 JUnit1.3 测试覆盖率的幻觉 2. 前置条件2.1 断言(Assertions)2.2 Java 断言语法2.3 Guava 断言2.4 使用断言进行契约式设计2.4.1 检查指令2.4.2 前置条件2.4.3 后置条件2.4.4 不变性2.4.5 放松 DbC 检…...
SQL Server:打造高效数据管理系统的利器
使用SQL Server进行数据管理 简介 SQL Server是由Microsoft开发的一款关系型数据库管理系统,它可以用于存储和管理大量结构化数据。本篇博客将介绍如何使用SQL Server进行数据管理。 数据库连接 在开始使用SQL Server之前,需要先建立与数据库的连接。…...
代码随想录二刷day20 | 二叉树之 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树
day20 654.最大二叉树617.合并二叉树700.二叉搜索树中的搜索98.验证二叉搜索树 654.最大二叉树 题目链接 解题思路: 本题属于构造二叉树,需要使用前序遍历,因为先构造中间节点,然后递归构造左子树和右子树。 确定递归函数的参数…...

python基础知识(十三):numpy库的基本用法
目录 1. numpy的介绍2. numpy库产生矩阵2.1 numpy将列表转换成矩阵2.2 numpy创建矩阵 3. numpy的基础运算4. numpy的基础运算25. 索引 1. numpy的介绍 numpy库是numpy是python中基于数组对象的科学计算库。 2. numpy库产生矩阵 2.1 numpy将列表转换成矩阵 import numpy as …...
【SA8295P 源码分析】16 - TouchScreen Panel (TP)线程函数 tp_recv_thread() 源码分析
【【SA8295P 源码分析】16 - TouchScreen Panel (TP)线程函数 tp_recv_thread 源码分析 一、TP 线程函数:tp_recv_thread()二、处理&上报 坐标数据 cypress_read_touch_data()系列文章汇总见:《【SA8295P 源码分析】00 - 系列文章链接汇总》 本文链接:《【SA8295P 源码…...

Python3数据分析与挖掘建模(13)复合分析-因子关分析与小结
1.因子分析 1.1 探索性因子分析 探索性因子分析(Exploratory Factor Analysis,EFA)是一种统计方法,用于分析观测变量之间的潜在结构和关联性。它旨在确定多个观测变量是否可以归结为较少数量的潜在因子,从而帮助简化…...

【stable diffusion】图片批量自动打标签、标签批量修改(BLIP、wd14)用于训练SD或者LORA模型
参考: B站教学视频【:AI绘画】新手向!Lora训练!训练集准备、tag心得、批量编辑、正则化准备】官方教程:https://github.com/darkstorm2150/sd-scripts/blob/main/docs/train_README-en.md#automatic-captioning 一、…...

TCP可靠数据传输
TCP的可靠数据传输 1.TCP保证可靠数据传输的方法 TCP主要提供了检验和、序号/确认号、超时重传、最大报文段长度、流量控制等方法实现了可靠数据传输。 检验和 通过检验和的方式,接收端可以检测出来数据是否有差错和异常,假如有差错就会直接丢失该TC…...
Python 私有变量和私有方法介绍
Python 私有变量和私有方法介绍 关于 Python 私有变量和私有方法,通常情况下,开发者可以在方法或属性名称前加上单下划线(_),以表示该方法或属性仅供内部使用,但这只是一种约定,并没有强制执行禁…...

Kotlin Lambda表达式和匿名函数的组合简直太强了
Kotlin Lambda表达式和匿名函数的组合简直太强了 简介 首先,在 Kotlin 中,函数是“第一公民”(First Class Citizen)。因此,它们可以被分配为变量的值,作为其他函数的参数传递或者函数的返回值。同样&…...
uniapp 小程序 获取手机号---通过前段获取
<template><!-- 获取手机号,登录内容 --><view><!-- 首先需要先登录获取code码,然后才可以获取用户唯一标识openid以及会话密钥及用于解密获取手机的加密信息 --><view click"login">登录</view><view…...

面板安全能力持续增强,新增日志审计功能,1Panel开源面板v1.3.0发布
2023年6月12日,现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.3.0版本。 在这一版本中,1Panel进一步增强了安全方面的能力,包括新增SSH配置管理、域名绑定和IP授权支持,以及启用网站防盗链功能。此外,该版本…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...

什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...
【Ftrace 专栏】Ftrace 参考博文
ftrace、perf、bcc、bpftrace、ply、simple_perf的使用Ftrace 基本用法Linux 利用 ftrace 分析内核调用如何利用ftrace精确跟踪特定进程调度信息使用 ftrace 进行追踪延迟Linux-培训笔记-ftracehttps://www.kernel.org/doc/html/v4.18/trace/events.htmlhttps://blog.csdn.net/…...