【Qzone】入戏太深 第四步 创建一个新的Android产品项目 模拟器版

Android编译系统分析四:实战-新增一个产品 Android编译系统分析系列文章: android编译系统分析一 Android编译系统-mm编译单个模块 android编译系统分析(三)-make android编译系统(四)-实战:新增一个产品 通过上一节“android编译系统(三)-make”的分析,初步理清楚了编译初期加载产品相关信息的流程,整个过程主要涉及三个文件:1.AndroidPro 阅读详情

2015-1-30 19:54


创建一个新的Android产品项目 (模拟器版)


如果要开发自己的产品,则需要定义一个产品项目,过程如下。

首先我们定义产品的规格,假设如下:

公司名称 anne

产品名称 DWP

主板名称 devwangboard

然后按照下面的步骤新建产品项目:

第(1)步:在源代码目录下创建一个用户目录

命令mkdir vendor 
图片 
 
 
第(2)步:在用户目录下创建一个公司目录

命令mkdir vendor/anne
图片
图片

 
第(3)步:在公司目录下创建一个products目录

命令mkdir vendor/anne/products
图片
图片


第(4)步:在上面创建的products下创建一个makefile文件DWP.mk,这个文件至少包含如下代码:

# Overrides

PRODUCT_BRAND :=anne

PRODUCT_NAME := DWP

PRODUCT_DEVICE := devwangboard

如果没有BRAND则会出错,亲测,另外这个文件的内容还要添加如下,不然会开不了机。

PRODUCT_PACKAGES :=\

AlarmClock \

Email \

Fallback \

Launcher2 \

Music \

Camera \

Settings \

LatinIME \

NotePad \

SoundRecorder \

CertInstaller \

DeskClock

$(call inherit-product, $(SRC_TARGET_DIR)/product/core.mk)

# Overrides

PRODUCT_MANUFACTURER := anne

PRODUCT_BRAND :=anne

PRODUCT_NAME := DWP

PRODUCT_MODEL := Devwang Phone

PRODUCT_DEVICE := devwangboard

PRODUCT_LOCALES := zh_CN
产品makefile文件的编写有一套规则,详细的可以上网查询。
图片
图片

第(5)步:在vendor/anne/products目录下创建一个AndroidProducts.mk文件,定义Android产品配置文件mk的路径,也就是DWP.mk文件的路径,具体如下:
PRODUCT_MAKEFILES := \

 $(LOCAL_DIR)/DWP.mk
图片
图片


第(6)步:在公司目录下创建一个主板目录,此目录名必须与第(4)步中特定产品的makefile中PRODUCT_DEVICE变量值相同。这个目录下将包括一个makefile文件BoardConfig.mk,

它会被用到此板的产品使用。
命令mkdir vendor/anne/devwangboard
图片
图片

第(7)步:在主板目录下新建一个主板配置文件BoardConfig.mk,内容如下:

TARGET_NO_BOOTLOADER := true

TARGET_NO_KERNEL := true

TARGET_CPU_ABI := armeabi

BOARD_USES_GENERIC_AUDIO := true

USE_CAMERA_STUB := true

图片
图片

第(8)步:如果你希望修改系统属性,则可以在主板目录下 新建一个system.prop文件,该文件中可以修改系统属性,举例如下:

# system.prop for

# This overrides settings in the products/generic/system.prop file

#

# rild.libpath=/system/lib/libreference-ril.so

# rild.libargs=-d /dev/ttyS0
图片 
图片

第(9)步:在主板目录下 新建一个Android的主板配置文件AndroidBoard.mk,此文件是编译系统接口文件,内容如下:

# make file for new hardware  from

#

LOCAL_PATH := $(call my-dir)

 

#

# this is here to use the pre-built kernel

ifeq ($(TARGET_PREBUILT_KERNEL),)

TARGET_PREBUILT_KERNEL := $(LOCAL_PATH)/kernel

endif

 

