㈠ 如何獲取android正在運行的應用和它的pid
要查看正在運行的程序的pid,可以通過Devices查看,菜單欄-Window-Show View - Other - Android -Devices 確定,現在就打開Devices了,如果你的手機已經連接好電腦,可以看到有一個online,下面對應的就是程序的pid 也可以通過命令行查看
㈡ Android無root,獲取其他應用內部存儲的數據
最近在負責一個項目,需要獲取其他應用的內部存儲中的文件,即data/data/下的文件,並轉存到sdcard上。有一點Android基礎的都知道data/data/中的文件對其他應用是不可見的,在沒有源碼的條件下,無法直接訪問data/data中的文件。問了公司的大佬,大佬提供了兩種思路,一種是run-as命令進入data/data,直接;另一種是hook。具體怎麼實施,且聽我慢慢道來。
安裝包是debug包(release包也可以利用反編譯重新打包,變成debug包,網上有很多文章可以參考)
1、連接手機到電腦,打開usb調試
2、命令行中輸入 adb shell run-as <包名>
示例:
com.ss.android.ugc.aweme(抖音)不是debug包,無法使用run-as命令。
com.example.yilialin.jsonreport(我自己寫的app)是debug包,使用run-as命令可以進入data/data目錄下,輸入 ls ,可以看到data/data目錄下的所有文件/文件夾
3、輸入 cat <文件名> > <sdcard中的文件名> ,直接拷貝到sdcard中
示例:
不出現任何提示,表明已經成功拷貝到了sdcard中。
幾行命令直接搞定
1、需要手工敲命令,難以實現自動化
2、debug包才能使用
沒有限制,安裝包是release包或者debug包都可以,手機不需要root
有關於xposed插件可以參考文章:https://blog.csdn.net/yzzst/article/details/47659479
https://blog.csdn.net/niubitianping/article/details/52571438
https://blog.csdn.net/niubitianping/article/details/52574650
其實無root也是可以使用virtualxposed的,將xposed插件和想要hook的app克隆到virtualxposed中就可以使用了。
不受root許可權和debug包的限制
前期需要做的事情多,xposed插件編寫比較麻煩
我研究了幾個星期的xposed hook,才學會了怎麼使用,原理還不是特別明白,先用著吧==
聽別人說再多也只是紙上談兵,關鍵是要自己動手操作,有很多問題都是在實施的過程中出現並解決的,在問題中學習不失為一種好方法。
奉上我的xposed插件,供學習參考,有什麼不對的地方,還望不吝賜教!
https://github.com/Yiliayan/douyinxposed.git
㈢ Android 怎麼樣獲得應用信息
一、方法介紹:
每個Android應用程序都可以通過Context來獲取與應用程序相關的目錄,這些目錄的功能各異,每一個目錄都有自己的特點,有時候可能會搞混淆,本文結合android源碼注釋和實際操作,詳細介紹一下每個方法:
方法:getFilesDir
釋義:返回通過Context.openFileOutput()創建和存儲的文件系統的絕對路徑,應用程序文件,這些文件會在程序被卸載的時候全部刪掉。
方法:getCacheDir
釋義:返回應用程序指定的緩存目錄,這些文件在設備內存不足時會優先被刪除掉,所以存放在這里的文件是沒有任何保障的,可能會隨時丟掉。
方法:getDir
釋義:這是一個可以存放你自己應用程序自定義的文件,你可以通過該方法返回的File實例來創建或者訪問這個目錄,注意該目錄下的文件只有你自己的程序可以訪問。
方法:getExternalCacheDir
釋義:使用這個方法需要寫外部存儲的許可權「<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />」,調用該方法會返回應用程序的外部文件系統(Environment.getExternalStorageDirectory())目錄的絕對路徑,它是用來存放應用的緩存文件,它和getCacheDir目錄一樣,目錄下的文件都會在程序被卸載的時候被清除掉。
方法:getExternalFilesDir
釋義:使用這個方法需要寫外部存儲的許可權「<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />」,這個目錄是與應用程序相關的外部文件系統,它和getExternalCacheDir不一樣的是只要應用程序存在它就會一直存在,這些文件只屬於你的應用,不能被其它人訪問。同樣,這個目錄下的文件在程序被卸載時也會被一同刪除。
方法:getExternalFilesDir
釋義:和上面的方法一樣,只是返回的是其目錄下某一類型的文件,這些類型可以是: Environment#DIRECTORY_MUSIC 音樂 Environment#DIRECTORY_PODCASTS 音頻 Environment#DIRECTORY_RINGTONES 鈴聲 Environment#DIRECTORY_ALARMS 鬧鈴 Environment#DIRECTORY_NOTIFICATIONS 通知鈴聲 Environment#DIRECTORY_PICTURES 圖片 Environment#DIRECTORY_MOVIES 視頻
方法:getDatabasePath
釋義:保存通過Context.openOrCreateDatabase 創建的資料庫文件
方法:getPackageCodePath
釋義:返回android 安裝包的完整路徑,這個包是一個zip的壓縮文件,它包括應用程序的代碼和assets文件。
方法:getPackageResourcePath
釋義:返回android 安裝包的完整路徑,這個包是一個ZIP的要鎖文件,它包括應用程序的私有資源。
方法:getObbDir
釋義:返回應用程序的OBB文件目錄(如果有的話),注意如果該應用程序沒有任何OBB文件,這個目錄是不存在的。
二、測試程序:
測試代碼如下:
private StringBuilder getFilePath( ){
StringBuilder filePathBuilder = new StringBuilder( );
// 返回通過Context.openFileOutput()創建和存儲的文件系統的絕對路徑,應用程序文件,這些文件會在程序被卸載的時候全部刪掉。
filePathBuilder.append( "getFilesDir == " ).append( getFilesDir( ) ).append( "\n" );
// 返回應用程序指定的緩存目錄,這些文件在設備內存不足時會優先被刪除掉,所以存放在這里的文件是沒有任何保障的,可能會隨時丟掉。
filePathBuilder.append( "getCacheDir == " ).append( getCacheDir( ) ).append( "\n" );
// 這是一個可以存放你自己應用程序自定義的文件,你可以通過該方法返回的File實例來創建或者訪問這個目錄,注意該目錄下的文件只有你自己的程序可以訪問。
filePathBuilder.append( "getDir == " ).append( getDir("test.txt", Context.MODE_WORLD_WRITEABLE) ).append( "\n" );
/* 需要寫文件許可權 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> */
// 調用該方法會返回應用程序的外部文件系統(Environment.getExternalStorageDirectory())目錄的絕對路徑,它是用來存放應用的緩存文件,它和getCacheDir目錄一樣,目錄下的文件都會在程序被卸載的時候被清除掉。
filePathBuilder.append( "getExternalCacheDir == " ).append( getExternalCacheDir( ) ).append( "\n" );
// 這個目錄是與應用程序相關的外部文件系統,它和getExternalCacheDir不一樣的是只要應用程序存在它就會一直存在,這些文件只屬於你的應用,不能被其它人訪問。同樣,這個目錄下的文件在程序被卸載時也會被一同刪除。
filePathBuilder.append( "getExternalFilesDir == " ).append( getExternalFilesDir( "/" ) ).append( "\n" );
/**
* 和上面的方法一樣,只是返回的是其目錄下某一類型的文件,這些類型可以是:
* Environment#DIRECTORY_MUSIC 音樂
* Environment#DIRECTORY_PODCASTS 音頻
* Environment#DIRECTORY_RINGTONES 鈴聲
* Environment#DIRECTORY_ALARMS 鬧鈴
* Environment#DIRECTORY_NOTIFICATIONS 通知鈴聲
* Environment#DIRECTORY_PICTURES 圖片
* Environment#DIRECTORY_MOVIES 視頻
*
* */
filePathBuilder.append( "getExternalFilesDir == " ).append( getExternalFilesDir( Environment.DIRECTORY_PICTURES ) ).append( "\n" );
// 保存通過Context.openOrCreateDatabase 創建的資料庫文件
filePathBuilder.append( "getDatabasePath == " ).append( getDatabasePath( DATA_BASE_NAME ) ).append( "\n" );
// 返回android 安裝包的完整路徑,這個包是一個zip的壓縮文件,它包括應用程序的代碼和assets文件
filePathBuilder.append( "getPackageCodePath == " ).append( getPackageCodePath( ) ).append( "\n" );
// 返回android 安裝包的完整路徑,這個包是一個ZIP的要鎖文件,它包括應用程序的私有資源。
filePathBuilder.append( "getPackageResourcePath == " ).append( getPackageResourcePath( ) ).append( "\n" );
// 返回應用程序的OBB文件目錄(如果有的話),注意如果該應用程序沒有任何OBB文件,這個目錄是不存在的。
filePathBuilder.append( "getObbDir == " ).append( getObbDir( ) ).append( "\n" );
return filePathBuilder;
}
㈣ Android 怎麼樣獲得應用信息
通過PackageManager 來獲取已安裝的應用包信息。
java代碼:
ArrayList<AppInfo> appList = new ArrayList<AppInfo>(); //用來存儲獲取的應用信息數據List<PackageInfo> packages = getPackageManager().getInstalledPackages(0);
for(int i=0;i<packages.size();i++) {
PackageInfo packageInfo = packages.get(i);
AppInfo tmpInfo = new AppInfo();
tmpInfo.appName = packageInfo.applicationInfo.loadLabel(getPackageManager()).toString();
tmpInfo.packageName = packageInfo.packageName;
tmpInfo.versionName = packageInfo.versionName;
tmpInfo.versionCode = packageInfo.versionCode;
tmpInfo.appIcon = packageInfo.applicationInfo.loadIcon(getPackageManager());
appList.add(tmpInfo);
}//好啦 這下手機上安裝的應用數據都存在appList里了。
那麼如何判斷一個應用是否為系統應用呢?
java代碼:
if((packageInfo.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM)==0){
//非系統應用
}else{
//系統應用
}
㈤ 如何獲取Android正在運行的應用和它的pid
ActivityManager mActivityManager = (ActivityManager)
this
.getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo>
mRunningProcess = mActivityManager
.getRunningAppProcesses();
int i =
1;
for (ActivityManager.RunningAppProcessInfo amProcess :
mRunningProcess)
{
Log.i("Application", (i++) + "PID: " +
amProcess.pid
+ "(processName=" + amProcess.processName +
"UID="+amProcess.uid+")");
}
直接看看代碼吧。
㈥ android怎樣獲取正在運行的應用
打開設置,點擊應用,會出現正在運行,這一欄就是正在運行的應用了
㈦ android4.4 中如何獲取最近應用的縮略圖
最近有項需求是獲取應用的縮略,用於在動畫時顯示。因此就對此塊知識簡要了解了一下。
在android中獲取視頻文件的縮略圖有三種方法:
1.從媒體庫中查詢
新視頻增加後需要SDCard重新掃描才能給新增加的文件添加縮略圖,靈活性差,而且不是很穩定,適合簡單應用
2. android 2.2以後使用ThumbnailUtils類獲取
實現簡單,但2.2以前的版本不支持
3.調用jni文件,實現MediaMetadataRetriever類
實現復雜,但比較靈活,推薦使用
那麼Android 中如何獲取最近應用的縮略圖,這塊也有現成的函數,不過都被 @hide 掉了,所以需要利用java reflect 反射才能使用
核心代碼如下:
package com.example.testondraw;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import android.app.ActivityManager;
import android.graphics.Bitmap;
import android.util.Log;
/**
* 調用隱藏方法的助手類
*/public class HideExploder {
static final String TAG = "HideExploder";
private final static Object refLock = new Object();
private static Method getTaskThumbnails = null;
private static Field taskThumbnailsBitmap = null;
@SuppressWarnings("rawtypes")
public static void listAllObject(String classFullName) {
try {
Log.i(TAG, "listAllObject classFullName: " + classFullName);
Class<?> clazz = Class.forName(classFullName);
// 反射屬性欄位
Field[] fields = clazz.getDeclaredFields();
// 反射方法欄位
Method[] methods = clazz.getDeclaredMethods();
// 反射構造器
Constructor[] constuctors = clazz.getDeclaredConstructors();
Log.i(TAG, "FIELD========");
for (Field f : fields) {
Log.i(TAG, "TYPE: " + f.getType() + " NAME: " + f.getName());
}
Log.i(TAG, "METHOD========");
for (Method m : methods) {
Log.i(TAG, "METHOD NAME: " + m.getName());
}
Log.i(TAG, "CONSTUCTOR========");
for (Constructor c : constuctors) {
Log.i(TAG, "NAME:" + c.getName());
Class[] clss = c.getParameterTypes();
Object o = null;
// 產生實例
try {
if (clss.length == 0)
o = c.newInstance();
else if (clss.length > 0) {
// TODO
}
Log.i(TAG, "object: " + o);
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static Bitmap getTaskThumbnailsBitmap(ActivityManager am, int id) {
synchronized (refLock) {
try {
if (getTaskThumbnails == null) {
getTaskThumbnails = am.getClass().getDeclaredMethod(
"getTaskThumbnails", int.class);
}
if (getTaskThumbnails != null) {
Object thumbnails = getTaskThumbnails.invoke(am,
Integer.valueOf(id));
if (thumbnails != null) {
if (taskThumbnailsBitmap == null)
taskThumbnailsBitmap = thumbnails.getClass()
.getField("mainThumbnail");
if (taskThumbnailsBitmap != null) {
return (Bitmap) taskThumbnailsBitmap
.get(thumbnails);
}
}
}
} catch (Exception e) {
Log.w(TAG, "getTaskThumbnailsBitmap error:" + e);
e.printStackTrace();
}
}
return null;
}
}
㈧ Android 讀取已安裝應用列表需要申請許可權嗎
這里我先公布下答案:不需要
我要實現讀取已安裝應用列表功能,Google了一下,可以通過PackageManager.getInstalledPackages()方法獲取,我手頭有三台手機,分別是華為Nexus 5X、Meta9、Vivo X20,寫了個Demo在這三個手機上進行測試,測試結果如下:
我沒有申請任何許可權,Vivo X20為什麼會出現申請讀取已安裝應用列表許可權對話框呢?為什麼是有時候能獲取到全部已安裝應用列表,有時候獲取不到?
Google一下,看有沒有和我類似的問題,找到了一篇:
Android 如何完整的獲取到用戶已安裝應用列表
這篇文章中,作者有個結論:『國內部分廠商比如華為、oppo,他們將」獲取用戶已安裝應用列表」的許可權暴露給了用戶,讓用戶可以自由決定允許或者禁止應用訪問該信息。』
Nexus 5X中沒有找到讀取已安裝應用列表許可權。
這里有提到華為,我打開meta 9的許可權列表看了一下有讀取已安裝應用列表許可權,我的Demo對應的這個許可權默認是打開的,所以meta 9是能獲取到全部已安裝應用列表。
再看下Vivo X20,在打開Demo的時候彈出申請許可權對話框了,說明Vivo也屬於那部分國內廠商,由於在彈出申請讀取已安裝應用列表許可權對話框時,我允許了,所以打開Vivo X20的讀取已安裝應用列表許可權時,這里的狀態是打開的,但是,點進去一看,暗藏玄機,這里還有一個 安全等級,分為高、中、低 ,我的Demo屬於高,看看其他應用呢?微信安全等級屬於低、支付寶屬於低,讀取不到應用列表難道和這個 安全等級 有關系嗎?
我手動將我的Demo的 安全等級 調整為低,再打開Demo,奇跡發生了,沒有彈出申請讀取已安裝應用列表許可權對話框,並且獲取到了全部已安裝應用列表。
Android 讀取已安裝應用列表不需要申請許可權,因為Android許可權列表中沒有許可權是用於讀取已安裝應用列表的。
如果想要獲取Vivo X20這種有 安全等級 的手機中的已安裝應用列表,由於這種 安全等級 我們無法決定,所以只能通過反向查找的方式,即通過包名能否找到應用,從而判斷是否安裝了某應用。
這種方法獲取不到全部已安裝應用列表,只能獲取到指定的應用。
如果有比較了解許可權的同學覺得我有寫的不對的地方,或者對於獲取已安裝應用列表有更好的方法,歡迎留言交流!
㈨ Android應用統計-使用時長及次數統計(一)
最近在做有關於應用統計有關的工作,主要是統計系統中客戶端應用(非系統自帶的那些基礎應用,比如DownLoadManager),在每一天的使用情況,統計內容包括:應用打開次數,應用合計使用時長等。
在所搜尋的方案中,大致有如下兩種:
以下方案採用兩個方案並行,主要是以系統數據統計結果為主,以自行記錄的數據作為參照,用以對比兩組數據,以保證數據統計結果的有效性和穩定性。
在Android中,系統會自行記錄應用的打開次數和使用時間,且提供了相關api於開發者,但是每一次版本提升都可能會對api帶來相當大的改變,這一塊也不例外。但是始終沒有變化的就是在撥號鍵盤輸入* # * #4636# * #*,進入工程模式,點擊「使用情況統計數據」,你就可以看到統計界面了。由於各個版本之間差異比較大,而且相關的資料也比較少,本次使用的api以及相關的說明都是以Android-5.1為基礎。在某些版本中,應用統計api,存在不少缺陷以及避坑的地方,尤其是手機廠家修改過源碼之後,所以對於某些品牌的測試機器,程序的運行結果會有一點不一樣,請各位讀者有所注意。
本文主要介紹了關於Android系統中統計各個app的使用情況的解決方案,以及獲取相關數據的方法。關於系統記錄的數據的原理以及在該原理的邏輯下可能出現的bug,將會在接下來的文章中詳細闡述。
github: UseTimeStatistic
參考文獻:
Android 5.0以上通過UsageStatsManager類 獲取應用使用情況(精品)
android如何獲取系統里各個應用的使用時間?
Android UsageStatsService:要點解析
Android5.1應用打開次數獲取
下一篇:Android應用統計-使用時長及次數統計(二)