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授权支持,以及启用网站防盗链功能。此外,该版本…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...