ubuntu20.04上编译android 7.1

2023-05-16

一、安装 OpenJDK 8:

sudo apt-get install openjdk-8-jdk
提示:安装 openjdk-8-jdk,会更改 JDK 的默认链接,这时可用:
sudo update-alternatives --config java
sudo update-alternatives --config javac
来切换 JDK 版本。SDK 在找不到操作系统默认 JDK 的时候会使用内部设定的 JDK 路径,
因此,为了让同一台机器可以编译 Android 5.1 及之前的版本,去掉链接更方便:
sudo /var/lib/dpkg/info/openjdk-8-jdk:amd64.prerm remove

二、安装其他依赖包

sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g+±multilib -y
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386
sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
sudo apt-get install git-core gnupg flex bison gperf build-essential
sudo apt-get install zip curl zlib1g-dev gcc-multilib g+±multilib
sudo apt-get install libc6-dev-i386 -y
sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev
sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
sudo apt-get install lib32z-dev ccache
sudo apt install make make-guile -y
sudo apt-get install tofrodos -y
sudo apt-get install python-markdown libxml2-utils xsltproc zlib1g-dev:i386
sudo apt install python
ln -s /usr/bin/python2 /usr/bin/python
sudo apt install libncurses5:i386

1.1 无法定位软件包 libesd0-dev

vim /etc/apt/sources.list
替换全部为下面的源

deb https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ xenial main universe
deb-src https://mirrors.ustc.edu.cn/ubuntu/ xenial main universe

再执行下面命令
sudo apt-get update && sudo apt-get install libesd0-dev

1.2 下列软件包有未满足的依赖关系:

lib32ncurses5-dev : 依赖: libncurses5-dev (= 6.0+20160213-1ubuntu1)
解决办法:
sudo apt-get install lib32ncurses5
sudo apt-get install libncurses5
备用解决办法:
sudo ln -s /usr/lib/x86_64-linux-gnu/crt*.o /usr/lib
sudo ln -sf /lib/i386-linux-gnu/libncurses.so.5 /usr/lib32/libncurses.so
sudo ln -sf /lib/x86_64-linux-gnu/libncurses.so.5 /usr/lib/libncurses.so
sudo ln -s /lib/x86_64-linux-gnu/libz.so.1 /usr/lib/libz.so

1.3.下列软件包有未满足的依赖关系:

make : 冲突: make-guile 但是 4.2.1-1.2 正要被安装
make-guile : 冲突: make
暂无解决,只安装了make-guile

1.4.报错如下

flex-2.5.39: loadlocale.c:130:_nl_intern_locale_data: ?? ‘cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))’ ???
Aborted (core dumped)
[ 4% 4832/99272] target C++: libapplypatch <= bootable/recovery/applypatch/bspatch.cpp
解决办法:
在~/.bashrc最后添加export LC_ALL=C
然后 source ~/.bashrc
解答: 添加export LC_ALL=C是去除本地C化,使得Android的编译工具与本地工具不冲突。

1.5. APK是通过Android Studio使用高版本的SDK Version(API Level 28)编译生成的,然后被放到了Android源码(API Level 25)中当作第三方APK来编译,编译出错

