您當前的位置:首頁 > 攝影

APK的更新、安裝、隱藏、解除隱藏

作者:由 程式設計師小何SS 發表于 攝影時間:2021-12-13

一、使用者安裝的apk發生更新

public void registerReceiver(Context context) {

Slog。d(“PMSdddd”, “systemReady1”);

IntentFilter filter = new IntentFilter();

filter。addAction(Intent。ACTION_PACKAGE_ADDED);

filter。addAction(Intent。ACTION_PACKAGE_CHANGED);

filter。addAction(Intent。ACTION_PACKAGE_REPLACED);

filter。addAction(Intent。ACTION_PACKAGE_REMOVED);

filter。addDataScheme(“package”);

BroadcastReceiver packgeMonitorReceiver = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

final String action = intent。getAction();

final String packageName =

intent。getData()。getSchemeSpecificPart();

final boolean replacing =

intent。getBooleanExtra(Intent。EXTRA_REPLACING, false);

final boolean dataRemoved =

intent。getBooleanExtra(Intent。EXTRA_DATA_REMOVED, false);

Slog。d(“PMSdddd”, “action: ” + action + “ packageName:”

+ packageName + “ replacing:” + replacing

+ “ dataRemoved:” + dataRemoved);

}

};

context。registerReceiver(packgeMonitorReceiver, filter);

}

第1步,新安裝apk

adb install apk

Line 52701: 02-01 21:26:23。213 1727 1727 D PMSdddd : action: android。intent。action。PACKAGE_ADDED packageName:com。adobe。reader replacing:false dataRemoved:false

第2步,hide此 apk

adb shell pm hide apk

Line 53895: 02-01 21:28:22。043 1727 1727 D PMSdddd : action: android。intent。action。PACKAGE_REMOVED packageName:com。adobe。reader replacing:false dataRemoved:false

第3步,adb install更新

adb install -r apk

Line 54477: 02-01 21:29:41。550 1727 1727 D PMSdddd : action: android。intent。action。PACKAGE_REMOVED packageName:com。adobe。reader replacing:true dataRemoved:false

Line 54512: 02-01 21:29:41。648 1727 1727 D PMSdddd : action: android。intent。action。PACKAGE_ADDED packageName:com。adobe。reader replacing:true dataRemoved:false

第4步,再unhide此apk

adb shell pm unhide apk

Line 55640: 02-01 21:32:25。651 1727 1727 D PMSdddd : action: android。intent。action。PACKAGE_ADDED packageName:com。adobe。reader replacing:false dataRemoved:false

第5步,adb uninstall 解除安裝apk

Line 61310: 02-01 21:52:36。395 1727 1727 D PMSdddd : action: android。intent。action。PACKAGE_REMOVED packageName:com。adobe。reader replacing:false dataRemoved:true

總結:

hide命令:系統會發送廣播 android。intent。action。PACKAGE_REMOVED,data資料並不會刪除

unhide命令:系統會發送廣播android。intent。action。PACKAGE_ADDED,data資料不會刪除

更新apk時:

系統先發送廣播 android。intent。action。PACKAGE_REMOVED,intent。getBooleanExtra(Intent。EXTRA_REPLACING, false) 獲取的值為true

系統隨後傳送廣播android。intent。action。PACKAGE_ADDED,intent。getBooleanExtra(Intent。EXTRA_REPLACING, false) 獲取的值也為true

解除安裝apk時:

系統傳送廣播 android。intent。action。PACKAGE_REMOVED,intent。getBooleanExtra(Intent。EXTRA_DATA_REMOVED, false)獲取的值為true

二、系統apk(位於:system/app 目錄)發生更新

第1步,預置apk(v1。0)到system/app

adb push apk system/app

再恢復出廠設定

第2步,adb install-r更新apk到v2。0

Line 8118: 02-02 02:55:59。428 1130 1130 D PMSdddd : action: android。intent。action。PACKAGE_REMOVED packageName:com。example。ddd replacing:true dataRemoved:false

Line 8134: 02-02 02:55:59。501 1130 1130 D PMSdddd : action: android。intent。action。PACKAGE_ADDED packageName:com。example。ddd replacing:true dataRemoved:false

