当前位置: 首页 > news >正文

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开发&#xff0c;需要签platform签名&#xff0c;除了通过adroid.bp或者android.mk的方式使用AOSP整个大工程中签名外&#xff0c;还可以直接通过signapk.jar的方式进行签名&#xff0c;效率更高更快捷简便。 首先我们来回顾下AOSP平台签名的办法。 Android.mk 使…...

【100个高大尚求职简历】简历模板+修改教程+行业分类简历模板 (涵盖各种行业) (简历模板+编辑指导+修改教程)

文章目录 1 简历预览2 简历下载 很多人说自己明明投了很多公司的简历&#xff0c;但是都没有得到面试邀请的机会。自己工作履历挺好的&#xff0c;但是为什么投自己感兴趣公司的简历&#xff0c;都没有面试邀请的机会。反而是那些自己没有投递的公司&#xff0c;经常给自己打电…...

Nginx平滑升级版本或添加模块

文章目录 一、Nginx 平滑升级二、升级失败 回滚操作三、遇到问题 一、Nginx 平滑升级 一般有两种情况下需要升级 nginx&#xff0c;一种是确实要升级 nginx 的版本&#xff0c;另一种是要为 nginx 添加新的模块。 Nginx平滑升级其原理简单概括&#xff1a; &#xff08;1&am…...

高阶复杂网络重建:从时间序列中重建高阶网络

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

Day05 03-MySQL主从-主主原理与搭建详解

文章目录 第十六章 MySQL的系统架构&#xff08;主从架构&#xff09;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认证第一轮&#xff08;CSP-J&#xff09;真题 一、单项选择题 (共15题&#xff0c;每2分&#xff0c;共30分;每题有且有一个正确选项&#xff09; 1、在内存储器中每个存储单元都被赋予一个唯一的序号,称为 A、下标 B、序号 C、地址 D、编号 答案&#xff1a;C…...

vscode Delete `␍⏎·····`

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

读书笔记-《ON JAVA 中文版》-摘要16[第十六章 代码校验]

文章目录 第十六章 代码校验1. 测试1.1 单元测试1.2 JUnit1.3 测试覆盖率的幻觉 2. 前置条件2.1 断言&#xff08;Assertions&#xff09;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开发的一款关系型数据库管理系统&#xff0c;它可以用于存储和管理大量结构化数据。本篇博客将介绍如何使用SQL Server进行数据管理。 数据库连接 在开始使用SQL Server之前&#xff0c;需要先建立与数据库的连接。…...

代码随想录二刷day20 | 二叉树之 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

day20 654.最大二叉树617.合并二叉树700.二叉搜索树中的搜索98.验证二叉搜索树 654.最大二叉树 题目链接 解题思路&#xff1a; 本题属于构造二叉树&#xff0c;需要使用前序遍历&#xff0c;因为先构造中间节点&#xff0c;然后递归构造左子树和右子树。 确定递归函数的参数…...

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 探索性因子分析 探索性因子分析&#xff08;Exploratory Factor Analysis&#xff0c;EFA&#xff09;是一种统计方法&#xff0c;用于分析观测变量之间的潜在结构和关联性。它旨在确定多个观测变量是否可以归结为较少数量的潜在因子&#xff0c;从而帮助简化…...

【stable diffusion】图片批量自动打标签、标签批量修改(BLIP、wd14)用于训练SD或者LORA模型

参考&#xff1a; B站教学视频【&#xff1a;AI绘画】新手向&#xff01;Lora训练&#xff01;训练集准备、tag心得、批量编辑、正则化准备】官方教程&#xff1a;https://github.com/darkstorm2150/sd-scripts/blob/main/docs/train_README-en.md#automatic-captioning 一、…...

TCP可靠数据传输

TCP的可靠数据传输 1.TCP保证可靠数据传输的方法 TCP主要提供了检验和、序号/确认号、超时重传、最大报文段长度、流量控制等方法实现了可靠数据传输。 检验和 通过检验和的方式&#xff0c;接收端可以检测出来数据是否有差错和异常&#xff0c;假如有差错就会直接丢失该TC…...

Python 私有变量和私有方法介绍

Python 私有变量和私有方法介绍 关于 Python 私有变量和私有方法&#xff0c;通常情况下&#xff0c;开发者可以在方法或属性名称前加上单下划线&#xff08;_&#xff09;&#xff0c;以表示该方法或属性仅供内部使用&#xff0c;但这只是一种约定&#xff0c;并没有强制执行禁…...

Kotlin Lambda表达式和匿名函数的组合简直太强了

Kotlin Lambda表达式和匿名函数的组合简直太强了 简介 首先&#xff0c;在 Kotlin 中&#xff0c;函数是“第一公民”&#xff08;First Class Citizen&#xff09;。因此&#xff0c;它们可以被分配为变量的值&#xff0c;作为其他函数的参数传递或者函数的返回值。同样&…...

uniapp 小程序 获取手机号---通过前段获取

<template><!-- 获取手机号&#xff0c;登录内容 --><view><!-- 首先需要先登录获取code码&#xff0c;然后才可以获取用户唯一标识openid以及会话密钥及用于解密获取手机的加密信息 --><view click"login">登录</view><view…...

面板安全能力持续增强,新增日志审计功能,1Panel开源面板v1.3.0发布

2023年6月12日&#xff0c;现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.3.0版本。 在这一版本中&#xff0c;1Panel进一步增强了安全方面的能力&#xff0c;包括新增SSH配置管理、域名绑定和IP授权支持&#xff0c;以及启用网站防盗链功能。此外&#xff0c;该版本…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权

摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题&#xff1a;安全。文章将详细阐述认证&#xff08;Authentication) 与授权&#xff08;Authorization的核心概念&#xff0c;对比传统 Session-Cookie 与现代 JWT&#xff08;JS…...

Mysql故障排插与环境优化

前置知识点 最上层是一些客户端和连接服务&#xff0c;包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念&#xff0c;为通过安全认证接入的客户端提供线程。同样在该层上可…...