if (dataOutputStream != null) {
dataOutputStream.close();
}
if (errorStream != null) {
errorStream.close();
}
} catch (IOException e) {
Log.e(“TAG”, e.getMessage(), e);
}
}
return result;
}
}
可以看到,SilentInstall类中只有一个install()方法,所有静默安装的逻辑都在这个方法中了,那么我们具体来看一下这个方法。首先在第21行调用了Runtime.getRuntime().exec(“su”)方法,在这里先申请ROOT权限,不然的话后面的操作都将失败。然后在第24行开始组装静默安装命令,命令的格式就是pm install -r <apk路径>,-r参数表示如果要安装的apk已经存在了就覆盖安装的意思,apk路径是作为方法参数传入的。接下来的几行就是执行上述命令的过程,注意安装这个过程是同步的,因此我们在下面调用了process.waitFor()方法,即安装要多久,我们就要在这里等多久。等待结束之后说明安装过程结束了,接下来我们要去读取安装的结果并进行解析,解析的逻辑也很简单,如果安装结果中包含Failure字样就说明安装失败,反之则说明安装成功。
整个方法还是非常简单易懂的,下面我们就来搭建调用这个方法的环境。修改activity_main.xml中的代码,如下所示:
[html] view plain copy
- <?xml version\=“1.0” encoding\=“utf-8”?>
-
<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
-
xmlns:tools=“http://schemas.android.com/tools”
-
android:layout_width=“match_parent”
-
android:layout_height=“match_parent”
-
android:orientation=“vertical”
-
android:paddingBottom=“@dimen/activity_vertical_margin”
-
android:paddingLeft=“@dimen/activity_horizontal_margin”
-
android:paddingRight=“@dimen/activity_horizontal_margin”
-
android:paddingTop=“@dimen/activity_vertical_margin”
-
tools:context=“com.example.installtest.MainActivity”>
-
<LinearLayout
-
android:layout_width=“match_parent”
-
android:layout_height=“wrap_content”>
-
<Button
-
android:layout_width=“wrap_content”
-
android:layout_height=“wrap_content”
-
android:onClick=“onChooseApkFile”
-
android:text=“选择安装包” />
-
<TextView
-
android:id=“@+id/apkPathText”
-
android:layout_width=“0dp”
-
android:layout_height=“wrap_content”
-
android:layout_weight=“1”
-
android:layout_gravity=“center_vertical”
-
/>
-
</LinearLayout>
-
<View
-
android:layout_width=“match_parent”
-
android:layout_height=“1dp”
-
android:background=“@android:color/darker_gray” />
-
<Button
-
android:layout_width=“wrap_content”
-
android:layout_height=“wrap_content”
-
android:onClick=“onSilentInstall”
-
android:text=“秒装” />
-
<View
-
android:layout_width=“match_parent”
-
android:layout_height=“1dp”
-
android:background=“@android:color/darker_gray” />
-
<Button
-
android:layout_width=“wrap_content”
-
android:layout_height=“wrap_content”
-
android:onClick=“onForwardToAccessibility”
-
android:text=“开启智能安装服务” />
-
<Button
-
android:layout_width=“wrap_content”
-
android:layout_height=“wrap_content”
-
android:onClick=“onSmartInstall”
-
android:text=“智能安装” />
-
</LinearLayout>
<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
xmlns:tools=“http://schemas.android.com/tools”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:orientation=“vertical”
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=“com.example.installtest.MainActivity”>
<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“wrap_content”>
<Button
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:onClick=“onChooseApkFile”
android:text=“选择安装包” />
<TextView
android:id="@+id/apkPathText"
android:layout_width=“0dp”
android:layout_height=“wrap_content”
android:layout_weight=“1”
android:layout_gravity=“center_vertical”
/>
<View
android:layout_width=“match_parent”
android:layout_height=“1dp”
android:background="@android:color/darker_gray" />
<Button
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:onClick=“onSilentInstall”
android:text=“秒装” />
<View
android:layout_width=“match_parent”
android:layout_height=“1dp”
android:background="@android:color/darker_gray" />
<Button
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:onClick=“onForwardToAccessibility”
android:text=“开启智能安装服务” />
<Button
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:onClick=“onSmartInstall”
android:text=“智能安装” />
这里我们先将程序的主界面确定好,主界面上拥有四个按钮,第一个按钮用于选择apk文件的,第二个按钮用于开始秒装,第三个按钮用于开启智能安装服务,第四个按钮用于开始智能安装