㈠ android獲取系統cpu信息,內存,版本,電量等信息
1、CPU頻率,CPU信息:/proc/cpuinfo和/proc/stat
通過讀取文件/proc/cpuinfo系統CPU的類型等多種信息。
讀取/proc/stat 所有CPU活動的信息來計算CPU使用率
下面我們就來講講如何通過代碼來獲取CPU頻率:
復制代碼 代碼如下:
package com.orange.cpu;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
public class CpuManager {
// 獲取CPU最大頻率(單位KHZ)
// "/system/bin/cat" 命令行
// "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq" 存儲最大頻率的文件的.路徑
public static String getMaxCpuFreq() {
String result = "";
ProcessBuilder cmd;
try {
String[] args = { "/system/bin/cat",
"/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq" };
cmd = new ProcessBuilder(args);
Process process = cmd.start();
InputStream in = process.getInputStream();
byte[] re = new byte[24];
while (in.read(re) != -1) {
result = result + new String(re);
}
in.close();
} catch (IOException ex) {
ex.printStackTrace();
result = "N/A";
}
return result.trim();
}
// 獲取CPU最小頻率(單位KHZ)
public static String getMinCpuFreq() {
String result = "";
ProcessBuilder cmd;
try {
String[] args = { "/system/bin/cat",
"/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq" };
cmd = new ProcessBuilder(args);
Process process = cmd.start();
InputStream in = process.getInputStream();
byte[] re = new byte[24];
while (in.read(re) != -1) {
result = result + new String(re);
}
in.close();
} catch (IOException ex) {
ex.printStackTrace();
result = "N/A";
}
return result.trim();
}
// 實時獲取CPU當前頻率(單位KHZ)
public static String getCurCpuFreq() {
String result = "N/A";
try {
FileReader fr = new FileReader(
"/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq");
BufferedReader br = new BufferedReader(fr);
String text = br.readLine();
result = text.trim();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
// 獲取CPU名字
public static String getCpuName() {
try {
FileReader fr = new FileReader("/proc/cpuinfo");
BufferedReader br = new BufferedReader(fr);
String text = br.readLine();
String[] array = text.split(":s+", 2);
for (int i = 0; i < array.length; i++) {
}
return array[1];
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
2、內存:/proc/meminfo
復制代碼 代碼如下:
public void getTotalMemory() {
String str1 = "/proc/meminfo";
String str2="";
try {
FileReader fr = new FileReader(str1);
BufferedReader localBufferedReader = new BufferedReader(fr, 8192);
while ((str2 = localBufferedReader.readLine()) != null) {
Log.i(TAG, "---" + str2);
}
} catch (IOException e) {
}
}
3、Rom大小
復制代碼 代碼如下:
public long[] getRomMemroy() {
long[] romInfo = new long[2];
//Total rom memory
romInfo[0] = getTotalInternalMemorySize();
//Available rom memory
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long availableBlocks = stat.getAvailableBlocks();
romInfo[1] = blockSize * availableBlocks;
getVersion();
return romInfo;
}
public long getTotalInternalMemorySize() {
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long totalBlocks = stat.getBlockCount();
return totalBlocks * blockSize;
}
4、sdCard大小
復制代碼 代碼如下:
public long[] getSDCardMemory() {
long[] sdCardInfo=new long[2];
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
File sdcardDir = Environment.getExternalStorageDirectory();
StatFs sf = new StatFs(sdcardDir.getPath());
long bSize = sf.getBlockSize();
long bCount = sf.getBlockCount();
long availBlocks = sf.getAvailableBlocks();
sdCardInfo[0] = bSize * bCount;//總大小
sdCardInfo[1] = bSize * availBlocks;//可用大小
}
return sdCardInfo;
}
5、電池電量
復制代碼 代碼如下:
private BroadcastReceiver batteryReceiver=new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
int level = intent.getIntExtra("level", 0);
// level加%就是當前電量了
}
};
registerReceiver(batteryReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
6、系統的版本信息
復制代碼 代碼如下:
public String[] getVersion(){
String[] version={"null","null","null","null"};
String str1 = "/proc/version";
String str2;
String[] arrayOfString;
try {
FileReader localFileReader = new FileReader(str1);
BufferedReader localBufferedReader = new BufferedReader(
localFileReader, 8192);
str2 = localBufferedReader.readLine();
arrayOfString = str2.split("s+");
version[0]=arrayOfString[2];//KernelVersion
localBufferedReader.close();
} catch (IOException e) {
}
version[1] = Build.VERSION.RELEASE;// firmware version
version[2]=Build.MODEL;//model
version[3]=Build.DISPLAY;//system version
return version;
}
7、mac地址和開機時間
復制代碼 代碼如下:
public String[] getOtherInfo(){
String[] other={"null","null"};
WifiManager wifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
if(wifiInfo.getMacAddress()!=null){
other[0]=wifiInfo.getMacAddress();
} else {
other[0] = "Fail";
}
other[1] = getTimes();
return other;
}
private String getTimes() {
long ut = SystemClock.elapsedRealtime() / 1000;
if (ut == 0) {
ut = 1;
}
int m = (int) ((ut / 60) % 60);
int h = (int) ((ut / 3600));
return h + " " + mContext.getString(R.string.info_times_hour) + m + " "
+ mContext.getString(R.string.info_times_minute);
}
㈡ 如何偷Android的內存
MemoryFile是android在最開始就引入的一套框架,其內部實際上是封裝了android特有的內存共享機制Ashmem匿名共享內存,簡單來說,Ashmem在Android內核中是被注冊成一個特殊的字元設備,Ashmem驅動通過在內核的一個自定義slab緩沖區中初始化一段內存區域,然後通過mmap把申請的內存映射到用戶的進程空間中(通過tmpfs),這樣子就可以在用戶進程中使用這里申請的內存了,另外,Ashmem的一個特性就是可以在系統內存不足的時候,回收掉被標記為」unpin」的內存,這個後面會講到,另外,MemoryFile也可以通過Binder跨進程調用來讓兩個進程共享一段內存區域。由於整個申請內存的過程並不再Java層上,可以很明顯的看出使用MemoryFile申請的內存實際上是並不會佔用Java堆內存的。
MemoryFile暴露出來的用戶介面可以說跟他的名字一樣,基本上跟我們平時的文件的讀寫基本一致,也可以使用InputStream和OutputStream來對其進行讀寫等操作:
1
2
3
4
MemoryFile memoryFile = new MemoryFile(null, inputStream.available());
memoryFile.allowPurging(false);
OutputStream outputStream = memoryFile.getOutputStream();
outputStream.write(1024);
上面可以看到allowPurging這個調用,這個就是之前說的」pin」和」unpin」,在設置了allowPurging為false之後,這個MemoryFile對應的Ashmem就會被標記成」pin」,那麼即使在android系統內存不足的時候,也不會對這段內存進行回收。另外,由於Ashmem默認都是」unpin」的,因此申請的內存在某個時間點內都可能會被回收掉,這個時候是不可以再讀寫了
Tricks
MemoryFile是一個非常trickly的東西,由於並不佔用Java堆內存,我們可以將一些對象用MemoryFile來保存起來避免GC,另外,這里可能android上有個BUG:
在4.4及其以上的系統中,如果在應用中使用了MemoryFile,那麼在mpsys meminfo的時候,可以看到多了一項Ashmem的值:
可以看出來雖然MemoryFile申請的內存不計入Java堆也不計入Native堆中,但是佔用了Ashmem的內存,這個實際上是算入了app當前佔用的內存當中
但是在4.4以下的機器中時,使用MemoryFile申請的內存居然是不算入app的內存中的:
而且這里我也算過,也是不算入Native Heap中的,另外,這個時候去系統設置裡面看進程的內存佔用,也可以看出來其實並沒有計入Ashmem的內存的
這個應該是android的一個BUG,但是我搜了一下並沒有搜到對應的issue,搞不好這里也可能是一個feature
而在大名鼎鼎的Fresco當中,他們也有用到這個bug來避免在decode bitmap的時候,將文件的位元組讀到Java堆中,使用了MemoryFile,並利用了這個BUG然這部分內存不算入app中,這里分別對應了Fresco中的GingerbreadPurgeableDecoder和KitKatPurgeableDecoder,Fresco在decode圖片的時候會在4.4和4.4以下的系統中分別使用這兩個不同的decoder
從這個地方可以看出來,使用MemoryFile,在4.4以下的系統當中,可以幫我們的app額外」偷」一些內存,並且可以不計入app的內存當中
Summary
這里主要是簡單介紹了MemoryFile的基本原理和用法,並且闡述了一個MemoryFile中一個可以幫助開發者」偷」內存的地方,這個是一個非常trickly的方法,雖然4.4以下使用這塊的內存並不計入進程當中,但是並不推薦大量使用,因為當設置了allowPurging為false的時候,這個對應的Ashmem內存區域是被」pin」了,那麼在android系統內存不足的時候,是不能夠把這段內存區域回收的,如果長時間沒有釋放的話,這樣子相當於無端端佔用了大量手機內存而又無法回收,那對系統的穩定性肯定會造成影響
㈢ 如何查看Android手機的內存
打開手機找到設置點擊進入
㈣ android 怎樣獲取當前apk所佔用的內存
這個方法有很多,常用的是 adb shell mpsys meminfo <package_name> 這可以看到比較全面的信息,由於Android是有內存共享的,所以通常有 VSS,RSS,PSS,USS等不同的內存表述,比較常用的是PSS,會將共享庫按照比例分配給當前內存
㈤ android怎麼獲取assets存放到手機內存
1 在設置-應用程序-管理應用程序-點擊要移動的應用程序,然後會有移動到儲存卡或者移動到手機內存的選項,或者在安裝軟體的時候直接選擇安裝到內存卡里,如果你的手機目前沒安裝時選擇的功能,你可以刷機解決 2 你可以安裝360手機衛士到手機上,然後進入360手機衛士,選擇程序管理-軟體搬家 然後移動你想要移動的軟體就可以了 提醒樓主 有些軟體最好是放到手機里的,因為只有放到手機里才可以應用該軟體的窗口小部件或者小工具什麼的,比如天氣軟體 墨跡天氣,天氣通等,你想在手機桌面添加天氣時鍾,就得把該軟體安裝到手機內存里才行 樓主不明白可以繼續追問,如果覺得可以,請採納為滿意回答