本文为转载 原文地址:点击打开链接

1、使用Build获取架构属性 
下面我们来根据源码看看通过Build这个类可以得到哪些配置信息,具体就不解释了,从命名基本可以理解其代表的属性。

public class Build {//当一个版本属性不知道时所设定的值。public static final String UNKNOWN = "unknown";//修订版本列表码public static final String ID = getString("ro.build.id");//显示屏参数public static final String DISPLAY = getString("ro.build.display.id");//整个产品的名称public static final String PRODUCT = getString("ro.product.name");//设备参数public static final String DEVICE = getString("ro.product.device");//主板public static final String BOARD = getString("ro.product.board");//cpu指令集public static final String CPU_ABI = getString("ro.product.cpu.abi");//cpu指令集2public static final String CPU_ABI2 = getString("ro.product.cpu.abi2");//硬件制造商public static final String MANUFACTURER = getString("ro.product.manufacturer");//系统定制商public static final String BRAND = getString("ro.product.brand");//版本即最终用户可见的名称public static final String MODEL = getString("ro.product.model");//系统启动程序版本号public static final String BOOTLOADER = getString("ro.bootloader");//硬件名称public static final String HARDWARE = getString("ro.hardware");//硬件序列号public static final String SERIAL = getString("ro.serialno");//build的类型public static final String TYPE = getString("ro.build.type");//描述build的标签,如未签名,debug等等。public static final String TAGS = getString("ro.build.tags");//唯一识别码public static final String FINGERPRINT = getString("ro.build.fingerprint");public static final long TIME = getLong("ro.build.date.utc") * 1000;public static final String USER = getString("ro.build.user");public static final String HOST = getString("ro.build.host");//获取无线电固件版本public static String getRadioVersion() {return SystemProperties.get(TelephonyProperties.PROPERTY_BASEBAND_VERSION, null);}private static String getString(String property) {return SystemProperties.get(property, UNKNOWN);}private static long getLong(String property) {try {return Long.parseLong(SystemProperties.get(property));} catch (NumberFormatException e) {return -1;}}//各种版本字符串public static class VERSION {public static final String INCREMENTAL = getString("ro.build.version.incremental");public static final String RELEASE = getString("ro.build.version.release");public static final int SDK_INT = SystemProperties.getInt("ro.build.version.sdk", 0);public static final String CODENAME = getString("ro.build.version.codename");}//目前已知的版本代码的枚举类public static class VERSION_CODES {public static final int CUR_DEVELOPMENT = 10000;/** * October 2008: The original, first, version of Android. Yay! */public static final int BASE = 1;/** * February 2009: First Android update, officially called 1.1. */public static final int BASE_1_1 = 2;/** * May 2009: Android 1.5. */public static final int CUPCAKE = 3;/** * September 2009: Android 1.6. */public static final int DONUT = 4;/** * November 2009: Android 2.0 */public static final int ECLAIR = 5;/** * December 2009: Android 2.0.1 */public static final int ECLAIR_0_1 = 6;/** * January 2010: Android 2.1 */public static final int ECLAIR_MR1 = 7;/** * June 2010: Android 2.2 */public static final int FROYO = 8;/** * November 2010: Android 2.3 */public static final int GINGERBREAD = 9;/** * February 2011: Android 2.3.3. */public static final int GINGERBREAD_MR1 = 10;/** * February 2011: Android 3.0. */public static final int HONEYCOMB = 11;/** * May 2011: Android 3.1. */public static final int HONEYCOMB_MR1 = 12;/** * June 2011: Android 3.2. */public static final int HONEYCOMB_MR2 = 13;/** * October 2011: Android 4.0. */public static final int ICE_CREAM_SANDWICH = 14;/** * December 2011: Android 4.0.3. */public static final int ICE_CREAM_SANDWICH_MR1 = 15;/** * June 2012: Android 4.1. */public static final int JELLY_BEAN = 16;/** * Android 4.2: Moar jelly beans! */public static final int JELLY_BEAN_MR1 = 17;/** * Android 4.3: Jelly Bean MR2, the revenge of the beans. */public static final int JELLY_BEAN_MR2 = 18;/** * Android 4.4: KitKat, another tasty treat. */public static final int KITKAT = 19;}}

下面举个例子:

/** * 获取设备信息 * * @return */
private String getDeviceInfo() {StringBuffer sb = new StringBuffer();sb.append(主板: + Build.BOARD);sb.append(系统启动程序版本号: + Build.BOOTLOADER);sb.append(系统定制商: + Build.BRAND);sb.append(cpu指令集: + Build.CPU_ABI);sb.append(cpu指令集2 + Build.CPU_ABI2);sb.append(设置参数: + Build.DEVICE);sb.append(显示屏参数: + Build.DISPLAY);sb.append(www.2cto.com无线电固件版本: + Build.getRadioVersion());sb.append(硬件识别码: + Build.FINGERPRINT);sb.append(硬件名称: + Build.HARDWARE);sb.append(HOST: + Build.HOST);sb.append(修订版本列表: + Build.ID);sb.append(硬件制造商: + Build.MANUFACTURER);sb.append(版本: + Build.MODEL);sb.append(硬件序列号: + Build.SERIAL);sb.append(手机制造商: + Build.PRODUCT);sb.append(描述Build的标签: + Build.TAGS);sb.append(TIME: + Build.TIME);sb.append(builder类型: + Build.TYPE);sb.append(USER: + Build.USER);return sb.toString();
}

2、ActivityManager获取内存信息

在ActivityManager里面有个getMemoryInfo函数,可以获取到内存信息。

public void getMemoryInfo(MemoryInfo outInfo) {try {ActivityManagerNative.getDefault().getMemoryInfo(outInfo);} catch (RemoteException e) {}
}

下面我们来看看MemoryInfo这个类:

public static class MemoryInfo implements Parcelable {public long availMem;public long totalMem;public long threshold;public boolean lowMemory;public MemoryInfo() {}public int describeContents() {return 0;}public void writeToParcel(Parcel dest, int flags) {dest.writeLong(availMem);dest.writeLong(totalMem);dest.writeLong(threshold);dest.writeInt(lowMemory ? 1 : 0);dest.writeLong(hiddenAppThreshold);dest.writeLong(secondaryServerThreshold);dest.writeLong(visibleAppThreshold);dest.writeLong(foregroundAppThreshold);}public void readFromParcel(Parcel source) {availMem = source.readLong();totalMem = source.readLong();threshold = source.readLong();lowMemory = source.readInt() != 0;hiddenAppThreshold = source.readLong();secondaryServerThreshold = source.readLong();visibleAppThreshold = source.readLong();foregroundAppThreshold = source.readLong();}public static final Creator<MemoryInfo> CREATOR= new Creator<MemoryInfo>() {public MemoryInfo createFromParcel(Parcel source) {return new MemoryInfo(source);}public MemoryInfo[] newArray(int size) {return new MemoryInfo[size];}};private MemoryInfo(Parcel source) {readFromParcel(source);}
}

另外,需要说明的是,我们可以直接读取系统的一个文件来获取内存信息。这个文件目录为:/proc/meminfo 
如下图:

3、获取SDCard存储

/** * 获得SD卡总大小 * * @return */
private String getSDTotalSize() {  File path = Environment.getExternalStorageDirectory();  StatFs stat = new StatFs(path.getPath());  long blockSize = stat.getBlockSize();  long totalBlocks = stat.getBlockCount();  return Formatter.formatFileSize(MainActivity.this, blockSize * totalBlocks);
}  /** * 获得sd卡剩余容量,即可用大小 * * @return */
private String getSDAvailableSize() {  File path = Environment.getExternalStorageDirectory();  StatFs stat = new StatFs(path.getPath());  long blockSize = stat.getBlockSize();  long availableBlocks = stat.getAvailableBlocks();  return Formatter.formatFileSize(MainActivity.this, blockSize * availableBlocks);
}  /** * 获得机身内存总大小 * * @return */
private String getRomTotalSize() {  File path = Environment.getDataDirectory();  StatFs stat = new StatFs(path.getPath());  long blockSize = stat.getBlockSize();  long totalBlocks = stat.getBlockCount();  return Formatter.formatFileSize(MainActivity.this, blockSize * totalBlocks);
}  /** * 获得机身可用内存 * * @return */
private String getRomAvailableSize() {  File path = Environment.getDataDirectory();  StatFs stat = new StatFs(path.getPath());  long blockSize = stat.getBlockSize();  long availableBlocks = stat.getAvailableBlocks();  return Formatter.formatFileSize(MainActivity.this, blockSize * availableBlocks);
}

另外,我们可以通过StorageManager来获取其他的信息,但需要注意的是有些方法需要使用反射来调用,因为它们是不可见的。

4、读取CPU信息

我们可以读取系统目录下/proc/cpuinfo的文件来获取CPU信息。如下图所示,事实上,我们可以查看/proc目录的所有文件,来查看各种信息。

/proc/cmdline:显示内核启动的命令行。
/proc/cpuinfo:显示系统cpu的信息。
/proc/filesystems,显示当前注册了的文件系统列表,nodev表示为虚拟文件系统。
/proc/interrupts:显示当前系统的中断信息.
/proc/ioports:被占用的输入/输出地址范围列表。
/proc/kmsg:输出内核消息日志。
/proc/loadavg:监控cpu平均负载,其数值为所有核上cpu占用的累加值,前三个分别表示最近1、5、15分钟的平均负载,第四个表示当前运行进程数和进程总数,最后一个表示最近运行的进程id。
/proc/locks:打开文件上的加锁信息。
/proc/meminfo:显示物理及虚拟内存使用情况。
/proc/misc:内核函数misc_register登记的设备驱动程序。
/proc/modules:加载的内核模块列表。
/proc/mounts:当前系统所安装的文件系统信息(包括手动安装的)。
/proc/stat:系统简要信息。
/proc/uptime:分别表示系统启动时间和系统空闲时间。
/proc/version:系统内核版本。
/proc/net:其实际挂载点是/proc/self/net,能够显示当前各种网络情况,例如通过tcp文件可以查看tcp连接数及连接情况。
/proc/sys 报告各种不同的内核参数,某些参数能在root的情况下进行修改。
/proc/devices 当前挂载的所有软硬件设备(字符设备和块设备),包括主设备号和设备名称。
/proc/asound:声卡相关的信息。
/proc/buddyinfo:每个内存区中每个order有多少块可用,和内存碎片问题有关。
/proc/bus:输入设备信息。
/proc/cgroups:查看cgroups子系统信息。
/proc/diskstats:用于显示磁盘、分区和统计信息。
/proc/execdomains:安全相关的信息。
/proc/fb:帧缓冲设备信息。
/proc/iomem:记录物理地址的分配情况。
/proc/kallsyms:内核符号表信息。
/proc/pagetypeinfo:内存分页信息。
/proc/partitions:分区信息
/proc/sched_debug:cpu调度信息。
/proc/softirqs:软中断情况。
/proc/vmallocinfo:vmalloc内存分配信息。
/proc/vmstat:统计虚拟内存信息。
/proc/pid:显示进城相关的所有信息。

5、获取电池电量信息

获取到电池信息一般可以通过两个类获取:android.content.BroadcastReceiver类和android.os.BatteryManager类

在BroadcastReceiver的onReceive()事件,接收到的Intent.ACTION_BATTERY_CHANGED,包括下面的信息:

“status”(int类型)…状态,定义值是BatteryManager.BATTERY_STATUS_XXX。
“health”(int类型)…健康,定义值是BatteryManager.BATTERY_HEALTH_XXX。
“present”(boolean类型)
“level”(int类型)…电池剩余容量
“scale”(int类型)…电池最大值。通常为100。
“icon-small”(int类型)…图标ID。
“plugged”(int类型)…连接的电源插座,定义值是BatteryManager.BATTERY_PLUGGED_XXX。
“voltage”(int类型)…mV。
“temperature”(int类型)…温度,0.1度单位。例如 表示197的时候,意思为19.7度。
“technology”(String类型)…电池类型,例如,Li-ion等等。
public class BatteryTestActivity extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);        }@Overrideprotected void onResume() {super.onResume();IntentFilter filter = new IntentFilter();filter.addAction(Intent.ACTION_BATTERY_CHANGED);registerReceiver(mBroadcastReceiver, filter);}@Overrideprotected void onPause() {super.onPause();unregisterReceiver(mBroadcastReceiver);}private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {int status = intent.getIntExtra("status", 0);int health = intent.getIntExtra("health", 0);boolean present = intent.getBooleanExtra("present", false);int level = intent.getIntExtra("level", 0);int scale = intent.getIntExtra("scale", 0);int icon_small = intent.getIntExtra("icon-small", 0);int plugged = intent.getIntExtra("plugged", 0);int voltage = intent.getIntExtra("voltage", 0);int temperature = intent.getIntExtra("temperature", 0);String technology = intent.getStringExtra("technology");String statusString = "";switch (status) {case BatteryManager.BATTERY_STATUS_UNKNOWN:statusString = "unknown";break;case BatteryManager.BATTERY_STATUS_CHARGING:statusString = "charging";break;case BatteryManager.BATTERY_STATUS_DISCHARGING:statusString = "discharging";break;case BatteryManager.BATTERY_STATUS_NOT_CHARGING:statusString = "not charging";break;case BatteryManager.BATTERY_STATUS_FULL:statusString = "full";break;}String healthString = "";switch (health) {case BatteryManager.BATTERY_HEALTH_UNKNOWN:healthString = "unknown";break;case BatteryManager.BATTERY_HEALTH_GOOD:healthString = "good";break;case BatteryManager.BATTERY_HEALTH_OVERHEAT:healthString = "overheat";break;case BatteryManager.BATTERY_HEALTH_DEAD:healthString = "dead";break;case BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE:healthString = "voltage";break;case BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE:healthString = "unspecified failure";break;}String acString = "";switch (plugged) {case BatteryManager.BATTERY_PLUGGED_AC:acString = "plugged ac";break;case BatteryManager.BATTERY_PLUGGED_USB:acString = "plugged usb";break;}Log.v("status", statusString);Log.v("health", healthString);Log.v("present", String.valueOf(present));Log.v("level", String.valueOf(level));Log.v("scale", String.valueOf(scale));Log.v("icon_small", String.valueOf(icon_small));Log.v("plugged", acString);Log.v("voltage", String.valueOf(voltage));Log.v("temperature", String.valueOf(temperature));Log.v("technology", technology);}}};}