Line 8281: 02-02 02:55:59。903 1130 1130 D PMSdddd : action: android。intent。action。PACKAGE_REPLACED packageName:com。example。ddd replacing:true dataRemoved:false

更新後的apk安裝在 data/app目錄:

Line 8550: 02-02 05:12:10。806 1132 1228 I PackageManager: Update system package com。example。ddd code path from /system/operator/app/AndroidDemoV1。0。apk to /data/app/~~IYd549AfrGeHUc-lWfY8kg==/com。example。ddd-o9yTi7O1l3Cm3EhqTvf2Rw==; Retain data and using new

Line 8550: 02-02 05:12:10。806 1132 1228 I PackageManager: Update system package com。example。ddd code path from /system/operator/app/AndroidDemoV1。0。apk to /data/app/~~IYd549AfrGeHUc-lWfY8kg==/com。example。ddd-o9yTi7O1l3Cm3EhqTvf2Rw==; Retain data and using new

Line 8551: 02-02 05:12:10。808 1132 1228 I PackageManager: Update system package com。example。ddd resource path from /system/operator/app/AndroidDemoV1。0。apk to /data/app/~~IYd549AfrGeHUc-lWfY8kg==/com。example。ddd-o9yTi7O1l3Cm3EhqTvf2Rw==; Retain data and using new

Line 8551: 02-02 05:12:10。808 1132 1228 I PackageManager: Update system package com。example。ddd resource path from /system/operator/app/AndroidDemoV1。0。apk to /data/app/~~IYd549AfrGeHUc-lWfY8kg==/com。example。ddd-o9yTi7O1l3Cm3EhqTvf2Rw==; Retain data and using new

第3步,Settings“應用資訊”介面無法解除安裝,沒有解除安裝按鈕(開啟、停用、強行停止三個按鈕)

總結:

系統apk發生更新時,系統依次傳送廣播:action: android。intent。action。PACKAGE_REMOVED、action: android。intent。action。PACKAGE_ADDED、action: android。intent。action。PACKAGE_REPLACED

且 intent。getBooleanExtra(Intent。EXTRA_REPLACING, false) 獲取的值為true

Android 監聽多使用者切換,隱藏和禁用指定Apk

IntentFilter filter = new IntentFilter();

filter。addAction(Intent。ACTION_USER_SWITCHED);

filter。addAction(Intent。ACTION_USER_ADDED);

BroadcastReceiver mUserSwitchedReceiver = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

final String action = intent。getAction();

final int userId = intent。getIntExtra(Intent。EXTRA_USER_HANDLE, UserHandle。USER_NULL);

if (userId == UserHandle。USER_NULL) {

Slog。e(“PMSdddd”, “received an invalid EXTRA_USER_HANDLE”);

return;

}

if (Intent。ACTION_USER_SWITCHED。equals(action) && userId > 0) {

Slog。d(“PMSdddd”, “User switched to userId ” + userId);

AsyncTask。execute(new Runnable() {

@Override

public void run() {

Slog。d(“PMSdddd”, “install start11”);

Sbbbbbbbbbbb。hideOtherBrandAppWhenUserSwitched();

}

});

} else if (Intent。ACTION_USER_ADDED。equals(action) && userId > 0) {

Slog。d(“PMSdddd”, “Added User userId ” + userId);

AsyncTask。execute(new Runnable() {

@Override

public void run() {

Slog。d(“PMSdddd”, “install start11”);

Sbbbbbbbbbbb

。hideOtherBrandAppWhenUserSwitched(); } }); } } }; mContext。registerReceiver(mUserSwitchedReceiver, filter);

是否隱藏和禁用apk

/**

* only hide app but don‘t delete user data

*

* @param pkgName

*/

private void hide(String pkgName) {

final PackageManager pm = mContext。getPackageManager();

int userId = ActivityManager。getCurrentUser();

pm。setApplicationHiddenSettingAsUser(pkgName, true, new UserHandle(userId));

disableApplication(pkgName);

}