[ 35% 105/294] build out/target/product/rk3399_mid/obj/APPS/BenebotHumanInterAction1.0.AudioService_intermediates/oat/arm64/package.odex
FAILED: /bin/bash -c “(rm -f out/target/product/rk3399_mid/obj/APPS/BenebotHumanInterAction1.0.AudioService_intermediates/oat/arm64/package.odex ) && (mkdir -p out/target/product/rk3399_mid/obj/APPS/BenebotHumanInterAction1.0.AudioService_intermediates/oat/arm64/ ) && (ANDROID_LOG_TAGS=”*:e" out/host/linux-x86/bin/dex2oatd --runtime-arg -Xms64m --runtime-arg -Xmx512m --runtime-arg -classpath --runtime-arg “&” --boot-image=out/target/product/rk3399_mid/dex_bootjars/system/framework/boot.art --dex-file=device/rockchip/rk3399/benebot/BenebotHumanInterAction1.0.AudioService.apk --dex-location=/system/etc/benebot/BenebotHumanInterAction1.0.AudioService/BenebotHumanInterAction1.0.AudioService.apk --oat-file=out/target/product/rk3399_mid/obj/APPS/BenebotHumanInterAction1.0.AudioService_intermediates/oat/arm64/package.odex --android-root=out/target/product/rk3399_mid/system --instruction-set=arm64 --instruction-set-variant=cortex-a53 --instruction-set-features=default --include-patch-information --runtime-arg -Xnorelocate --no-generate-debug-info --abort-on-hard-verifier-error --no-inline-from=core-oj.jar --compile-pic )"
dex2oatd F 19250 19376 art/runtime/class_linker.cc:6620] Check failed: vtable_entry != other_entry && !name_comparator.HasSameNameAndSignature( other_entry->GetInterfaceMethodIfProxy(pointer_size)) vtable entries 1049 and 1054 are identical for java.lang.Class<android.support.v7.widget.MenuPopupWindow M e n u D r o p D o w n L i s t V i e w > i n m e t h o d i n t a n d r o i d . s u p p o r t . v 7. w i d g e t . D r o p D o w n L i s t V i e w . l o o k F o r S e l e c t a b l e P o s i t i o n ( i n t , b o o l e a n ) a n d i n t a n d r o i d . s u p p o r t . v 7. w i d g e t . M e n u P o p u p W i n d o w MenuDropDownListView> in method int android.support.v7.widget.DropDownListView.lookForSelectablePosition(int, boolean) and int android.support.v7.widget.MenuPopupWindow MenuDropDownListView>inmethodintandroid.support.v7.widget.DropDownListView.lookForSelectablePosition(int,boolean)andintandroid.support.v7.widget.MenuPopupWindowMenuDropDownListView.lookForSelectablePosition(int, boolean)
dex2oatd F 19250 19376 art/runtime/runtime.cc:422]Runtime abortin
原因:
源码编译会对apk进行一个解析,形成odex文件加速apk的运行,但是基于高版本的SDK开发的APK里的一些资源是无法被低版本正确的解析
解决方法:
要编译APK的Android.mk文件中添加如下一行:
LOCAL_DEX_PREOPT := false
本次编译是vendor\firefly\apps\FireflyDemo编译出错,所以找vendor\firefly\apps\FireflyDemo\Android.mk进行修改

99.编译一次某类型的,然后换编译另一种类型,出现报错前一次未完成:没有规则可制作目标“arch/arm64/boot/dts/rockchip/rk3399-firefly-aiojd4.dtb”。
make mrproper

二、编译

AIO-3399JD4产品编译方法
HDMI显示编译
./FFTools/make.sh -d rk3399-firefly-aiojd4 -j8 -l rk3399_firefly_aiojd4-userdebug
./FFTools/mkupdate/mkupdate.sh -l rk3399_firefly_aiojd4-userdebug
HDMI+lvds编译
./FFTools/make.sh -d rk3399-firefly-aiojd4-lvds-HSX101H40C -j8 -l rk3399_firefly_aiojd4_lvds-userdebug
./FFTools/mkupdate/mkupdate.sh -l rk3399_firefly_aiojd4_lvds-userdebug
手动编译AIO-3399JD4
编译前执行如下命令配置环境变量:

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH= J A V A H O M E / b i n : JAVA_HOME/bin: JAVAHOME/bin:PATH
export CLASSPATH=.: J A V A H O M E / l i b : JAVA_HOME/lib: JAVAHOME/lib:JAVA_HOME/lib/tools.jar
编译kernel:

cd ~/proj/firefly-rk3399/kernel/
make ARCH=arm64 firefly_defconfig
make -j8 ARCH=arm64 rk3399-firefly-aiojd4.img
编译uboot:

cd ~/proj/firefly-rk3399/u-boot/
make rk3399_defconfig
make ARCHV=aarch64 -j8
编译android:

cd ~/proj/firefly-rk3399/
source build/envsetup.sh
lunch rk3399_firefly_aiojd4-userdebug
make -j8
./mkimage.sh
打包成统一固件 update.img
编译完可以用Firefly官方的脚本打包成统一固件,执行如下命令:

./FFTools/mkupdate/mkupdate.sh update
打包完成后将在 rockdev/Image-rk3399_firefly_aiojd4/ 下生成统一固件:update.img

在 Windows 下打包统一固件 update.img 也很简单,将编译生成的文件拷贝到 AndroidTool 的 rockdev\Image 目录中,然后运行 rockdev 目录下的 mkupdate.bat 批处理文件即可创建 update.img 并存放到 rockdev\Image 目录里。

烧写分区映像
编译的时候执行 ./mkimage.sh 会重新打包 boot.img 和 system.img, 并将其它相关的映像文件拷贝到目录 rockdev/Image-rk3399_firefly_aiojd4/ 中。以下列出一般固件用到的映像文件:

boot.img :Android 的初始文件映像,负责初始化并加载 system 分区。

kernel.img :内核映像。

misc.img :misc 分区映像,负责启动模式切换和急救模式的参数传递。

parameter.txt :emmc的分区信息

recovery.img :急救模式映像。

resource.img :资源映像,内含开机图片和内核的设备树信息。

system.img :Android 的 system 分区映像,ext4 文件系统格式。

trust.img :休眠唤醒相关的文件

rk3399_loader_v1.08.106.bin :Loader文件

uboot.img :uboot文件

请参照 如何升级固件 一文来烧写分区映像文件。

如果使用的是 Windows 系统,将上述映像文件拷贝到 AndroidTool (Windows 下的固件升级工具)的 rockdev\Image 目录中,之后参照升级文档烧写分区映像即可,这样的好处是使用默认配置即可,不用修改文件的路径。

update.img 方便固件的发布,供终端用户升级系统使用。一般开发时使用分区映像比较方便。

注意:
使用升级工具进行industry版固件升级时,如果原有烧录的是tvbox版固件,需要先短路emmc或进行flash擦除。且注意使用相适配升级工具
请参照 烧写须知

定制 Android 固件
前言
定制 Android 固件,有两种方法:

改源码,然后编译生成固件。

在现有固件的基础上进行裁剪。

前一种方法,可以从各个层面去定制 Android,自由度大,但对编译环境和技术要求比较高,参见《编译 Android 固件》一文。现在介绍后一种方法,分为解包、定制和打包三个阶段。主机操作系统为 Linux,采用的工具为开源软件。

固件格式
统一固件 release_update.img,内含启动加载器 loader.img 和真正的固件数据 update.img

