1. 程式人生 > >Android7.0 MTK方案 靜默安裝和解除安裝

Android7.0 MTK方案 靜默安裝和解除安裝

一、android安裝apk介紹

安裝apk有兩種方法

1、呼叫系統PackageInstaller.apk進行安裝

這個系統apk所在目錄為:android/packages/apps/PackageInstaller

2、串列埠命令安裝”pm install –r hello.apk”

這個pm命令實現所在目錄為:android/frameworks/base/cmds/pm/src/com/android/commands/pm/Pm.java

它們最後都是呼叫系統底層介面實現apk安裝和解除安裝,實現靜默安裝要呼叫的就是這些介面,而這些介面怎麼呼叫,參考的就是Pm.java這個檔案。

二、apk安裝介面

1、方法一,獲取服務,呼叫aidl裡面的方法

frameworks\base\core\java\android\content\pm\IPackageManager.aidl

安裝方法

/** @deprecated Use PackageInstaller instead */
    void installPackageAsUser(in String originPath,
            in IPackageInstallObserver2 observer,
            int flags,
            in String installerPackageName,
            
int userId);

解除安裝方法

/** @deprecated rawr, don't call AIDL methods directly! */
    void deletePackageAsUser(in String packageName, IPackageDeleteObserver observer,
            int userId, int flags);

獲取服務方法

IPackageManager mIPm;
mIPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));

2、方法二,第一種方法是獲取服務後直接呼叫aidl裡面的方法,而更好的辦法是使用PackageManager.java裡面的方法,PackageManager.java是對第一張方法的封裝,最後也是通過第一種方法實現的。

PackageManager.java所在目錄為:

frameworks\base\core\java\android\content\pm\PackageManager.java

安裝方法

public abstract void installPackage(
            Uri packageURI,
            PackageInstallObserver observer,
            @InstallFlags int flags,
            String installerPackageName);

解除安裝方法

public abstract void deletePackage(String packageName, IPackageDeleteObserver observer,
            @DeleteFlags int flags);

獲得PackageManager.java物件的方法

Context mContext;
PackageManager mPm;
mContext = getApplicationContext();
mPm = mContext.getPackageManager();

3、無論哪種方法,都需要許可權

Android.mk

LOCAL_CERTIFICATE := platform
LOCAL_PRIVILEGED_MODULE := true

AndroidManifest.xml

android:sharedUserId="android.uid.system"


<uses-permission android:name="android.permission.ACCESS_SUPERUSER"/>
    <uses-permission android:name="android.permission.INSTALL_PACKAGES" />
    <uses-permission android:name="android.permission.DELETE_PACKAGES" />
    <uses-permission android:name="android.permission.CLEAR_APP_CACHE" />
    <uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MANAGE_USERS" />
    <uses-permission android:name="android.permission.GRANT_RUNTIME_PERMISSIONS" />
    <uses-permission android:name="android.permission.REVOKE_RUNTIME_PERMISSIONS" />
    <uses-permission android:name="android.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS" />
    <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
    <uses-permission android:name="android.permission.READ_INSTALL_SESSIONS" />
    <uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.KILL_UID" />
    <uses-permission android:name="android.permission.MANAGE_APP_OPS_RESTRICTIONS" />

    <uses-permission android:name="com.google.android.permission.INSTALL_WEARABLE_PACKAGES" />

    <!-- Needed for passing extras with intent ACTION_SHOW_ADMIN_SUPPORT_DETAILS -->
    <uses-permission android:name="android.permission.MANAGE_DEVICE_ADMINS" />

三、原始碼路徑如下

連結: https://pan.baidu.com/s/1ge62etl 密碼: 8n5q

四、總結

1、Runtime.getRuntime().exec()這個方法在android7.0不行,沒調通。

2、其實方法一的IPackageManager.aidl和方法二的PackageManager.java裡面的方法是過時的,Android7.0哪裡寫著 deprecated replaced by PackageInstaller。

應該使用IPackageInstaller.aidl和PackageInstaller.java更好,但是使用IPackageManager.aidl和PackageManager.java我測試也是行的。