private void unhide(String pkgName) {

final PackageManager pm = mContext。getPackageManager();

int userId = ActivityManager。getCurrentUser();

pm。setApplicationHiddenSettingAsUser(pkgName, false, new UserHandle(userId));

enableApplication(pkgName);

}

private void disableApplication(String pkgName) {

final PackageManager pm = mContext。getPackageManager();

try {

int state = pm。getApplicationEnabledSetting(pkgName);

Slog。d(TAG, “disableApplication state: ” + state + “ pkgName:” + pkgName);

if (state == PackageManager。COMPONENT_ENABLED_STATE_DISABLED)

return;

pm。setApplicationEnabledSetting(pkgName, PackageManager。COMPONENT_ENABLED_STATE_DISABLED, 0);

} catch (IllegalArgumentException exeption) {

Slog。w(TAG, “disableApplication error:” + exeption。getMessage());

}

}

private void enableApplication(String pkgName) {

final PackageManager pm = mContext。getPackageManager();

try {

int state = pm。getApplicationEnabledSetting(pkgName);

Slog。d(TAG, “enableApplication state: ” + state + “ pkgName:” + pkgName);

if (state == PackageManager。COMPONENT_ENABLED_STATE_ENABLED)

return;

pm。setApplicationEnabledSetting(pkgName, PackageManager。COMPONENT_ENABLED_STATE_ENABLED, 0);

} catch (IllegalArgumentException exeption) {

Slog。w(TAG, “enableApplication error:” + exeption。getMessage());

}

}

隱藏的apk或disable的apk,資訊儲存在 /data/system/users/0/package-restrictions。xml 檔案內

apk被hide後,儲存的資訊:hidden=“true”

apk被disable後,根據 setApplicationEnabledSetting 傳入的常量引數不同,enabled= 的值就會不同,如下介紹:

public static final int COMPONENT_ENABLED_STATE_DISABLED = 2; // disable應用時,若傳入此引數,則應用在桌面沒有圖示,且在設定介面、應用程式列表裡面也沒有圖示 (應用完全隱藏了)

public static final int COMPONENT_ENABLED_STATE_DISABLED_USER = 3; // disable應用時,若傳入此引數,則應用在桌面沒有圖示,但是在設定介面、應用程式列表裡面有圖示 (只是桌面圖示隱藏了,設定裡面仍可以看到圖示,使用者可以再次enable此應用)

另外:adb shell pm disable-user 應用包名: 相當於傳入的引數是 COMPONENT_ENABLED_STATE_DISABLED。

檢視手機有哪些應用處於disable狀態的方法:

方法1:adb shell pm list packages -d

C:\Users\zzz>adb shell pm list packages -d

package:com。facebook。services

package:com。google。android。videos

package:com。facebook。appmanager

方法2:adb shell pm dump packages > Desktop/log2。txt

enabled=2 ——>表示應用處於disable狀態,對應的值:COMPONENT_ENABLED_STATE_DISABLED

Package [com。facebook。appmanager] (a926214):

userId=10098

pkg=Package{9ae0abd com。facebook。appmanager}

codePath=/system/app/appmanager

resourcePath=/system/app/appmanager

legacyNativeLibraryDir=/system/app/appmanager/lib

primaryCpuAbi=arm64-v8a

secondaryCpuAbi=null

versionCode=277606887 minSdk=21 targetSdk=30

versionName=67。3。0

splits=[base]

apkSigningVersion=2

applicationInfo=ApplicationInfo{9ae0abd com。facebook。appmanager}

flags=[ SYSTEM HAS_CODE ALLOW_CLEAR_USER_DATA ]

privateFlags=[ PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION ALLOW_AUDIO_PLAYBACK_CAPTURE HAS_DOMAIN_URLS PRIVATE_FLAG_ALLOW_NATIVE_HEAP_POINTER_TAGGING ]

forceQueryable=false

queriesIntents=[Intent { act=com。facebook。secure。packagefinder。intent。ACTION_QUERY_PACKAGES }]

dataDir=/data/user/0/com。facebook。appmanager

supportsScreens=[small, medium, large, xlarge, resizeable, anyDensity]

