当前位置:首页 » 安卓系统 » android代码统计

android代码统计

发布时间: 2023-03-19 14:16:38

Ⅰ Android端的用户行为统计和日志打捞方案

        提到移动客户端的优化,大家首先想到的可能就是页面的流畅度,也就是CPU和GPU的渲染问题,以此来提升用户的体验,然而对于CPU和GPU渲染的优化又是APP优化的两把尖刀,让一个app提升用户量和体验度有较高的推动力。然而让我们无法预估的就是用户的实际操作,也就是已经发出去的版本,我们很难知道用户喜欢什么功能和他们想要什么功能以及他们习惯于什么样的操作姿势,包括用户安装、卸载不用的情况,并且对潜在的线上崩溃问题,作为一位开发者我们就很想知道错误出现的精确位置以及错误信息,这些对一个APP的成长来说将是一个关键的导向作用,其实这也算是APP的一个比较重要的优化方案。

           对于以上出现的问题,开发者更关心APP的Crash问题,而对于产品来说,他们更关心用户的喜好、行为和需求,以便于产品设计出更好的需求解决方案,目前市场上也出现了专门的问题解决方案,比如友盟统计、bugly统计、小米统计等,对于一个小型方案我们可以采用第三方的统计方案,但对于一个日活百万乃至千万的APP来说用第三方的统计方案就会受限很多,于是拥有自己的一套统计方案就显的刻不容缓了,掌握市场的方向,我们就掌握了主动权,那么我们怎样去设计一套准确优良的统计方案。

1.1 传统的pc端统计

以老牌的pc上的web页面统计一般有PV.UV,和IP之分,对于crash问题,本身web页面就存在远程的服务器端,日志将会保存在服务器的目录,所以一般web项目开发者无需考虑收集Log的case,那么我们更care的就是上面说的行为统计,下面说说这三种统计区别。  

2. 2、IP、PV和UV分别是什么意思?

IP,实际上也就是指独立IP,是独立IP数的意思。00:00—24:00时间内相同IP地址只记录一次。即使你有多台电PC,但是如果IP地址是一样的,那么也只能算是一个IP的访问,IP数据依然为1。当然多台pc的ip一般都不一样,除非你插上同一个网络端口然后换零一台连接,都是一样,同时连接多台,每台pc的IP就是不一样的。

PV, 指访问量,它的英文是PageView,具体是指网站的是页面总浏览量或者点击量,页面被刷新一次就计算一次。如果网站被刷新了10次,那么流量统计工具显示的PV就是10 。

UV,它是独立访客的意思,英文为Unique Visitor。具体指访问您网站的一个客户端(移动设备或者是电PC)为一个访客。00:00-24:00内相同的客户端(mac地址区分)只被计算一次。

3 . 3 IP、PV和UV之间的关系是什么?

1.3.1.IP和PV之间的关系

PV是和IP的数量是成正比的,因为页面被刷新一次那么PV就会被记录一次,所以IP越多,说明网站的PV数据也就随之增多。但是需要注意的是PV并不是网站的页面的访问者数量,而是网站被访问的页面数量。因为一个访问者可以多次刷新页面,增加PV数量。

1.3.2 .IP和UV之间的关系:

在记录网站流量统计数据时,运维有时候发现这样一种情况:有时候网站的IP数据大于UV数据,有时候UV的数据也会大于IP数据。为什么会出现这种现象呢?我们可以用一个例子来说明。比如,用同一个IP去访问我们的某个网站,但是一个是用的台式的电脑,一个是用的笔记本,那么网站流量统计工具显示的数据就会是2个UV,1个IP。这时UV的数据就会大于IP的数据。但是,再比如,只是用一个台式电脑访问我们的网站,但是一会拨一个号换一个IP,那么这时候网站流量统计工具显示的数据的UV就为1,但是IP的数据就会高于UV的数据。因此,IP和UV之间的数据并不一定存在比例关系,两者之间的数据也不是此消彼长的关系。

1.3.3.IP和PV之间的关系:

那么IP和PV的关系如何呢?如果一个IP刷新了网站100次,网站的PV就为100,所以从这点看二者之间没有多大关系。但是,我们可以通过IP和PV之间的数据差异,来更加深入的理解网站的流量数据。如果IP和PV的数据悬殊很大,比如,我们在查看网站流量数据时发现网站的PV是1000,IP为100,那么说明这个站点平均一个IP访问了网站内容10次,说明网站内容还是比较受欢迎的,所以访客才愿意在网站中停留那么久的时间,并浏览了那么多的网站页面内容。但是如果IP和PV的数据很接近,比如,网站的IP为100,PV为110,说明一个IP也就访问了网站内容大约1次,就说明网站内容的可读性太差,客户点击进去之后就离开了,没有有过多的停留。如果网站流量统计这样的数据过多的话,站长就需要对网站内容进行深入思考了,以便更好的提高网站的流量。