file := $(INSTALLED_KERNEL_TARGET)

ALL_PREBUILT += $(file)

$(file): $(TARGET_PREBUILT_KERNEL) | $(ACP)

        $(transform-prebuilt-to-target)

 

#

# no boot loader, so we don't need any of that stuff..  

#

LOCAL_PATH := vendor/ardent/merlin

include $(CLEAR_VARS)

#

# include more board specific stuff here? Such as Audio parameters.      

#
图片

图片


第(10)步:编译新的项目

在编译之前要执行命令: . build/envsetup.sh

注意点号.和build之间有个空格,不然会出错。

图片


命令:lunch 产品号
图片


命令:make PRODUCT-DWP-user
图片 

编译需要一定的时间,一段漫长的等待。亲测要做顿饭+吃顿饭的时间,嘿嘿。

参考博客:http://blog.youkuaiyun.com/wh_19910525/article/details/7993266

OK 

编译完之后生成如下四个文件。

图片

运行模拟器需要配置的环境变量

export PATH=/home/devwang/android-2.3.7_r1/out/host/linux-x86/bin
export ANDROID_PRODUCT_OUT=/home/devwang/android-2.3.7_r1/out/target/product/devwangboard

图片

运行模拟器 不带带参数
kernel也可以的
emulator -kernel ./kernel/goldfish/arch/arm/boot/zImage &
图片

打开设置关于手机查看
图片 

OK OK OK


工业互联网工控安全与工业质检AI大模型建设方案.pptx 立即下载

相关推荐

2024 《计算机网络》实验教学指导书.doc

2024 《计算机网络》实验教学指导书.doc

下载android源码,在android源码中增加模块,用模拟器运行新增模块。

基于android系统源码增加模块 我的android学习目录:drjiang@drjiangISS:~/work/android$ drjiang@drjiangISS:~/work/android$ls -l 总用量70148 drwxr-xr-x2 drjiang drjiang 4096 4月 414:57 blog drwxr-xr-x3 drjiang dr

风轻云淡 1072

施密特触发电路详细原理介绍

我们想获得矩形脉冲,有种方法是可以采用整形的方法获得矩形脉冲,但前提是可以找到频率和幅度都符合要求的电压信号。 我们设定矩形脉冲的几个指标。 施密特电路是脉冲波形变换中一种常采用的电路,主要有以下两个特点: 1.输入电平从低电平上升过程中电路状态转换为对应的输入电平,与高电平下降过程中对应的输入转换电平不同。 2.通过电路内部的正反馈使输出电压波形的边沿变得很陡。 施密特电路的结构和工作原理 我们先从模电的角度来分析此电路的工作原理。 此电路是通过公共发射极电阻耦合的两级正反馈放大器。 v1输入为低电平

fcxgfdjy的博客 1万+

编译Android源码,并用模拟器启动编译好的镜像

进入Android目录,首先清除之前的编译: make clobber 然后设置环境: source build/envsetup.sh 选择编译的文件,直接输入命令: lunch BUILDTYPE 是以下类型之一: 编译类型 使用情况 user 权限受限;适用于生产环境 userdebug 与“user”类似,但具有 root 权限和可调试性;是进行调试时的首选编译类型 eng 具有额外调试工具的开发配置 如下: gs@aigo:~/02_

gs344937933的专栏 4832

2026零成本私有化:OpenClaw一键搭建Discord/Telegram智能机器人,数据不出本地,永久免费替代ChatGPT

如果内置的功能不能满足你的需求,你可以很容易地添加自己的自定义工具。public string Description => "查询指定城市的天气";// 调用天气API获取天气信息return $"city今天的天气是晴,温度25度";// 注册工具今天北京的天气怎么样?大模型的选择很重要:不要盲目追求大参数的模型。对于大多数场景来说,7B参数的模型已经足够用了,而且速度快,内存占用低。上下文长度不要设置太大:上下文长度越大,内存占用越高,推理速度越慢。