应用程序为了取得电池的状态,通常的做法是监听ACTION_BATTERY_CHANGED这个intent,只能在收到这个intent的时候才能取得电池的状态信息,有没有同步取得电池信息的办法呢?

实际上,系统driver维护着保存电池信息的一组文件。

/sys/class/power_supply/ac/online AC电源连接状态
/sys/class/power_supply/usb/online USB电源连接状态
/sys/class/power_supply/battery/status 充电状态
/sys/class/power_supply/battery/health 电池状态
/sys/class/power_supply/battery/present 使用状态
/sys/class/power_supply/battery/capacity 电池level
/sys/class/power_supply/battery/batt_vol 电池电压
/sys/class/power_supply/battery/batt_temp 电池温度
/sys/class/power_supply/battery/technology 电池技术

当电池状态发生变化时,driver会更新这些文件,因此在应用程序中通过读取这些文件的办法,可以做到同步取得电池信息。

6、获取手机各种状态信息

TelephonyManager tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE); /*
* 电话状态:
* 1.tm.CALL_STATE_IDLE=0          无活动
* 2.tm.CALL_STATE_RINGING=1  响铃
* 3.tm.CALL_STATE_OFFHOOK=2  摘机
*/ tm.getCallState();//int /*
* 电话方位:
* */ tm.getCellLocation();//CellLocation /*
* 唯一的设备ID:
* GSM手机的 IMEI 和 CDMA手机的 MEID.
* Return null if device ID is not available.
*/ tm.getDeviceId();//String /*
* 设备的软件版本号:
* 例如:the IMEI/SV(software version) for GSM phones.
* Return null if the software version is not available.
*/ tm.getDeviceSoftwareVersion();//String /*
* 手机号:
* GSM手机的 MSISDN.
* Return null if it is unavailable.
*/ tm.getLine1Number();//String /*
* 附近的电话的信息:
* 类型:List<NeighboringCellInfo>
* 需要权限:android.Manifest.permission#ACCESS_COARSE_UPDATES
*/ tm.getNeighboringCellInfo();//List<NeighboringCellInfo> /*
* 获取ISO标准的国家码,即国际长途区号。
* 注意:仅当用户已在网络注册后有效。
* 在CDMA网络中结果也许不可靠。
*/ tm.getNetworkCountryIso();//String /*
* MCC+MNC(mobile country code + mobile network code)
* 注意:仅当用户已在网络注册时有效。
* 在CDMA网络中结果也许不可靠。
*/ tm.getNetworkOperator();//String /*
* 按照字母次序的current registered operator(当前已注册的用户)的名字
* 注意:仅当用户已在网络注册时有效。
* 在CDMA网络中结果也许不可靠。
*/ tm.getNetworkOperatorName();//String /*
* 当前使用的网络类型:
* 例如: NETWORK_TYPE_UNKNOWN  网络类型未知  0
NETWORK_TYPE_GPRS     GPRS网络  1
NETWORK_TYPE_EDGE     EDGE网络  2
NETWORK_TYPE_UMTS     UMTS网络  3
NETWORK_TYPE_HSDPA    HSDPA网络  8
NETWORK_TYPE_HSUPA    HSUPA网络  9
NETWORK_TYPE_HSPA     HSPA网络  10
NETWORK_TYPE_CDMA     CDMA网络,IS95A 或 IS95B.  4
NETWORK_TYPE_EVDO_0 EVDO网络, revision 0. 5 NETWORK_TYPE_EVDO_A   EVDO网络, revision A.  6
NETWORK_TYPE_1xRTT    1xRTT网络  7
*/ tm.getNetworkType();//int /*
* 手机类型:
* 例如: PHONE_TYPE_NONE  无信号
PHONE_TYPE_GSM   GSM信号
PHONE_TYPE_CDMA  CDMA信号
*/ tm.getPhoneType();//int /*
* Returns the ISO country code equivalent for the SIM provider's country code.
* 获取ISO国家码,相当于提供SIM卡的国家码。
* */ tm.getSimCountryIso();//String /*
* Returns the MCC+MNC (mobile country code + mobile network code) of the provider of the SIM. 5 or 6 decimal digits.
* 获取SIM卡提供的移动国家码和移动网络码.5或6位的十进制数字.
* SIM卡的状态必须是 SIM_STATE_READY(使用getSimState()判断).
*/ tm.getSimOperator();//String /*
* 服务商名称:
* 例如:中国移动、联通
* SIM卡的状态必须是 SIM_STATE_READY(使用getSimState()判断).
*/ tm.getSimOperatorName();//String /*
* SIM卡的序列号:
* 需要权限:READ_PHONE_STATE
*/ tm.getSimSerialNumber();//String /*
* SIM的状态信息:
* SIM_STATE_UNKNOWN          未知状态 0
SIM_STATE_ABSENT           没插卡 1
SIM_STATE_PIN_REQUIRED 锁定状态,需要用户的PIN码解锁 2 SIM_STATE_PUK_REQUIRED     锁定状态,需要用户的PUK码解锁 3
SIM_STATE_NETWORK_LOCKED 锁定状态,需要网络的PIN码解锁 4 SIM_STATE_READY 就绪状态 5 */ tm.getSimState();//int /*
* 唯一的用户ID:
* 例如:IMSI(国际移动用户识别码) for a GSM phone.
* 需要权限:READ_PHONE_STATE
*/ tm.getSubscriberId();//String /*
* 取得和语音邮件相关的标签,即为识别符
* 需要权限:READ_PHONE_STATE
*/ tm.getVoiceMailAlphaTag();//String /*
* 获取语音邮件号码:
* 需要权限:READ_PHONE_STATE
*/ tm.getVoiceMailNumber();//String /*
* ICC卡是否存在
*/ tm.hasIccCard();//boolean /*
* 是否漫游:
* (在GSM用途下)
*/ tm.isNetworkRoaming();// 