1.4 我们能从这边得到什么

鉴于已经很成熟的统计方案,我们在移动设备上(这里只说android)怎样实现一个完美的用户数据和行为统计,崩溃日志的套装方案呢。

那么我们的一个App,我们能做的那些方面呢

2.1 .1 用户数据(日活)

首先我们的可以加入ip,PV和UV统计模式,这样我们可以成功的get到app的日活,以及整体使用情况, 

比如App启动了多少次,访问了多少h5页面,有多少个ip(设备)访问过,但是我们无法得native页面的信息(也就是Activity)服务端是是无法获取的,除非我们本地的页面有加载服务端数据的接口的功能,这种情况下服务是可以监控到本页面的数据流量的,但是在断网情况下,服务端是无法及时获取日活数据的,那么怎么解决呢,这里先不说,先看下个要解决的问题。

2.1.2 用户行为

获取到了APP整体流量后,怎么能知道某个功能受欢迎,或者某个本地页面经常被用户使用呢,则具体行为统计是app必须的, 目前一般由客户端和服务器端协商好一套自定义事件字典(也就是所谓的统计id对照表),当用户使用某个功能时,我们将对应的功能id发送到后台。这样服务端就有统计用户行为的能力了,那么这种只是一种初次尝试的想法,那么断网,或者功能多的情况子下,我们有如何采集用户行为呢

2.1.3 Log日志

那么对于线上的app版本,又是怎样收集carsh日志呢。一般我们在app崩溃的时候发送一条请求到服务端,是可以实现的,但没必要做,一般是将日志保存到本地,在某个时间或者case触发上报行为,

三 综合方式。

一般统计策略不会采用单一的方式进行上报,多采用组合的形式实现,服务器和客户端,有网和没网,实时和不定时。主动和被动的策略。

1 服务端

客户端请求接口是 统一包含特定的请求头,服务端的每个接口中可以去采集这些请求头 记录访问量 包括ip,PV,UV , 这样可以去捕获一定的用户数据。

服户端也可以采用推送的形式,让客户端去发送特定的采集好信息上报给服务器。

2 客户端

统计一般大多体现在客户端,我们可以将一个整体的app分解成多个模块,每个模块有多个功能,功能又分为用户主动和被动接受之分,给每个域分配一定的ID,那么在用户使用某个功能时 我们动态记录这个ID(比如登陆和注册一般属于用户中心(001),登陆和注册输入两种功能,分别给03,04标记,登陆属于用户主动 那么可以给 01,注册被动跳转给02), 最后写入到本地保存,那么用户打开用户中心登陆产生的的数据信息就0010201 ,这样服务器能知道,我们只要在某个时间点将文本数据上传即可,即使没网络情况下我们也不怕,等设备有网的情况下 我们偷偷上报即可,那么我们也可以在用户登陆的时候时侯同时就上传这些数据,这个策略视具体功而定。 

一般一个APP统计有模块域 ,功能域,事件域,由大到小分配而来,也有按页面区分的,具体看实际的需求场景而定

对于我们的app crash 我们可以继承android自带的全局异常类(UncaughtExceptionHandler),来进行自我捕获异常,和用户行为一起上报。

也可以单独加个意见反馈功能,采集用户的吐槽和建议。

说了上面一大堆策略问题,对于开发而言很可能觉得很无聊,那么至于统计其实没什么技术含量(用户设备的唯一标识符除外),无非就是采集数据写到文件中,请求发送数据,最重要的还是一种策略的定义。

主流的多采用 时间戳,内存大小(日志积累到多大字节),次数(总计积累到多十条)等,

对于好的统计,我们可以检测网络,检测home建来触发我们的上报数据接口,也可以采用注册静态广播,用alarm 闹钟定时上报数据,然后这些技术也就是被大家玩透的功能而已,没必要再这里给大家补脑,但是注意的是

统计设备唯一标识符的确定, 这个以后再去分析.

统计上报接口采用分布式,不然所有数据都请求同一个接口,那么日活大的情况下,服务器挂了 不仅无法收到数据,反而影响客户端其他正常的功能

Ⅱ Android 如何统计每个应用程序使用的wifi流量

学习数码知识,就上枫情论坛!

Ⅲ 在Android中要实现图表统计该怎么做

