Android9.0 静默安装源码的实现

Android9.0 静默安装源码的实现,第1张

概述Android9.0 静默安装源码的实现 网上基本都停在8.0就没人开始分析Android9.0如何静默apk的代码,这是我自己之前研究9.0的framework整理出来的,真实源码整理 import android.content.BroadcastReceiver; import android.content.Context; import android.content.IIntentReceiver; import android.content.IIntentSender; import android.content.In

网上基本都停在8.0就没人开始分析AndroID9.0如何静默apk的代码,这是我自己之前研究9.0的framework整理出来的,真实源码整理

import androID.content.broadcastReceiver;import androID.content.Context;import androID.content.IIntentReceiver;import androID.content.IIntentSender;import androID.content.Intent;import androID.content.IntentFilter;import androID.content.IntentSender;import androID.content.pm.ApplicationInfo;import androID.content.pm.PackageInfo;import androID.content.pm.PackageInstaller;import androID.content.pm.PackageManager;import androID.net.Uri;import androID.os.Bundle;import androID.os.Environment;import androID.os.IBinder;import androID.os.remoteexception;import androID.util.Log;import java.io.file;import java.io.fileinputStream;import java.io.IOException;import java.io.inputStream;import java.io.OutputStream;import java.lang.reflect.Constructor;import java.lang.reflect.FIEld;import java.lang.reflect.InvocationTargetException;import java.util.concurrent.SynchronousQueue;import java.util.concurrent.TimeUnit;/** * 作者 : * 邮箱 : 709847739#qq.com * 时间  : 2019/2/21-9:21 * desc  : * version: 1.0 */public class PackageManagerCompatP {  private final static String TAG = PackageManagerCompatP.class.getSimplename();  public static final long MAX_WAIT_TIME = 25 * 1000;  public static final long WAIT_TIME_INCR = 5 * 1000;  private static final String SECURE_CONTAINERS_PREFIX = "/mnt/asec";  private Context mContext;  public PackageManagerCompatQ(Context context) {    this.mContext = context;  }  private static class LocalintentReceiver {    private final SynchronousQueue<Intent> mResult = new SynchronousQueue<>();    private IIntentSender.Stub mLocalSender = new IIntentSender.Stub() {      @OverrIDe      public voID send(int code,Intent intent,String resolvedType,IBinder whiteListToken,IIntentReceiver finishedReceiver,String requiredPermission,Bundle options) {        try {          mResult.offer(intent,5,TimeUnit.SECONDS);        } catch (InterruptedException e) {          throw new RuntimeException(e);        }      }    };    public IntentSender getIntentSender() {      Class<?> aClass = null;      try {        aClass = Class.forname("androID.content.IntentSender");      } catch (ClassNotFoundException e) {        e.printstacktrace();      }      if (aClass == null) {        return null;      }      try {        Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors();        for (Constructor<?> declaredConstructor : declaredConstructors) {          Log.i(TAG,"declaredConstructor.toString():" + declaredConstructor.toString());          Log.i(TAG,"declaredConstructor.getname():" + declaredConstructor.getname());          Class<?>[] parameterTypes = declaredConstructor.getParameterTypes();          for (Class<?> parameterType : parameterTypes) {            Class aClass1 = parameterType.getClass();            Log.i(TAG,"parameterTypes...aClass1:" + aClass1.getname());          }        }      } catch (Exception e) {        e.printstacktrace();      }      Constructor constructor = null;      try {        constructor = aClass.getDeclaredConstructor(IIntentSender.class);      } catch (NoSuchMethodException e) {        e.printstacktrace();      }      if (constructor == null) {        return null;      }      Object o = null;      try {        o = constructor.newInstance((IIntentSender) mLocalSender);      } catch (illegalaccessexception e) {        e.printstacktrace();      } catch (InstantiationException e) {        e.printstacktrace();      } catch (InvocationTargetException e) {        e.printstacktrace();      }      return (IntentSender) o;//         new IntentSender((IIntentSender) mLocalSender)    }    public Intent getResult() {      try {        return mResult.take();      } catch (InterruptedException e) {        throw new RuntimeException(e);      }    }  }  private PackageManager getPm() {    return mContext.getPackageManager();  }  private PackageInstaller getPi() {    return getPm().getPackageInstaller();  }  private voID writeSplitToInstallSession(PackageInstaller.Session session,String inPath,String splitname) throws remoteexception {    long sizeBytes = 0;    final file file = new file(inPath);    if (file.isfile()) {      sizeBytes = file.length();    } else {      return;    }    inputStream in = null;    OutputStream out = null;    try {      in = new fileinputStream(inPath);      out = session.openWrite(splitname,sizeBytes);      int total = 0;      byte[] buffer = new byte[65536];      int c;      while ((c = in.read(buffer)) != -1) {        total += c;        out.write(buffer,c);      }      session.fsync(out);    } catch (IOException e) {      e.printstacktrace();    } finally {      IoUtils.closeQuIEtly(out);      IoUtils.closeQuIEtly(in);      IoUtils.closeQuIEtly(session);    }  }  /**   * 入口方法   * String apkPackagename = ""; //填写安装的包名   * String apkPath = "";//填写安装的路径   **/  public voID testReplaceFlagSdcardInternal(String apkPackagename,String apkPath) throws Exception {    // Do not run on devices with emulated external storage.    if (Environment.isExternalStorageEmulated()) {      return;    }    int iFlags = 0x00000008;// PackageManager.INSTALL_EXTERNAL 0x00000008    int rFlags = 0;    //这个暂时用不上    //InstallParams ip = sampleInstallFromrawResource(iFlags,false);    Uri uri = Uri.fromfile(new file(apkPath));    GenericReceiver receiver = new ReplaceReceiver(apkPackagename);    int replaceFlags = rFlags | 0x00000002;//PackageManager.INSTALL_REPLACE_EXISTING 0x00000002    try {      invokeInstallPackage(uri,replaceFlags,receiver,true);      //assertInstall(ip.pkg,iFlags,ip.pkg.installLocation);    } catch (Exception e) {      Log.e(TAG,"Failed with exception : " + e);    } finally {//      cleanUpInstall(ip);    }  }//  class InstallParams {//    Uri packageURI;////    PackageParser.Package pkg;////    InstallParams(String outfilename,int rawResID) throws PackageParserException {//      this.pkg = getParsedPackage(outfilename,rawResID);//      this.packageURI = Uri.fromfile(new file(pkg.codePath));//    }////    InstallParams(PackageParser.Package pkg) {//      this.packageURI = Uri.fromfile(new file(pkg.codePath));//      this.pkg = pkg;//    }////    long getApkSize() {//      file file = new file(pkg.codePath);//      return file.length();//    }//  }////  private InstallParams sampleInstallFromrawResource(int flags,boolean cleanUp)//      throws Exception {//    return installFromrawResource("install.apk",androID.R.raw.install,flags,cleanUp,false,-1,//        PackageInfo.INSTALL_LOCATION_UnspecIFIED);//  }//  private voID cleanUpInstall(InstallParams ip) {////  }  private voID cleanUpInstall(String pkgname) throws Exception {    if (pkgname == null) {      return;    }    Log.i(TAG,"Deleting package : " + pkgname);    try {      final ApplicationInfo info = getPm().getApplicationInfo(pkgname,PackageManager.MATCH_UNINSTALLED_PACKAGES);      if (info != null) {        //PackageManager.DELETE_ALL_USERS        final LocalintentReceiver localReceiver = new LocalintentReceiver();        //这是卸载,不调用//        getPi().uninstall(pkgname,//            0x00000002,//            localReceiver.getIntentSender());        localReceiver.getResult();        assertUninstalled(info);      }    } catch (IllegalArgumentException | PackageManager.nameNotFoundException e) {      e.printstacktrace();    }  }  private static voID assertUninstalled(ApplicationInfo info) throws Exception {    file nativelibraryfile = new file(info.nativelibraryDir);    Log.e(TAG,"Native library directory " + info.nativelibraryDir        + " should be erased" + nativelibraryfile.exists());  }  private voID invokeInstallPackage(Uri packageUri,int flags,GenericReceiver receiver,boolean shouldSucceed) {    mContext.registerReceiver(receiver,receiver.filter);    synchronized (receiver) {      final String inPath = packageUri.getPath();      PackageInstaller.Session session = null;      try {        final PackageInstaller.SessionParams sessionParams =            new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FulL_INSTALL);        try {          //sessionParams.installFlags = flags;          FIEld installFlags = sessionParams.getClass().getDeclaredFIEld("installFlags");          installFlags.set(sessionParams,flags);        } catch (NoSuchFIEldException e) {          e.printstacktrace();        } catch (illegalaccessexception e) {          e.printstacktrace();        }        final int sessionID = getPi().createSession(sessionParams);        session = getPi().openSession(sessionID);        writeSplitToInstallSession(session,inPath,"base.apk");        final LocalintentReceiver localReceiver = new LocalintentReceiver();        session.commit(localReceiver.getIntentSender());        final Intent result = localReceiver.getResult();        final int status = result.getIntExtra(PackageInstaller.EXTRA_STATUS,PackageInstaller.STATUS_FAILURE);        if (shouldSucceed) {          if (status != PackageInstaller.STATUS_SUCCESS) {            Log.e(TAG,"Installation should have succeeded,but got code " + status);          }        } else {          if (status == PackageInstaller.STATUS_SUCCESS) {            Log.e(TAG,"Installation should have Failed");          }          // We'll never get a broadcast since the package Failed to install          return;        }        // Verify we received the broadcast        long waitTime = 0;        while ((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME)) {          try {            receiver.wait(WAIT_TIME_INCR);            waitTime += WAIT_TIME_INCR;          } catch (InterruptedException e) {            Log.i(TAG,"Interrupted during sleep",e);          }        }        if (!receiver.isDone()) {          Log.e(TAG,"Timed out waiting for PACKAGE_ADDED notification");        }      } catch (IllegalArgumentException | IOException | remoteexception e) {        Log.e(TAG,"Failed to install package; path=" + inPath,e);      } finally {        IoUtils.closeQuIEtly(session);        mContext.unregisterReceiver(receiver);      }    }  }  private abstract static class GenericReceiver extends broadcastReceiver {    private boolean doneFlag = false;    boolean received = false;    Intent intent;    IntentFilter filter;    abstract boolean notifyNow(Intent intent);    @OverrIDe    public voID onReceive(Context context,Intent intent) {      if (notifyNow(intent)) {        synchronized (this) {          received = true;          doneFlag = true;          this.intent = intent;          notifyAll();        }      }    }    public boolean isDone() {      return doneFlag;    }    public voID setFilter(IntentFilter filter) {      this.filter = filter;    }  }  class ReplaceReceiver extends GenericReceiver {    String pkgname;    final static int INVALID = -1;    final static int REMOVED = 1;    final static int ADDED = 2;    final static int REPLACED = 3;    int removed = INVALID;    // for updated system apps only    boolean update = false;    ReplaceReceiver(String pkgname) {      this.pkgname = pkgname;      filter = new IntentFilter(Intent.ACTION_PACKAGE_REMOVED);      filter.addAction(Intent.ACTION_PACKAGE_ADDED);      if (update) {        filter.addAction(Intent.ACTION_PACKAGE_REPLACED);      }      filter.addDataScheme("package");      super.setFilter(filter);    }    public boolean notifyNow(Intent intent) {      String action = intent.getAction();      Uri data = intent.getData();      String installedPkg = data.getEncodedSchemeSpecificPart();      if (pkgname == null || !pkgname.equals(installedPkg)) {        return false;      }      if (Intent.ACTION_PACKAGE_REMOVED.equals(action)) {        removed = REMOVED;      } else if (Intent.ACTION_PACKAGE_ADDED.equals(action)) {        if (removed != REMOVED) {          return false;        }        boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING,false);        if (!replacing) {          return false;        }        removed = ADDED;        if (!update) {          return true;        }      } else if (Intent.ACTION_PACKAGE_REPLACED.equals(action)) {        if (removed != ADDED) {          return false;        }        removed = REPLACED;        return true;      }      return false;    }  }}

就这一个类的封装,我也是看framework扣出来的

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

总结

以上是内存溢出为你收集整理的Android9.0 静默安装源码的实现全部内容,希望文章能够帮你解决Android9.0 静默安装源码的实现所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1144221.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存