release_update.img
|- loader.img
`- update.img
update.img 是个复合文件,内含多个文件,由 package-file 描述。一个典型的 package-file 为:

# NAME Relative path package-file package-file bootloader Image/MiniLoaderAll.bin parameter       Image/parameter.txt trust           Image/trust.img uboot           Image/uboot.img misc Image/misc.img resource Image/resource.img kernel Image/kernel.img boot            Image/boot.img recovery Image/recovery.img system Image/system.img backup RESERVED #update-script update-script #recover-script recover-script

package-file

update.img 的打包说明文件,update.img 里也含有一份 package-file。

Image/MiniLoaderAll.bin

启动加载器,即 bootloader。

Image/parameter.txt

参数文件,可以设定内核启动参数,里面有重要的分区信息。

Image/trust.img,trust.img 是U-Boot作为二级loader 的打包。

Image/misc.img

misc 分区的映像,用来控制 Android 是正常启动,还是进入急救模式(Recovery Mode)。

Image/kernel.img

Android 内核。

Image/resource.img

资源映像,内有内核开机图片和内核设备树信息(Device Tree Blob)。

Image/boot.img

Android 内核的内存启动盘(initrd),是内核启动后最先加载的根文件系统,包含重要的初始化动作,一般不需要改动。

Image/recovery.img

Android 急救模式的映像,内含内核和急救模式的根文件系统。

Image/system.img

对应于 Android 的 /system 分区,是以下的定制对象。

解包,就是提取 release_update.img 里的 update.img, 然后解压出内含 package-file 所声明的多个文件。打包,则是个逆过程,将 package-file 将所列的多个文件合成 update.img,加进 loader.img,最终生成 release_update.img 。

工具准备
git clone https://github.com/TeeFirefly/rk2918_tools.git
cd rk2918_tools
make
sudo cp afptool img_unpack img_maker mkkrnlimg /usr/local/bin
解包
解压 release_update.img

$ cd /path/to/your/firmware/dir
$ img_unpack Firefly-RK3399_20161027.img img
rom version: 6.0.1
build time: 2016-10-27 14:58:18
chip: 33333043
checking md5sum…OK
解压 update.img

$ cd img
$ afptool -unpack update.img update
Check file…OK
------- UNPACK -------
package-file 0x00000800 0x00000280
Image/MiniLoaderAll.bin 0x00001000 0x0003E94E
Image/parameter.txt 0x00040000 0x00000350
Image/trust.img 0x00040800 0x00400000
Image/uboot.img 0x00440800 0x00400000
Image/misc.img 0x00840800 0x0000C000
Image/resource.img 0x0084C800 0x0003FE00
Image/kernel.img 0x0088C800 0x00F5D00C
Image/boot.img 0x017EA000 0x0014AD24
Image/recovery.img 0x01935000 0x013C0000
Image/system.img 0x02CF5000 0x2622A000
RESERVED 0x00000000 0x00000000
UnPack OK!
查看 update 目录下的文件树

$ cd update/
$ tree
.
├── Image
│ ├── boot.img
│ ├── kernel.img
│ ├── MiniLoaderAll.bin
│ ├── misc.img
│ ├── parameter.txt
│ ├── recovery.img
│ ├── resource.img
│ ├── system.img
│ ├── trust.img
│ └── uboot.img
├── package-file
└── RESERVED

1 directory, 12 files
这样,固件就解包成功了,下面就开始定制吧。

定制
定制 system.img
system.img 是个 ext4 文件系统格式的映像文件,可以直接挂载到系统进行修改:

sudo mkdir -p /mnt/system
sudo mount -o loop Image/system.img /mnt/system
cd /mnt/system

修改里面的东西,注意剩余空间,不能添加太多的 APK

修改完毕,要卸载

cd /
sudo umount /mnt/system
注意,该 system.img 的剩余空间基本为 0, 如果不是删除文件,就需要对 system.img 进行扩容,并根据最后的文件大小,相应地调整 parameter 文件里的分区设置。以下是如何扩展空间的示例,在扩展前,先运行 mount 来查看系统挂载情况,确保 system.img 已经卸载:

增加 128M 的空间

dd if=/dev/zero bs=1M count=128 >> Image/system.img

扩展文件系统信息

e2fsck -f Image/system.img
resize2fs Image/system.img
打包
首先要检查一下 system.img 的大小,对照 parameter 文件的分区情况(可参考文档Parameter 文件格式,作必要的大小调整。例如,parameter.txt 文件里的 system 分区大小,可以找到 CMDLINE 一行,然后找到 system 字符串:

0x00200000@0x000B0000(system)
@ 前面就是分区的大小,单位是 512 字节,这样该 system 分区的大小就是:

$ echo $(( 0x00200000 * 512 / 1024 / 1024))M
1024M
只要 system.img 的大小不超过 1024M,parameter 文件就不用更改。如果分区不用更改,可以直接用烧写工具将新的 system.img 烧写到开发板的 system 分区上做试验。否则,需要制作新固件并烧写后再行测试。以下是打包成统一固件 update.img 所需要的步骤:

合成 update.img :

当前的目录仍然为 update/ ,内有 package-file, package-file 所列的文件均存在

将参数文件拷贝一份到 paramter, 因为 afptool 默认要用到

$ cp Image/parameter.txt parameter
$ afptool -pack . …/update_new.img
------ PACKAGE ------
Add file: ./package-file
Add file: ./Image/MiniLoaderAll.bin
Add file: ./Image/parameter.txt
Add file: ./Image/trust.img
Add file: ./Image/uboot.img
Add file: ./Image/misc.img
Add file: ./Image/resource.img
Add file: ./Image/kernel.img
Add file: ./Image/boot.img
Add file: ./Image/recovery.img
Add file: ./Image/system.img
Add file: ./RESERVED
Add CRC…
------ OK ------
Pack OK!
合成 release_update.img :

$ img_maker -rk33 loader.img update_new.img release_update_new.img
generate image…
append md5sum…
success!
release_update_new.img 即为最终生成的可烧写的统一固件文件。

常见问题
固件的版本在哪设置
在 parameter 文件中找到下行并修改即可,注意版本号为数字,中间两个点号不能省略。

参考firfly:http://wiki.t-firefly.com/zh_CN/Core-3399-JD4/Android_development.html#bian-yi-android7-1-industry-gu-jian-font-color-ff0000-size-3-zhu-yao-wei-hu-font

参考:https://blog.csdn.net/qq_42889470/article/details/81463559

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ubuntu20.04上编译android 7.1 的相关文章

  • 使用新语法应用 Android Gradle 插件

    如何使用新的 Gradle 插件语法应用 Android 插件 plugins id version 代替 buildscript dependencies classpath com android tools build gradle
  • 如何在 ADB 连接期间禁用电池充电?

    问题描述 每次我在电脑和手机之间连接 USB 线时 电池都会自动充电 我想使用 ADB 协议 但我不想在 ADB 连接期间为电池充电 是否可以关闭此充电功能 当然 我该怎么做呢 环境 Android 操作系统 4 及更高版本的手机 我只需要
  • 导入已经创建的sqlite数据库(xamarin)

    我正在使用 Xamarin 想知道如何导入我已经创建的 sqlite 数据库 到目前为止 我已将其添加到资产文件夹中 但不知道下一步从哪里开始 string localPath Path Combine System Environment
  • 如何在 android 中启动“添加联系人”活动

    您能告诉我如何在 Android 中启动 添加联系人 活动吗 谢谢 API 级别 5 及以上解决方案 Add listener so your activity gets called back upon completion of act
  • Android PhoneGap 插件,UI 选项卡栏,调整 WebView 大小

    我正在创建一个美味的 PhoneGap 插件 希望一旦它能被打开 准备好了 插件基本完成了 我只需要一个漂亮的用户界面 相互作用 简而言之 我想创建一个 本机 android 工具栏组件 如果您实现 PhoneGap UIControls
  • 更改卡片高度即更改 Jetpack 中与 Material 3 组合的卡片颜色

    我正在使用 Card 可组合项 我希望它的颜色为白色 但是当我向它添加一些高度时 它的颜色会更改为更像主要容器颜色 我看过文档 其中有一种称为高程覆盖的东西 但找不到说明如何使用它的示例 这是我的代码 Card modifier Modif
  • 位图内存不足错误

    我对这个错误有疑问 我从 URL 制作网站图标解析器 我这样做是这样的 public class GrabIconsFromWebPage public static String replaceUrl String url StringB
  • 具有自定义源集的 Android Gradle 风格 - gradle 文件应该是什么样子?

    我有一个旧的 eclipse 项目 我已经转移到 android studio 并设置为使用flavor 它似乎工作得很好 直到我开始尝试在我的风格之间使用不同的 java 文件 我的项目设置是这样的 ProjectRoot acitonb
  • 在选项卡上保存数据

    我有 3 个选项卡 每个选项卡都有一个单独的活动 我想在用户单击任一选项卡上的 保存 时保存数据 有几个选项可供选择 共享首选项 全局变量或将对象保存在上下文中 编辑 我必须保存图像和文本字段 Android 共享首选项 https sta
  • 如何在 NumberPicker 中一次显示 3 个以上的值

    我正在创建一个数字选择器 如下图所示 但如果有可用空间 我想显示 3 个以上的值 该选择器有 20 个项目 并且有足够的空间来显示 3 个以上的值 这可以使用 NumberPicker 来完成吗 只需以编程方式设置numberPicker
  • 如何使用应用程序接口将蓝牙套接字传递给另一个活动

    因此 根据我收集的信息 套接字连接既不可序列化 也不可分割 但我需要将蓝牙连接传递给另一个活动 我不想作为中间人编写服务 所以请不要将此作为解决方案发布 我听说有一种方法可以使用自定义应用程序接口来传递这些类型的对象 但我一生都找不到这样的
  • Android 中的列表视图分页

    我有一个列表视图 其中显示了 50 个元素 我决定对视图进行分页 以便视图的每个部分都有 10 个元素 然后单击 下一个 按钮以获取下一个 10 个元素 如何设置10个数据 我关注这篇文章http rakhi577 wordpress co
  • TextInputLayout 对于在 EditText 中以编程方式给出提示没有效果

    我有一个 EditText 它的父级是 TextInputLayout 我试图以编程方式为 EditText 提供提示 不在布局中 在这种情况下 文本输入提示动画不起作用 它像简单的 EditText 一样工作 有人可以建议如何处理它吗 下
  • 如何构建自定义摄像机应用程序?

    我正在尝试开发一个自定义摄像机录像机 当我的设备在 Activity 的 beginRecording 中执行 start MediaRecorder 方法时 应用程序崩溃 我不知道出了什么问题 因为我遵循谷歌API指南 http deve
  • 由于“进程崩溃”,仪器运行失败。

    我想运行以下测试 package com xxx yyy import android content Context import androidx test InstrumentationRegistry import androidx
  • Android Gradle 同步失败:无法解析配置“:classpath”的所有工件

    错误如下 Caused by org gradle api internal artifacts ivyservice DefaultLenientConfiguration ArtifactResolveException Could n
  • Android AdMob:addView 在返回活动之前不会显示广告

    我正在尝试在游戏顶部添加横幅广告 我的活动使用带有自定义 SurfaceView 的relativelayout 我希望广告与 SurfaceView 重叠 广告会加载并可点击 但不会绘制到屏幕上 当我离开活动并返回时 会绘制广告 例如 通
  • 使用Intent拨打电话需要权限吗?

    在我的一个应用程序中 我使用以下代码来拨打电话 Intent intent new Intent Intent ACTION CALL Uri parse startActivity intent 文档说我确实需要以下清单许可才能这样做
  • 如何正确编写AttributeSet的XML?

    我想创建一个面板适用于 Android 平台的其他小部件 http code google com p android misc widgets 在运行时 XmlPullParser parser getResources getXml R
  • 为什么带处理程序的连续自动对焦相机不允许切换相机闪光灯?

    到目前为止我所做的 我已经实现了用于读取二维码的自定义相机 需要继续聚焦相机以获得更好的二维码读取 我的问题当我使用处理程序每 秒聚焦一次时 相机闪光灯开 关按钮不起作用 或者打开和关闭相机闪光灯需要太多时间 当我删除每秒自动对焦相机的代码

随机推荐

  • 驼峰命名法与下划线命名法之争

    窃以为 xff0c 驼峰命名开发效率更高 xff0c 原因如下 xff1a 下划线命名多输入一个字符 例如 xff1a set name 对比 setName xff0c 多输入一个下划线字符 xff0c 敲击键盘两次Shift 43 而驼
  • [PyQt] 在QLabel上用drawText实现文字滚动

    span class token keyword from span PyQt4 span class token punctuation span QtGui span class token keyword import span sp
  • [PyQt] PyQt4写的音乐播放器

    实现了 xff1a 播放歌曲 xff1b 上 下一首 xff1b 随机 循环 单曲循环 xff1b 批量添加 删除歌曲 xff1b 打开 存储播放列表 xff08 M3U格式 xff09 xff1b 添加到收藏 xff1b 单行 多行歌词桌
  • [PyQt] 使用.qrc 生成资源文件供程序中使用

    建立 images qrc文件 xff0c 里面保存了资源位置 xff1a span class hljs doctype lt DOCTYPE RCC gt span span class hljs tag lt span class h
  • Tcl/tk实例-工具栏和菜单-图片预览工具

    可以打开并查看图片 xff0c 点击工具栏上 Previous 和 Next 按钮来浏览 前 下 一张 仅仅是一个例子 xff0c 其它按钮和菜单未添加命令 package require Ttk package require Img p
  • Tcl/tk实例—使用tclkit工具将脚本打包成可执行文件(.exe)

    下载 tclkit exe 工具 xff0c 及 sdx kit 文件 复制一份tclkit exe xff0c 命名为tclkit2 exe 假设你的脚本文件为 xff1a app tcl Step1 命令行执行 tclkit exe s
  • C语言将十进制转换成十六进制

    include lt stdio h gt main char arr 50 61 34 34 char p 61 arr int i scanf 34 d 34 amp i 输入一个十进制的数 int result 61 0 while
  • 软件版本中的release,stable,alpha,beta,pre,snapshot

    转自 xff1a https www jianshu com p aefe0453d081 我们在下载软件会遇到诸如release stable alpha beta pre current eval rc snapshot等版本 xff0
  • kylin ubuntu20.04使用记录

    1 配置dns vim etc systemd resolved conf 修改 DNS 61 119 29 29 29 223 5 5 5 多个DNS地址使用空格分隔 2 配置samba sudo vim etc samba smb co
  • linux进程、线程状态 tomcat线程数 并发数查看

    1 linux进程查看 ps aux top USER PID CPU MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0 0 0 0 10368 116 Ss Jan16 4 57 init
  • 字符编码(三) 字节序、bit序、 有效位

    1 字节序 xff1a 一个 xff08 占多字节的 xff09 数据单元的字节顺序 Java中byte没有字节序问题 xff0c 其他都有字节序问题 不必考虑byte内部bit的细节 bit序 xff1a 一个字节内 xff0c bit的
  • STM32:串口发送

    1 main c代码如下 include stm32f10x h nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp Device header include Delay h include OLED
  • 太阳晒进屋里 太刺眼懒得起来关窗帘?做一个光感遥控吧

    在一个智能音响的交流群里 xff0c 有位群友提出了个想法 xff0c 家里太阳晒进屋里每次都要起来拉窗帘 xff0c 有没有什么办法可以让太阳晒进屋就关窗帘 xff0c 没太阳了又打开窗帘能 xff1f 后来这位群友找到我 xff0c 我
  • 用Python爬虫获取NBA球员的生涯数据

    NBA球迷往往对球员的各项数据以及对应的排名很感兴趣 xff0c 而basketball reference com这个网站的数据十分详尽 为方便浏览 xff0c 我在github建了一个项目 xff0c 借助该网站提供的数据来汇总某个球员
  • FreeRTOS 二值信号量

    参考 开发手册 二值信号量 简介 二值信号量通常用于互斥访问或同步 xff0c 二至信号量没有优先级继承 xff0c 更适合用于同步 xff08 任务与任务或任务与中断的同步 xff09 二值信号量其实就是一个只有一个队列项的队列 xff0
  • QGC地面站二次开发 环境搭建过程

    文章目录 将本机文件复制到安装的虚拟机系统中方法一方法二 ubuntu QT 安装过程问题一 xff1a 安装开始的时候 xff0c 显示磁盘容量不足 问题二 xff1a 现需解决 磁盘已成功扩展 您必须从客户机操作系统内部对磁盘重新进行分
  • c++应该怎样学习?c++服务器开发必备知识

    笔者从事软件开发工作5年 针对c 的特性 用途 整理的进阶式学习笔记 从浅入深地总结重点知识 本文旨在为c c 初学者 初中级开发者和意在转型c 服务器研发的同学们 对基础知识和进阶路线进行详细的整理 适合c 初学者 c 中高级开发岗的同学
  • Hadoop 安装与 HDFS 基础实践

    一 环境 xff08 1 xff09 操作系统 xff1a Linux Ubuntu 20 04 xff08 2 xff09 Hadoop 版本 xff1a 3 3 2 xff08 3 xff09 JDK 版本 xff1a 1 8 或者以上
  • select版的TCP通信

    编写代码之前 xff0c 大概先说一下利用select编写tcp的思路及select特点 select系统调用是用来让程序监视多个文件句柄的状态变化的 xff0c 程序会停在select这里等待 xff0c 直到被监视的句柄有一个或者多个发
  • ubuntu20.04上编译android 7.1

    一 安装 OpenJDK 8 sudo apt get install openjdk 8 jdk 提示 xff1a 安装 openjdk 8 jdk xff0c 会更改 JDK 的默认链接 xff0c 这时可用 xff1a sudo up