package com.yzxy.draw;

import java.util.ArrayList;
import java.util.HashMap;
import com.yzxy.draw.tools.Tools;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;
import android.graphics.RectF;
import android.graphics.Paint.Style;
import android.graphics.Typeface;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

@SuppressLint("ViewConstructor")
class MyTuView extends View{

public static final int RECT_SIZE = 10;
private Point mSelectedPoint = null;
public static enum Mstyle
{
Line,scroll
}

private Mstyle mstyle=Mstyle.Line;
private Point[] mPoints = new Point[8];

Context context;
Activity act;
int bheight=0;
Tools tool=new Tools();
HashMap map;
ArrayList dlk;
int totalvalue=30;
int pjvalue=5;
String xstr,ystr;
int margint=15;
int marginb=40;
int c=0;
int resid=0;
Boolean isylineshow;

public MyTuView(Context context,HashMap map,int totalvalue,int pjvalue,String xstr,String ystr,Boolean isylineshow)
{
super(context);
this.context=context;
this.act = (Activity)context;
this.map=map;
this.totalvalue=totalvalue;
this.pjvalue=pjvalue;
this.xstr=xstr;
this.ystr=ystr;
this.isylineshow=isylineshow;
act.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}

@SuppressLint("DrawAllocation")
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// canvas.drawColor(Color.GRAY);
if(c!=0)
this.setbg(c);
if(resid!=0)
this.setBackgroundResource(resid);
dlk=tool.getintfrommap(map);
int height=getHeight();
if(bheight==0)
bheight=height-marginb;

int width=getWidth();

Log.i("w", getWidth()+":"+getHeight());
int blwidh=tool.dip2px(context,50);
int pjsize=totalvalue/pjvalue;

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.GRAY);
paint.setStrokeWidth(1);
paint.setStyle(Style.STROKE);

