代码中执行apk安装、卸载、更新以及静默安装

来源:互联网 发布:ubuntu设置ipv6 dns 编辑:程序博客网 时间:2024/05/18 15:55
 

代码中执行apk安装、卸载、更新以及静默安装

分类: android 216人阅读 评论(0)收藏 举报
[java] view plaincopyprint?
  1. import java.io.File;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.net.Uri;  
  6. import android.os.Bundle;  
  7. import android.view.View;  
  8. import android.widget.Button;  
  9.   
  10. public class MainActivity extends Activity {  
  11.     /** Called when the activity is first created. */  
  12.     @Override  
  13.     public void onCreate(Bundle savedInstanceState) {  
  14.         super.onCreate(savedInstanceState);  
  15.         setContentView(R.layout.main);  
  16.             
  17.         Button installBtn = (Button)findViewById(R.id.install_btn);  
  18.         installBtn.setOnClickListener(new View.OnClickListener() {  
  19.             @Override  
  20.             public void onClick(View v) {  
  21.                 Intent intent = new Intent(Intent.ACTION_VIEW);  
  22.                 intent.setDataAndType(Uri.fromFile(new File("/sdcard/xxx.apk")),   
  23.                         "application/vnd.android.package-archive");  
  24.                   
  25.                 MainActivity.this.startActivity(intent);  
  26.             }  
  27.         });  
  28.           
  29.         Button uninstallBtn = (Button)findViewById(R.id.uninstall_btn);  
  30.         uninstallBtn.setOnClickListener(new View.OnClickListener() {  
  31.             @Override  
  32.             public void onClick(View v) {  
  33.                 Uri uri = Uri.parse("package:com.xxx.xxx(包名)");  
  34.                 Intent intent2 = new Intent(Intent.ACTION_DELETE, uri);     
  35.                 MainActivity.this.startActivity(intent2);  
  36.             }  
  37.         });  
  38.     }  
  39. }  


上述安装不仅可以安装新的apk,也适用于更新旧的apk

更新apk必须保证新旧apk签名一致。

对于data分区的外部应用更新:

       新的apk覆盖旧的apk

对于systen系统分区的内置应用更新:

       system/app/下的旧apk仍然存在,新的apk被复制到data/app下。虽然同时存在两新旧apk,但运行时系统选择data分区的新apk运行!

       如果执行卸载则是删除data分区的apk,再次启动程序运行的是system的旧apk


静默安装

静默安装apk时,程序需要平台签名(使用signapk),

singapk命令行签名

    #java -jar signapk.jar platform.x509.pem platform.pk8 xxx.apk xxx-sign.apk

如果要将apk安装在system分区下还要在mantifest中加入系统权限

    <mantifest

    ...

    android:sharedUserId="android.uid.system" >

uses-permission也需要安装apk的权限

<uses-permission android:name="android.permission.INSTALL_PACKAGES" />


eclipse工程需要引入framework.jar

自定义MyPackageInstallObserver类继承自IPackageInstallObserver.Stub

[html] view plaincopyprint?
  1. public void installOnBackground(File file){  
  2.     Log.i(TAG, "installOnBackground()");  
  3.     int installFlags = 0;  
  4.     Uri packageUri = Uri.fromFile(file);<SPAN style="WHITE-SPACE: pre"> </SPAN>//file是要安装的apk文件  
  5.        
  6.     PackageManager pm = mContext.getPackageManager();  
  7.     installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;  
  8.       
  9.     MyPackageInstallObserver observer = new MyPackageInstallObserver();  
  10.     pm.installPackage(packageUri, observer, installFlags, "com.xxx.xxx包名");   
  11. }  
  12.   
  13. private static class MyPackageInstallObserver extends IPackageInstallObserver.Stub{  
  14.     @Override  
  15.     public void packageInstalled(String packageName, int returnCode)  
  16.             throws RemoteException {  
  17.         //returnCode=1表示安装成功  
  18.         Log.e(TAG, "packageInstalled()");  
  19.         Log.i(TAG, "packageName = " + packageName);  
  20.         Log.i(TAG, "returnCode = " + returnCode);  
  21.     }  
  22. }  
原创粉丝点击