2601_94871597的博客 259

LaTeX双栏浮动结构实战:用dblfloatfix解决跨栏图表排版难题

本文深入探讨了LaTeX双栏浮动结构在学术论文排版中的常见问题,特别是IEEE会议论文中的跨栏图表定位难题。通过介绍dblfloatfix包的整合解决方案,帮助用户实现精准的底部定位和浮动顺序保持,提升排版效率与质量。

weixin_30872499的博客 442

grep查找字符串所在文件和行号,find查找文件所在目录即路径

grep查找字符串所在文件和行号,find查找文件所在目录即路径 1、grep -rin "app.te" device/ 注意:i-忽略大小写、n-显示行号。 device/mediatek/common/BoardConfig.mk:56: app.te \ device/mediatek/common/BoardConfig.mk:67: untrusted_app

新生代CV搬运工 4万+

华为擎云W515 PGUV-WBY0安装银河麒麟V10全流程解析

本文详细解析了华为擎云W515 PGUV-WBY0安装银河麒麟V10系统的全流程,包括准备工作、镜像下载与校验、启动盘制作、BIOS设置、安装过程关键选择、系统初始化及常见问题排查。特别针对ARM架构设备提供了实用技巧,帮助用户顺利完成国产化系统的部署与优化。

weixin_28725949的博客 696

grep -E 即 egrep 匹配多个

grep --help -E, --extended-regexp     PATTERN 是一个可扩展的正则表达式(缩写为 ERE) ‘egrep’即‘grep -E’。 匹配单个,不用双引号: ls | grep  file 匹配多个,要加参数,使用双引号: ls | grep -E "file1|file2" ls | egr

新生代CV搬运工 3万+

【Python程序开发】湖南省职业院校技能大赛python程序开发赛项样题二

【Python程序开发】湖南省职业院校技能大赛python程序开发赛项样题二

况老师话竞赛&blog 2192

搞定ESD(七):静电放电问题典型案例分析(二)

静电放电噪声耦合的方式主要是:传导耦合与辐射耦合,辐射耦合主要以磁场耦合、 电场耦合为主要形式。电场耦合发生的主要条件是:静电放电高频在参考地平面寄生电感中产生电平波动,平行于参考地平面上的较长信号布线就很容易通过分布电容发生电场耦合。根据高速信号回流路径的特性可知,其回流路径是贴近信号布线下方,或者信号两侧,若信号回流路径跨分割后,环路面积会随之增大;信号环路面积大从EMI角度看其空间辐射更强,从EMS角度看则更容易耦合外部噪声干扰(雷击浪涌、EFT、ESD、RS)。

记得诚 2800

ERROR 'duplicate declaration of type/attribute' at token ';' on line 14430

MTK添加Android权限te文件后,编译make bootimage报重复duplicate错误。 错误信息: ------------------------------------------------------------------------ out/host/linux-x86/bin/checkpolicy: loading policy configurati

新生代CV搬运工 1万+

记录Android Studio连接华为(nova)手机鸿蒙系统踩过的坑

鸿蒙系统的华为老机子比较麻烦,坑有点多,兄弟们加油!

沉迷单车的追风少年 7920

c语言 int与byte[]互相转换

c语言 int与byte[]互相转换 root@ubuntu:/media/mtk6795/alps/sunwave_pub# gcc -g test.c root@ubuntu:/media/mtk6795/alps/sunwave_pub# gdb ./a.out GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04 Cop

新生代CV搬运工 1万+

基于LUT表对鱼眼图像进行畸变校正

当然也可以进行图像的畸变校正操作,已知相机的焦距为fx/fy,光心为cx/cy,像素大小为p(单位mm/pixel)对于畸变校正结果图中像素点(u,v),其对应的原图中的像素坐标(u',v')的计算流程描述如下。1)假设无畸变相机成像模型的焦距和光心与原相机相同,计算得到无畸变相机成像模型中归一化平面坐标(X,Y,Z),其中X=(u-cx)/fx,Y=(v-cy)/fy,Z=1。这里x'/y'的单位为像素。