// 画直线(横向)
for(int i=0;i xlist=new ArrayList();//记录每个x的值
//画直线(纵向)
for(int i=0;i dlk,HashMap map,ArrayList xlist,int max,int h)
{
Point[] points=new Point[dlk.size()];
for(int i=0;i getMap() {
return map;
}

public void setMap(HashMap map) {
this.map = map;
}

public int getTotalvalue() {
return totalvalue;
}

public void setTotalvalue(int totalvalue) {
this.totalvalue = totalvalue;
}

public int getPjvalue() {
return pjvalue;
}

public void setPjvalue(int pjvalue) {
this.pjvalue = pjvalue;
}

public String getXstr() {
return xstr;
}

public void setXstr(String xstr) {
this.xstr = xstr;
}

public String getYstr() {
return ystr;
}

public void setYstr(String ystr) {
this.ystr = ystr;
}

public int getMargint() {
return margint;
}

public void setMargint(int margint) {
this.margint = margint;
}

public Boolean getIsylineshow() {
return isylineshow;
}

public void setIsylineshow(Boolean isylineshow) {
this.isylineshow = isylineshow;
}

public int getMarginb() {
return marginb;
}

public void setMarginb(int marginb) {
this.marginb = marginb;
}

public Mstyle getMstyle() {
return mstyle;
}

public void setMstyle(Mstyle mstyle) {
this.mstyle = mstyle;
}

public int getBheight() {
return bheight;
}

public void setBheight(int bheight) {
this.bheight = bheight;
}

public int getC() {
return c;
}

public void setC(int c) {
this.c = c;
}

public int getResid() {
return resid;
}

public void setResid(int resid) {
this.resid = resid;
}

}

代码片段
package com.yzxy.draw.tools;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Environment;

public class Tools
{
private final static String ALBUM_PATH = Environment.getExternalStorageDirectory() + "/yueqiu/";

public int dip2px(Context context, float dpValue)
{
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}

public int px2dip(Context context, float pxValue)
{
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}

public ArrayList getintfrommap(HashMap map)
{
ArrayList dlk=new ArrayList();
int position=0;
@SuppressWarnings("rawtypes")
Set set= map.entrySet();
@SuppressWarnings("rawtypes")
Iterator iterator = set.iterator();

while(iterator.hasNext())
{
@SuppressWarnings("rawtypes")
Map.Entry mapentry = (Map.Entry)iterator.next();
dlk.add((Double)mapentry.getKey());
}
for(int i=0;i

代码片段
package com.yzxy.draw;

import java.io.IOException;
import java.util.HashMap;

import com.yzxy.draw.MyTuView.Mstyle;
import com.yzxy.draw.tools.Tools;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;

import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
import android.widget.Toast;
import android.app.Activity;
import android.content.res.XmlResourceParser;
import android.graphics.Bitmap;
import android.graphics.Color;

public class MainActivity extends Activity {

MyTuView tu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

HashMap map=new HashMap();
map.put(1.0, 8.0);
map.put(7.0, 130.0);
map.put(2.0, 4.0);
map.put(3.0, 1.0);
map.put(4.0, 18.0);
map.put(5.0, 160.0);
map.put(6.0, 180.0);
map.put(8.1, 133.5);
tu=new MyTuView(this,map,200,50,"x","y",false);
// tu.setC(Color.CYAN);
tu.setResid(R.drawable.bg);
// tu.setBheight(200);
tu.setTotalvalue(200);

tu.setPjvalue(50);
tu.setXstr("x");
tu.setYstr("y");
tu.setMargint(20);
tu.setBackgroundColor(Color.WHITE);
tu.setMarginb(50);
tu.setMstyle(Mstyle.scroll);
RelativeLayout rela=getlayout(R.layout.activity_main);
rela.addView(tu);
LayoutParams parm=new LayoutParams(1200,400);
parm.setMargins(50, 50, 50, 100);
tu.setLayoutParams(parm);
setContentView(rela);

}

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item)
{
// TODO Auto-generated method stub
if(item.getItemId() == R.id.menu_settings)
{
if (false == tu.isDrawingCacheEnabled())
{
tu.setDrawingCacheEnabled(true);
}
Bitmap bitmap = tu.getDrawingCache();
Tools tool=new Tools();
try {
Boolean b=tool.saveFile(bitmap, "aaaa.png");
if(b)
Toast.makeText(this, "success", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(item.getItemId() == R.id.menu_ch)
{
HashMap map=new HashMap();
map.put(1.0, 21.0);
map.put(3.0, 25.0);
map.put(4.0, 32.0);
map.put(5.0, 31.0);
map.put(6.0, 26.0);

tu.setTotalvalue(40);
tu.setPjvalue(10);
tu.setMap(map);
tu.setIsylineshow(true);
tu.postInvalidate();
}
if(item.getItemId() == R.id.menu_ch2)
{
HashMap map=new HashMap();
map.put(1.0, 41.0);
map.put(3.0, 25.0);
map.put(4.0, 32.0);
map.put(5.0, 41.0);
map.put(6.0, 16.0);
map.put(7.0, 36.0);
map.put(8.0, 26.0);
tu.setTotalvalue(50);
tu.setPjvalue(10);
tu.setMap(map);
tu.setMstyle(Mstyle.Line);
tu.setIsylineshow(false);
tu.postInvalidate();
}
return true;
}

public RelativeLayout getlayout(int r)
{
LayoutInflater inflater = (LayoutInflater)getSystemService(android.content.Context.LAYOUT_INFLATER_SERVICE );
try {
XmlResourceParser parser = getResources().getLayout(r);
RelativeLayout layout = (RelativeLayout) inflater.inflate(parser, null);
return layout;
}catch (Exception e) {
// TODO: handle exception
}
return null;
}
}

Ⅳ Android 权限统计

<uses-permission
android:name="${applicationId}.permission.JPUSH_MESSAGE"
android:protectionLevel="signature" /> 激光推送
<uses-permission android:name="android.permission.INTERNET" /> 网络
<uses-permission android:name="android.permission.CALL_PHONE" /> 打电话
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />存储
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />存储
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />这是在sd卡内创建和删除文件权限,添加该权限和
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />允许程序访问Wi-Fi网络状态信息
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />获取网络信息状态,如当前的网络连接是否有效
<uses-permission android:name="android.permission.READ_PHONE_STATE" />访问电话状态氏带羡
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />允许一个程序访问CellID或WiFi热点来获取粗略的位置
<uses-permission android:name="歼拍android.permission.RESTART_PACKAGES" />允许程序重新启动其他程序
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />改变WiFi状态
<uses-permission android:name="android.permission.GET_TASKS" />允许一个程序获取信息有关当前或最近运行的任务,一个缩略行凳的任务状态,是否活动等等
<uses-permission android:name="android.permission.RECORD_AUDIO" />允许程序录制音频
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />允许程序修改全局音频设置
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 允许程序开机自动运行
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />屏幕常亮
<uses-permission android:name="android.permission.WRITE_SETTINGS" />读写系统设置
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 允许一个程序打开窗口使用 TYPE_SYSTEM_ALERT,显示在其他所有程序的顶层
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />获取精确位置
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />访问定位额外命令
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />改变网络状态
<uses-permission android:name="android.permission.READ_LOGS" />读取系统日志
<uses-permission android:name="android.permission.SET_DEBUG_APP" />设置调试程序
<uses-permission android:name="android.permission.GET_ACCOUNTS" />访问账户Gmail列表
<uses-permission android:name="android.permission.USE_CREDENTIALS" />使用证书
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />管理账户
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />允许一个应用程序来管理文档的访问,通常是一个文档选择器部分
<uses-permission android:name="android.permission.REAL_GET_TASKS" />允许一个程序获取信息有关当前或最近运行的任务,一个缩略的任务状态,是否活动等等
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />允许程序禁用键盘锁
<uses-permission android:name="android.permission.CAMERA" />请求访问使用照相设备
<uses-permission android:name="android.permission.FLASHLIGHT" />使用闪光灯
照相设备并自动对焦拍照
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

Ⅳ 如何实现android累计流量统计

1、获取已安装app

List<PackageInfo>packageInfos=packageManager.getInstalledPackage(PackageManager.GET_PERMISSIONS);

2、循环对每个app判断是否有申请INTERNET权限,有则继续执行
for(PackageInfopackageInfo:packageInfos){
if(packageInfo.requestedPermissions.contains("android.permission.INTERNET")){
//执行第3步的获取
}
}

3、获取该app的名字以及上传/下载流量统计(先获取该app在整个手机中的专属id:uid,再通过TrafficStats的get方法获取)
4、将获取到的全部数据记录到自定义的javabean,然后集合到list集合中,最后在listview中设置适配器,将数据显示出来。

Ⅵ 安卓APP如何统计流量

安卓app统计流量使用,方式如下:

因为getUidRxBytes(int uid)和getUidTxbytes(int uid)包括了所有网络形式的流量,即包括WIFI和3g/2g.故需要监听WIFI变化,并记录WIFI过程中该uid应用使用的流量记录.

`

stants{
@Override
publicvoidonReceive(Contextcontext,Intentintent){
if(intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION)){
intwifistate=intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,WifiManager.WIFI_STATE_DISABLED);
if(wifistate==WifiManager.WIFI_STATE_DISABLED){//如果关闭
//结余本次wifi过程中uid应用的流量
}elseif(wifistate==WifiManager.WIFI_STATE_ENABLED){
//记录当前uid应用的流量.
}
}
}

Ⅶ android应用开发如何添加阅读量

对于Android应用开发而言,阅读量统计是比较常见的需求。以下是一些常用的添加阅读量的方法:1. 使用服务器后台记录阅读量:将应用中的文章或内容上传到服务器端存储,并在服务器端记录和统计阅读量神码辩,每次用户阅读时更新阅读量。

2. 使用计数器技术:通过使用计数器技术,每次用户浏览或点击应用内的内容时自动更新计数器,模茄从而实现阅读量的增加统计。

3. 使用第三方统计工具:通过安装第三方统计工具,可以实现应用内的阅读量或点击量统计,这些统计工具可以直接与应用程序游缺集成,无需编写额外的代码。

总之,添加阅读量的方式需要与应用的具体情况相匹配,也需要考虑用户隐私保护和防止作弊等问题。同时,需要注意对用户阅读量的评估和统计需要尽量合理,避免对用户行为造成不必要的干扰和影响。

Ⅷ Android的APP要如何统计数据

可以用openinstall的渠道统计功能实现,渠道包、h5链接还有广告平台都可以监控数据。

Ⅸ android如何监控统计各个应用程序运行的时间

1.打开拨号,输入*#*#4636#*#*


备注:此数据通常关机清零

Ⅹ 如何统计android软件的安装量

Installtion ID : UUID


统计应用安装量,google的官方做法是通过程序中生成UUID来完成需求。代码如下:

热点内容
安卓手机如何修改首屏 发布:2025-05-10 21:17:59 浏览:958
缓存关联替换 发布:2025-05-10 20:56:34 浏览:617
开源项目源码 发布:2025-05-10 20:56:24 浏览:35
php文章编辑 发布:2025-05-10 20:56:21 浏览:981
梦世界国际版服务器ip 发布:2025-05-10 20:35:35 浏览:257
编程树遍历 发布:2025-05-10 20:34:53 浏览:402
快牙怎么传文件夹 发布:2025-05-10 20:29:08 浏览:138
26个字母可以组成多少个密码 发布:2025-05-10 20:23:21 浏览:620
redhat启动ftp服务 发布:2025-05-10 20:19:19 浏览:865
初级编程视频教程 发布:2025-05-10 20:19:17 浏览:980