值得注意的是,这个需要android.permission.READ_PHONE_STATE权限。

6、获取流量信息

有两种方法,一种是使用TrafficStats类,另一种就是读取系统流量文件:/proc/net/xt_qtaguid/stats

关于第一种方法:参考文章:Android中TrafficStats流量监控类

参考文章: 
获取Android手机各种状态信息

Android 获取系统 cpu 信息,内存,版本,电量等信息

Android系统/proc目录详解

Android获取SD卡总容量,可用大小,机身内存总容量及可用大小的系统方法

Android Low Memory Killer

Android如何获取手机各项信息相关推荐

  1. Android中获取手机设备信息、RAM、ROM存储信息,如宽、高、厂商名、手机品牌

    借鉴:https://www.jianshu.com/p/ca869aa2fd72 今天有两个工具类总结,代码里都有注释,直接看代码. 一.首先第一个,主要获取手机设备信息DeviceInfoUtil ...

  2. Android中获取手机电量信息

    有些时候我们需要在我们的应用上为用户展示当前手机的电量,这时候我们就需要用到广播了,我们都知道在动态注册广播的时候,我们需要传入一个BroadcastReceiver类对象,还有一个意图过滤器Inte ...

  3. Android获取设备各项信息(设备id、ip地址、设备名称、运行商、品牌、型号、分辨率、处理器、国家码、系统语言、网络类型、oaid、android版本、操作系统版本、mac地址、应用程序签名..)

    Android获取设备各项信息(设备id.ip地址.APP应用名称.设备名称.运行商.品牌.型号.分辨率.处理器.国家码.系统语言.网络类型.oaid.android版本.操作系统版本.mac地址.应 ...

  4. android开发获取手机,通过ADB获取Android手机信息,获取手机信息

    通过ADB获取Android手机信息,获取手机信息 原文:https://blog.csdn.net/fasfaf454/article/details/51438743 1.获取手机系统信息( CP ...

  5. android 安卓APP获取手机设备信息和手机号码的代码示例

    下面我从安卓开发的角度,简单写一下如何获取手机设备信息和手机号码 准备条件:一部安卓手机.手机SIM卡确保插入手机里.eclipse ADT和android-sdk开发环境 第一步:新建一个andro ...

  6. Android中获取手机中的联系人信息

    #Android中获取手机中的联系人信息 1.0.查看系统通讯录的表,表路径:data->data->com.android.providers.contacts->database ...

  7. android app 手机号码,android 安卓APP获取手机设备信息和手机号码的代码示例 .

    下面我从安卓开发的角度,简单写一下如何获取手机设备信息和手机号码 准备条件:一部安卓手机.手机SIM卡确保插入手机里.eclipse ADT和android-sdk开发环境 第一步:新建一个andro ...

  8. android app 手机号码,android 安卓APP获取手机设备信息和手机号码的代码示例

    下面我从安卓开发的角度,简单写一下如何获取手机设备信息和手机号码 准备条件:一部安卓手机.手机SIM卡确保插入手机里.eclipse ADT和android-sdk开发环境 第一步:新建一个andro ...

  9. Android获取手机基站信息并进行基站定位(基站定位原理)

    一,首先普及一下手机基站信息中相关的专业词汇: 通过TelephonyManager 获取lac:mcc:mnc:cell-id(基站信息)的解释:  MCC,Mobile Country Code, ...

最新文章

  1. 万字详解,JDK1.8新特性的Lambda、Stream和日期的使用详解
  2. gsonformat安装怎么使用_车载蓝牙充电器怎么安装使用?如何运用
  3. 1个多月就能看到效果的减肥大法 - 生活至上,美容至尚!
  4. effectiveJava(5)消除过期的对象引用
  5. Android程序员的进阶之路
  6. 做完系统回来计算机连接不上网络,重装系统后电脑连不上网怎么回事
  7. labview嵌入c代码_LabVIEW与myRIO嵌入式系统开发入门
  8. nmake错误:VC\bin\cl.EXE: 返回代码“0xc0000135“
  9. activiti 流程事件触发trigger
  10. python画3d图-Python 竟能绘制如此酷炫的三维图
  11. Atitit.进程管理常用api
  12. 开发IE插件Toolbar
  13. Nginx的软件架构
  14. 笔记本插入耳机声音外放
  15. 关于车臣战争有什么电影?车臣战争片推荐
  16. 面试之算法知识点总结
  17. linux u盘版下载官网,Linux助手:Universal USB Installer新版下载
  18. canvas student下载_悉大官方学生系统万能的Canvas和Sydney Student,你真的会用吗?官网平台两步走+实用功能型Tips!...
  19. 黑苹果键盘对应的相应按键
  20. 2004-10-30 周六

热门文章

  1. 算法笔记 排序 EXCEL排序
  2. python tkinter制作用户登录界面
  3. ubuntu安装nvm并安装node步骤
  4. 洛谷P4107 [HEOI2015]兔子与樱花
  5. 剪辑pr:2、视频特效、关键帧动画预设
  6. 站点 PC 跳转到 手机端
  7. 哈工大计算机学科等级,计算机学科评估为A以上10所高校!北邮超过哈工、上交、南大等...
  8. PCL1.12.1无效的宏定义BOOST_DEFINITIONS -DBOOST_ALL_NO_LIB
  9. mysql数据库驱动的类全名_mysql数据库全称
  10. 数据迁移工具chameleon的使用限制