On my way 639

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

find . -type f ! -name "*.o" 排除某类文件 排除多类文件 排除隐藏文件

# ls 先看看有的文件,这是linux中特有的android驱动。(目录:kernel/drivers/staging/android/) # find . -type f ! -name "*.o" 排除以“.o”结尾的文件,但是把隐藏文件(以“.”开头的文件)也查出来了。也就是排除某类文件。 # find . -type f ! -name "

新生代CV搬运工 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

小米系列手机开源代码

小米系列手机开源代码 https://github.com/MiCode/Xiaomi_Kernel_OpenSource

新生代CV搬运工 8309

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

VMware 已经安装了【VMware Tools】 却不能进入Unity模式(Ubuntu12.04)

VMware 已经安装了【VMware Tools】 却不能进入Unity模式(Ubuntu12.04) 修改启动方式: 以GNOME Classic(No effects)方式启动ubuntu, 才可以进入Unity模式。

新生代CV搬运工 7386

find & grep 结合查找 某字符串 所在文件

1、 在当前目录下所有文件中查找内容包含 字符串 bruce_xxx 的文件: # find ./ -name "*" -exec grep "bruce_xxx" {} \; ----------------------------------- root@ubuntu:/media/4412-5.0_/bruce-4412-5.0/android-5.0.2/brucepat

新生代CV搬运工 7127

编写第一个Android Native Service

编写第一个Android Native Service :SQRService,求平方(Square)运算。 为什么有核心服务呢?  1. 核心服务是 Android 框架里最接近Linux/Driver 的部分。为了充分发挥硬件设备的差异化特性,核心服务是让上层Java 应用程序来使用Driver/HW Device 特色的重要管道。 2. 在开机过程中,就可以启动核心服务(例如汉

新生代CV搬运工 5149

查看中断号cat /proc/interrupts |grep sw_irq

查看中断号cat /proc/interrupt |grep sw_irq

新生代CV搬运工 4946

adb logcat 2>&1 | tee log.log

好吧, 之前傻傻只知道使用eclipse的logcat查看手机的log日志; 有时经常导致adb.exe挂了。 新方法, 在ubuntu使用命令查看手机log。  adb logcat 2>&1 | tee log.log 2是标准错误,&1是标准输出,2>&1意思就是将标准错误输出到标准输出中 Ctrl + C 停止。

新生代CV搬运工 3668

Linux下Binder驱动源码(linux-3.0.86)

以linux-3.0.86为例 目录:linux-3.0.86/drivers/staging/android/ binder.c /* binder.c * * Android IPC Subsystem * * Copyright (C) 2007-2008 Google, Inc. * * This software is licensed under

新生代CV搬运工 3179

修改vmware虚拟机的虚拟磁盘卷标

打开 虚拟磁盘 vmdx 名字 很长 fb8b73ae-97fe-4064-a698-e18b56a22aec 现象: 挂载自己新建的虚拟磁盘vmdx后,/media/下名字变成一连串字母。 解决: ubuntu中使用 磁盘实用工具,在虚拟磁盘未挂载时修改卷标。

新生代CV搬运工 2747

mtklog 日志到一定条件自动删除

MTK平台手机中, 开启MTKLogger后,记录一段时间后,部分日志会被删除。为什么呢? 原因在于,配置文件mtklog-config.prop中,配置的日志的大小size。 路径:/etc/mtklog-config.prop 命令:cat /etc/mtklog-config.prop mtklog_path = internal_sd com.mediatek.log.m

新生代CV搬运工 2654

kernel时间戳转android时间

kernel时间戳转android时间

新生代CV搬运工 2439
上一篇: 【Qzone】向来缘浅 奈何情深 第三步 编译Android内核源代码
下一篇: 【···[ て]おきます】做好准备
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值