timeStamp=2021-07-12 23:30:37

firstInstallTime=2021-07-12 23:30:37

lastUpdateTime=2021-07-12 23:30:37

signatures=PackageSignatures{18e58b2 version:2, signatures:[c4e416cc], past signatures:[]}

installPermissionsFixed=true

pkgFlags=[ SYSTEM HAS_CODE ALLOW_CLEAR_USER_DATA ]

declared permissions:

com。facebook。appmanager。ACCESS: prot=signature, INSTALLED

com。facebook。appmanager。API_ACCESS: prot=normal, INSTALLED

install permissions:

android。permission。DOWNLOAD_WITHOUT_NOTIFICATION: granted=true

android。permission。FOREGROUND_SERVICE: granted=true

android。permission。RECEIVE_BOOT_COMPLETED: granted=true

android。permission。INTERNET: granted=true

android。permission。GET_PACKAGE_SIZE: granted=true

com。facebook。appmanager。ACCESS: granted=true

android。permission。ACCESS_NETWORK_STATE: granted=true

android。permission。ACCESS_WIFI_STATE: granted=true

android。permission。WAKE_LOCK: granted=true

User 0: ceDataInode=4785 installed=true hidden=false suspended=false distractionFlags=0 stopped=false notLaunched=false enabled=2 instant=false virtual=false

overlay paths:

/product/overlay/NavigationBarModeGestural/NavigationBarModeGesturalOverlay。apk

lastDisabledCaller: android

gids=[3003]

檢視哪些應用屬於系統簽名?

方法:adb shell pm dump packages > Desktop/log2。txt

包名為“android”的apk屬於平臺apk,肯定是系統簽名,首先看一下包名為“android”的apk的簽名信息:

Package [android] (ad28bfa):

userId=1000

sharedUser=SharedUserSetting{769a3df android。uid。system/1000}

pkg=Package{6103b22 android}

codePath=/system/framework/framework-res。apk

resourcePath=/system/framework/framework-res。apk

legacyNativeLibraryDir=/system/lib64/framework-res

primaryCpuAbi=arm64-v8a

secondaryCpuAbi=null

versionCode=30 minSdk=30 targetSdk=30

versionName=11

splits=[base]

apkSigningVersion=3

applicationInfo=ApplicationInfo{6103b22 android}

flags=[ SYSTEM PERSISTENT ALLOW_BACKUP ]

privateFlags=[ PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION ALLOW_AUDIO_PLAYBACK_CAPTURE DEFAULT_TO_DEVICE_PROTECTED_STORAGE DIRECT_BOOT_AWARE PRIVILEGED PRIVATE_FLAG_ALLOW_NATIVE_HEAP_POINTER_TAGGING ]

forceQueryable=true

queriesPackages=[]

dataDir=/data/system

supportsScreens=[small, medium, large, xlarge, resizeable, anyDensity]

timeStamp=2021-07-12 23:27:41

firstInstallTime=2021-07-12 23:27:41

lastUpdateTime=2021-07-12 23:27:41

signatures=PackageSignatures{539b9b3 version:3, signatures:[a0521abc], past signatures:[]}

installPermissionsFixed=true

pkgFlags=[ SYSTEM PERSISTENT ALLOW_BACKUP ]

declared permissions:

android。permission。READ_CONTACTS: prot=dangerous, INSTALLED

android。permission。WRITE_CONTACTS: prot=dangerous, INSTALLED

……。。

User 0: ceDataInode=4316 installed=true hidden=false suspended=false distractionFlags=0 stopped=false notLaunched=false enabled=0 instant=false virtual=false

overlay paths:

/product/overlay/NavigationBarModeGestural/NavigationBarModeGesturalOverlay。apk

從上面資訊可以看到,簽名信息:signatures:[a0521abc] ,然後在 log2。txt 檔案全域性搜尋“a0521abc”,可以列出所有系統簽名的應用。

結語:後續會持續更新哦,喜歡的話點贊關注一下吧。

相關影片

【Android進階】APK的加固最佳化_嗶哩嗶哩_bilibili

標簽: action  intent  false  Android  com