android 4.0.4系统下实现apk的静默安装和启动
16lz
2021-12-04
转 android 4.0.4系统下实现apk的静默安装和启动
分类: Android 2013-02-14 14:13 1762人阅读 评论(10) 收藏 举报最近在android 4.0.4系统下实现apk的静默安装和启动的功能,这里和大家分享一下,希望能有所帮助。
源码如下:
[java] view plain copy- importjava.io.DataOutputStream;
- importjava.io.File;
- importjava.io.IOException;
- importjava.io.OutputStream;
- importjava.util.ArrayList;
- importjava.util.List;
- importandroid.content.Context;
- importandroid.content.Intent;
- importandroid.content.pm.ActivityInfo;
- importandroid.content.pm.PackageInfo;
- importandroid.content.pm.PackageManager;
- importandroid.content.pm.ResolveInfo;
- publicclassInstallApkUtils{
- publicstaticvoidinstallAndStartApk(finalContextcontext,finalStringapkPath){
- if((apkPath==null)||(context==null)){
- return;
- }
- Filefile=newFile(apkPath);
- if(file.exists()==false){
- return;
- }
- newThread(){
- publicvoidrun(){
- StringpackageName=getUninstallApkPackageName(context,apkPath);
- if(silentInstall(apkPath)){
- List<ResolveInfo>matches=findActivitiesForPackage(context,packageName);
- if((matches!=null)&&(matches.size()>0)){
- ResolveInforesolveInfo=matches.get(0);
- ActivityInfoactivityInfo=resolveInfo.activityInfo;
- startApk(activityInfo.packageName,activityInfo.name);
- }
- }
- };
- }.start();
- }
- publicstaticStringgetUninstallApkPackageName(Contextcontext,StringapkPath){
- StringpackageName=null;
- if(apkPath==null){
- returnpackageName;
- }
- PackageManagerpm=context.getPackageManager();
- PackageInfoinfo=pm.getPackageArchiveInfo(apkPath,
- PackageManager.GET_ACTIVITIES);
- if(info==null){
- returnpackageName;
- }
- packageName=info.packageName;
- returnpackageName;
- }
- publicstaticList<ResolveInfo>findActivitiesForPackage(Contextcontext,StringpackageName){
- finalPackageManagerpm=context.getPackageManager();
- finalIntentmainIntent=newIntent(Intent.ACTION_MAIN,null);
- mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
- mainIntent.setPackage(packageName);
- finalList<ResolveInfo>apps=pm.queryIntentActivities(mainIntent,0);
- returnapps!=null?apps:newArrayList<ResolveInfo>();
- }
- publicstaticbooleansilentInstall(StringapkPath){
- Stringcmd1="chmod777"+apkPath+"\n";
- Stringcmd2="LD_LIBRARY_PATH=/vendor/lib:/system/libpminstall-r"+apkPath+"\n";
- returnexecWithSID(cmd1,cmd2);
- }
- privatestaticbooleanexecWithSID(String...args){
- booleanisSuccess=false;
- Processprocess=null;
- OutputStreamout=null;
- try{
- process=Runtime.getRuntime().exec("su");
- out=process.getOutputStream();
- DataOutputStreamdataOutputStream=newDataOutputStream(out);
- for(Stringtmp:args){
- dataOutputStream.writeBytes(tmp);
- }
- dataOutputStream.flush();//提交命令
- dataOutputStream.close();//关闭流操作
- out.close();
- isSuccess=waitForProcess(process);
- }catch(IOExceptione){
- e.printStackTrace();
- }
- returnisSuccess;
- }
- publicstaticbooleanstartApk(StringpackageName,StringactivityName){
- booleanisSuccess=false;
- Stringcmd="amstart-n"+packageName+"/"+activityName+"\n";
- try{
- Processprocess=Runtime.getRuntime().exec(cmd);
- isSuccess=waitForProcess(process);
- }catch(IOExceptione){
- NLog.i(TAG,e.getMessage());
- e.printStackTrace();
- }
- returnisSuccess;
- }
- privatestaticbooleanwaitForProcess(Processp){
- booleanisSuccess=false;
- intreturnCode;
- try{
- returnCode=p.waitFor();
- switch(returnCode){
- case0:
- isSuccess=true;
- break;
- case1:
- break;
- default:
- break;
- }
- }catch(InterruptedExceptione){
- e.printStackTrace();
- }
- returnisSuccess;
- }
- }
如果要使用,还需以下步骤:
1、在AndroidManifest.xml文件里添加如下权限:
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
2、进行系统签名。命令如下:
java -jar signapk.jar platform.x509.pem platform.pk8 XXX.apk Signed_XXX.apk
备注:一般可在源码的目录\out\host\linux-x86\framework\下找到signapk.jar,在\build\target\product\security下找到签名文件platform.x509.pem和platform.pk8。
好了,现在大功告成!!!
更多相关文章
- android中如何执行java命令
- AVD 简介
- H264解码器源码(Android(安卓)1.6 版)
- Android之——自动挂断电话的实现
- Android(安卓)单击listview弹出popupwindow弹出框
- Android(安卓)下面的一些命令
- Android(安卓)4.0 Launcher2源码分析——主布局文件
- 两分钟彻底让你明白Android中onInterceptTouchEvent与onTouchEve
- Android(安卓)4.0 Launcher2源码分析——主布局文件