网上基本都停在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 静默安装源码的实现所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)