如何通过 adb 向安卓手机adb install 静默安装装 apk

实现静默安装和卸载应用 - 梁DH - 博客园
随笔 - 87, 文章 - 1, 评论 - 52, 引用 - 0
前段时间做了一个批量安装卸载应用程序的小应用,由于安装卸载应用程序的部分API是隐藏的,所以必须在ubuntu下下载Android系统源码,并编译之后使用MM命令编译生成APK文件,其实也难。思路是这样的,在XX/packages/apps目录下有一个PackageInstaller的应用程序,Android机器中安装卸载都是由这个应用程序完成的。但是它没有批量安装和卸载的功能,如果要在自己的应用程序中添加批量安装和卸载的功能,其实很简单,只需要参考PakcageInstaller里面的安装卸载代码加个循环就可以了。但值得注意的是在编译的过程中必须复制PackageInstaller里面的Android.mk文件,修改文件为工程目录名。好了,废话不再多说,下面是关键代码
& &1、 Android.mk文件
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := PackageInstaller
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)
重点是LOCAL_CERTIFICATE := platform要对
& &2、PakcageInstaller.java文件(关键代码)
package cn.ceadic.
import java.io.F
import java.io.FileNotFoundE
import java.io.FileOutputS
import java.io.IOE
import android.content.C
import android.content.I
import android.content.pm.PackageI
import android.content.pm.PackageM
import android.content.pm.PackageManager.NameNotFoundE
import android.net.U
import android.util.L
import android.content.pm.IPackageInstallO
import android.content.pm.IPackageDeleteO
import android.os.FileU
public class PackageInstaller {
private File mTmpF
private final String TMP_FILE_NAME = "tmpCopy.apk";
private final static String TAG = "PackInstaller";
private Context mC
public PackageInstaller(Context context) {
mContext =
public void install(String path,String packageName){
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(path)),
"application/vnd.android.package-archive");
mContext.startActivity(intent);
public void instatllBatch(String path, String packageName) {
Log.i(TAG, "path=" + path);
int installFlags = 0;
PackageManager pm = mContext.getPackageManager();
PackageInfo pi = pm.getPackageInfo(packageName,
PackageManager.GET_UNINSTALLED_PACKAGES);
if (pi != null) {
installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;
} catch (NameNotFoundException e) {
if ((installFlags & PackageManager.INSTALL_REPLACE_EXISTING) != 0) {
Log.w(TAG, "Replacing package:" + packageName);
// Create temp file before invoking install api
mTmpFile = createTempPackageFile(path);
if (mTmpFile == null) {
// Message msg = mHandler.obtainMessage(INSTALL_COMPLETE);
// msg.arg1 = PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE;
// mHandler.sendMessage(msg);
Uri mPackageURI = Uri.parse("file://" + mTmpFile.getPath());
String installerPackageName = mContext.getIntent().getStringExtra(
Intent.EXTRA_INSTALLER_PACKAGE_NAME);
PackageInstallObserver observer = new PackageInstallObserver();
pm.installPackage(mPackageURI, observer, installFlags,
installerPackageName);
private File createTempPackageFile(String filePath) {
File tmpPackageFile = mContext.getFileStreamPath(TMP_FILE_NAME);
if (tmpPackageFile == null) {
Log.w(TAG, "Failed to create temp file");
return null;
if (tmpPackageFile.exists()) {
tmpPackageFile.delete();
// Open file to make it world readable
FileOutputS
fos = openFileOutput(TMP_FILE_NAME, MODE_WORLD_READABLE);
} catch (FileNotFoundException e1) {
Log.e(TAG, "Error opening file " + TMP_FILE_NAME);
return null;
fos.close();
} catch (IOException e) {
Log.e(TAG, "Error opening file " + TMP_FILE_NAME);
return null;
File srcPackageFile = new File(filePath);
if (!FileUtils.copyFile(srcPackageFile, tmpPackageFile)) {
Log.w(TAG, "Failed to make copy of file: " + srcPackageFile);
return null;
return tmpPackageF
private class PackageInstallObserver extends IPackageInstallObserver.Stub {
public void packageInstalled(String packageName, int returnCode) {
// Message msg = mHandler.obtainMessage(INSTALL_COMPLETE);
// msg.arg1 = returnC
// mHandler.sendMessage(msg);
Log.i(TAG, "====INSTALL_COMPLETE");
private class PackageDeleteObserver extends IPackageDeleteObserver.Stub {
public void packageDeleted(boolean succeeded) {
Message msg = mHandler.obtainMessage(UNINSTALL_COMPLETE);
msg.arg1 = succeeded?SUCCEEDED:FAILED;
mHandler.sendMessage(msg);
Log.i(TAG, "====UNINSTALL_COMPLETE");
public void uninstall(String packageName){
Uri packageURI = Uri.parse("package:" + packageName);
Intent uninstallIntent = new Intent(Intent.ACTION_DELETE,
packageURI);
mContext.startActivity(uninstallIntent);
public void uninstallBatch(String packageName) {
PackageDeleteObserver observer = new PackageDeleteObserver();
mContext.getPackageManager().deletePackage(packageName, observer, 0);
& &3、别忘记添加权限
&uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/&
&uses-permission android:name="android.permission.INSTALL_PACKAGES" /&
&uses-permission android:name="android.permission.DELETE_PACKAGES" /&
&uses-permission android:name="android.permission.CLEAR_APP_CACHE" /&
&uses-permission android:name="android.permission.READ_PHONE_STATE" /&
&uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" /&
以上代码在Android2.1的SDK中编译通过,并正确批量安装卸载应用程序
另外关键的是:你要有linux环境或其他可以mmm交叉编译的环境,因为这个用到的是隐藏api,SDK中没有的,ecilipse里面会提示包不存在,但交叉编译可以,如果你不知道mmm编译,请return。
调用uinstall会弹出卸载界面,而调用uninstallBatch不会弹出卸载界面。
在Windows下可下载模拟的unix环境cygwin
另外还可参考:
&android静默安装步骤:
android静默安装探讨&
1)在网上搜寻该问题的解决方法,且查阅android开发文档,没有发现可以实现该功能的显示API调用,网络上很多人请教同样的问题,但都没有能够实现解答;说是android为了用户的安全,已屏蔽该实现该方法的功能,第三方法应用是无法实现静默安装的。
(2)然后自己试图去看看android实现普通安装程序的源码文件,能否找到解决的办法,打算绕过普通安装时的提示框,直接调用通过确认后调用的函数进行安装;在查看android应用程序的普通安装过程后,发现应用程序安装过程的方法调用过程为:首先进入到com/android/packageinstaller/PackageInstallerActivity.java这个Activity中,在这个Activity中首先检查所欲安装的程序是否是正确的安装文件,以及当前系统中是否已安装了此应用程序,提示用户是否重复安装,另外还获取所欲安装的程序所讲用到的权限,然后将这些信息通过一个对话框提示给用户,当用户确定安装时,启动com.android.packageinstaller.InstallAppProgress.java这个Activity,在这个Activity中,调用
android.content.pm.PackageManager.installPackage(Uri packageURI, IPackageInstallObserver observer, int flags, String installerPackageName)进行安装应用程序,在InstallAppProgress中得到的PackageManager是通过PackageManager pm = getPackageManager()得到的,得到的对象是一个android.app.ContextImpl.ApplicationPackageManager对象,而
ApplicationPackageManager对象经过封装,
ApplicationPackageManager(ContextImpl context,& && && && && & IPackageManager pm) {& && && && &mContext =& && && && &mPM =& && &&&}其installPackage方法为&&@Override& && &&&public void installPackage(Uri packageURI, IPackageInstallObserver observer, int flags,& && && && && & String installerPackageName) {& && && && &try {& && && && && & mPM.installPackage(packageURI, observer, flags, installerPackageName);& && && && &} catch (RemoteException e) {& && && && && & // Should never happen!& && && && &}& && &&&}
可见调用的installPackage方法为 IPackageManager.installPackage(packageURI, observer, flags, installerPackageName);在ContextImpl中,由IPackageManager pm = ActivityThread.getPackageManager()获得IPackageManager实例对象;在ActivityThread.getPackageManager()方法中,static IPackageManager sPackageMpublic static IPackageManager getPackageManager() {& && &&&if (sPackageManager != null) {& && && && &return sPackageM& && &&&}& && &&&IBinder b = ServiceManager.getService("package");& && &&&sPackageManager = IPackageManager.Stub.asInterface(b);& && &&&return sPackageM& & }
最终得到的installPackage确实是IPackageManager.installPackage方法;
因为class PackageManagerService extends IPackageManager.Stub所以IPackageManager.installPackage调用的是:PackageManagerService.java (frameworks\base\services\java\com\android\server)文件中的/* Called when a downloaded package installation has been confirmed by the user */& & public void installPackage(& && && && &final Uri packageURI, final IPackageInstallObserver observer, final int flags) {& && &&&installPackage(packageURI, observer, flags, null);& & }(这里不明白为何IPackageManager.installPackage方法调用的是PackageManagerService.java,只是在网上的一篇文章中它给出了上面的原因,因为class PackageManagerService extends IPackageManager.Stub,我不明白,但也找不到其他的函数,通过PackageManagerService.java的源码,可以看出它确实是进行应用程序安装的,所以应该可以确定最终调用的方法就是
PackageManagerService.installPackage(final Uri packageURI, final IPackageInstallObserver observer, final int flags))
于是考虑如何得到PackageManagerService.installPackage(),考虑通过反射的方法得到installPackage(),但其中难以得到的是其参数中的IPackageInstallObserver类型,IPackageInstallObserver是由aidl文件定义的,通过aidl文件的特性,将IPackageInstallObserver.aidl文件拷到本地程序中,可以得到类IPackageInstallObserver.calss,通过它反射出installPackage()方法,但在invoke该方法时,却无法得到IPackageInstallObserver的实例对象,IPackageInstallObserver的实例对象必须通过
IPackageInstallObserver.Stub.asInterface(IBinder binder)方式得到,无法得到与其绑定的IBinder对象,因而无法执行反射出来的方法;另外PackageManagerService.installPackage()似乎是不能被第三方应用程序执行的,有权限的限制,这从下面的实例中似乎可以得到证实。
(3)在程序中执行Runtime.getRuntime().exec("pm install -r " + new File(Environment.getExternalStorageDirectory(),"download/Shuffle-1.6.3.apk")); 进行安装,这个命令的执行在 mands.pm.Pm中,直接调用IPackageManager.installPackage(Uri.fromFile(new File(apkFilePath)), obs, installFlags,installerPackageName)方法,在此方法中,IPackageManager mPm;mPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));且class PackageManagerService extends IPackageManager.Stub所以IPackageManager.installPackage调用的是:PackageManagerService.java (frameworks\base\services\java\com\android\server)文件中的/* Called when a downloaded package installation has been confirmed by the user */& & public void installPackage(& && && && &final Uri packageURI, final IPackageInstallObserver observer, final int flags) {& && &&&installPackage(packageURI, observer, flags, null);& & }
在此方法执行中会出现 Not granting permission android.permission.DELETE_PACKAGES错误,这应该是该权限不能授给第三方应用,因而在程序中不能执行,与android中普通安装应用程序最终调用的方法是相同的,但是却对第三方应用是没有权限执行的。。
(4) 另外解决思路:
1& 使用android:sharedUserId="android.uid.system"属性来使应用程序获得系统权限,看看是否能够执行行Runtime.getRuntime().exec("pm install -r ... ")方法。2& 阅读android实现应用程序安装更底层的代码,看看能否可以调用的底层方法进行安装或者自己实现一个安装程序的代码,但这可能性不大,因为这涉及到android更底层的调用,
肯定会有一定的权限限制。3& 在网上看到一个文件管理程序,据说是可以实现批量寂寞安装应用程序,但说明运行时需要用户确定得到手机的root权限,所以没有太大意义。4& 定制自己的android系统,可以解决。
说了这么多,最后总结的是:修改android。mk文件并在linux下和系统源代码一起编译及签名为目标系统签名来生成apk,然后参照packegeinstaller源代码调用方法即可
确保或者获取手机root权限,然后执行
Runtime.getRuntime().exec("pm install -r " + filePath);
欢迎各位同学加入 android 技术群&
个人微博:&
Intent it = new Intent(Intent.ACTION_VIEW);
it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
it.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
context.startActivity(it);
&相关链接:
& & & & & & &&
& & & & & & & &90066人阅读
&&&&&& Android上的静默安装似乎是个很诱人的功能,好多人都问这个问题。今天分享下实现静默安装的两种方法,但当看完这篇文章后,仍会让一些人失望滴。
&&&&& Android把所有的Permission依据其潜在风险(属性名为
)划分为四个等级,即
INSTALL_PACKAGES属于后两者。让我们看一下官方文档对后两类的描述吧。
that are signed with the same certificates as those in the system image.
Please avoid using this option, as thesignature
protection level should be sufficient for most needs and works regardless of exactly where applications are installed. The &signatureOrSystem
& permission is used for certain special situations where multiple vendors have applications built into a system image and need to share specific features explicitly because they are being built together.
&&&&& 所以,这儿介绍的两种方法各自需要的苛刻条件如下:
&&&&& 1.内置到ROM。即APK包的安装位置是/system/app下。
&&&&& 2.使用APK的目标安装系统同样的签名。
&&&&& 好了,先不管这些苛刻的条件,下面讲下如何编写直接安装APK的代码,这儿使用pm install &apk_path&命令,而不是繁杂的未公开的PackageManager.install()方法。
String[] args = { &pm&, &install&, &-r&, apkAbsolutePath };
String result = &&;
ProcessBuilder processBuilder = new ProcessBuilder(args);
Process process =
InputStream errIs =
InputStream inIs =
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int read = -1;
process = processBuilder.start();
errIs = process.getErrorStream();
while ((read = errIs.read()) != -1) {
baos.write(read);
baos.write('/n');
inIs = process.getInputStream();
while ((read = inIs.read()) != -1) {
baos.write(read);
byte[] data = baos.toByteArray();
result = new String(data);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (errIs != null) {
errIs.close();
if (inIs != null) {
inIs.close();
} catch (IOException e) {
e.printStackTrace();
if (process != null) {
process.destroy();
&&&&& 代码执行后,如果安装成功的话获取到的result值是&&&&&&&& pkg: /data/local/tmp/Calculator.apk& /nSuccess&,如果是失败的话,则没有结尾的&Success&。
&&&&& 安装代码有了,现在开始介绍第一种方法,将你自己的APK内置到ROM中。前提是,你这手机已经刷机过并且保留了recovery-windows.bat/recover-linux.sh
&&&&& 针对HTC-Legend的具体操作步骤为:
&&&&& 1.USB连接你的设备然后在命令行输入
&adb&reboot&recovery&
,机子重启,启动后将显示一个红色的三角形和箭头图标&
.(在PC下)进入到你的刷机文件夹然后运行
'./recover-linux.sh'
,屏幕将显示绿色的菜单
.如果得到的结果是
&error:device&not&found&
&./adb-linux&kill-server&
后再一次运行
'./recovery-linux.sh'
直到显示绿色菜单.
&adb&shell&mount&/dev/block/mtdblock3&/system&
,至此,可对/system进行写操作。
&&&&& 5.在PC上运行命令:adb push &your_apk_path& /system/&your_apk_name&。至此,内置成功。
&&&&& 第二种方法,需要先打一个未签名的APK包,然后用系统签名对其进行签名。这个方面的东西在我之前的一篇博文已说明,这儿就不重复了。
& &&& 由于HTC-Legend是&原装&的,所以静默安装倒是顺利。但对于一些MOTO或乐Phone的手机,一般上是不支持的。
& &&& 以上这两种方法都在AndroidManifest中声明android.permission.INSTALL_PACKAGES,有一点比较奇怪的是执行&
int result = checkCallingOrSelfPermission(Intent.ACTION_PACKAGE_INSTALL)
&,result的值为android.content.pm.PackageManager.PERMISSION_DENIED而不是PERMISSION_GRANTED。
& && OK,讲完了,睡觉。
本文内容归CSDN博客博主Sodino
转载请注明出处:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1567407次
积分:14669
积分:14669
排名:第834名
原创:233篇
评论:547条
(1)(2)(1)(2)(3)(6)(13)(8)(1)(1)(3)(2)(4)(2)(2)(3)(3)(5)(2)(4)(1)(1)(5)(11)(2)(5)(1)(2)(2)(2)(4)(4)(5)(2)(2)(4)(1)(1)(4)(2)(3)(3)(3)(5)(2)(8)(7)(3)(6)(3)(2)(3)(1)(5)(12)(2)(2)(7)(4)(2)(13)(4)(4)(2)(1)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'查看:14516|回复:20
助理工程师
首先先给大家一个已经实现的apk例子,大家先看看效果
做法:1,将我传上的文件下载解压出来的apk安装到自己的手机上
& && && &&&2,自己随意弄一份apk,取名为a.apk,放在自己手机的SD卡根目录下
& && && &&&3,运行install.apk---即刚才让大家安装的那份,点击按钮,然后你就会发现那份a.apk已经被静默安装了
有点前提条件:1,版本4.0以上& && &&&2,手机系统没有被深度定制过-----android系统源码改变过多。。。
(10.29 KB)
10:41, 下载次数: 1772
助理工程师
复制内容到剪贴板代码:MK文件写法如下:InstallActivity这个是mm出来的名字,可以随意的改
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := user
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := InstallActivity
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)
4.0以上和4.0以下静默安装的方式不一样:
首先说4.0以下的静默安装:
静默安装无非也是安装,首先得看安装的源码,安装的源码在app层PackageInstaller,
这个项目就是安装的源码,你首先可以看安装的源码.我先说静默安装的步骤;
1:静默安装apk,你得先随便放一个apk到SD卡当中。我以UC浏览器apk举例子。
2:首先获得apk在SD卡中的路径String fileName = Environment.getExternalStorageDirectory() +&&&/UC.apk&;
3:获取包的管理者,代码如下:
PackageManager pm = getPackageManager();
& && && && &try {
& && && && && & PackageInfo pi = pm.getPackageInfo(&com.uc.browser&,
& && && && && && && && &PackageManager.GET_UNINSTALLED_PACKAGES);
& && && && && & if(pi != null) {
& && && && && && &&&installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;
& && && && && & }
& && && && &} catch (NameNotFoundException e) {
& && && && &}
&&installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;这句的意思是强制安装,不管你的设备上面是否有曾经安装过apk,都强制在安装一次。
4:通过安装包的观察者PackageInstallObserver,具体代码如下
& & PackageInstallObserver observer = new PackageInstallObserver();
class PackageInstallObserver extends IPackageInstallObserver.Stub {
& && &&&public void packageInstalled(String packageName, int returnCode) {
& && && && &Message msg = mHandler.obtainMessage(INSTALL_COMPLETE);
& && && && &msg.arg1 = returnC
& && && && &mHandler.sendMessage(msg);
& & private Handler mHandler = new Handler() {
& && &&&public void handleMessage(Message msg) {
& && && && &switch (msg.what) {
& && && && && & case INSTALL_COMPLETE:
& && && && && && &
& && && && && && &&&int centerTextL
& && && && && && &&&Drawable centerTextDrawable =
& && && && && && &&&if(msg.arg1 == SUCCEEDED) {
& && && && && && && && && &
& && && && && && &&&} else {}
& && && && && && &&&if (centerTextDrawable != null) {}
& && && && && && &&&
& && && && && & default:
& && && && && && &&&
& && && && &}
5:通过pm.installPackage(uri, observer, installFlags, &com.uc.browser&);
6:去掉gen下面的r
7:编写MK文件:mkd 的具体写法如下
& & LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := user
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := InstallActivity
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)
8:然后丢到linux下面mm一下就行。
接下来4.0以上的静默安装,一般我们在adb install xxx.apk的时候,最终调用的还是pm install xxx.apk。
所以我们可以用pm install -r 进行安装apk。代码如下
//方法体可以在任何地方可套用,不用修改任何东东哦!
& &&&public String install(String apkAbsolutePath ){
& && && &String[] args = { &pm&, &install&, &-r&, apkAbsolutePath };
& && && & String result = &&;
& && && &ProcessBuilder processBuilder = new ProcessBuilder(args);
& && && & Process process =
& && && & InputStream errIs =
& && && & InputStream inIs =
& && && &try {
& && && && & ByteArrayOutputStream baos = new ByteArrayOutputStream();
& && && && &&&int read = -1;
& && && && &&&process = processBuilder.start();
& && && && &&&errIs = process.getErrorStream();
& && && && &&&while ((read = errIs.read()) != -1) {
& && && && && &&&baos.write(read);
& && && && &&&}
& && && && &&&baos.write(&/n&.getBytes());
& && && &&&inIs = process.getInputStream();
& && && && &&&while ((read = inIs.read()) != -1) {
& && && && && && &baos.write(read);
& && && && & }
& && && && &&&byte[] data = baos.toByteArray();
& && && && &&&result = new String(data);
& && && & } catch (IOException e) {
& && && && &&&e.printStackTrace();
& && && &} catch (Exception e) {
& && && && &&&e.printStackTrace();
& && && & } finally {
& && && && &&&try {
& && && && && && &if (errIs != null) {
& && && && && && &&&errIs.close();
& && && && && &&&}
& && && && && &&&if (inIs != null) {
& && && && && && && & inIs.close();
& && && && && && &}
& && && && & } catch (IOException e) {
& && && && && &&&e.printStackTrace();
& && && && &&&}
& && && && &&&if (process != null) {
& && && && && &&&process.destroy();
& && && && & }
& && && & }
添加系统权限:
&uses-permission android:name=&android.permission.WRITE_EXTERNAL_STORAGE& /&
& && &&uses-permission android:name=&android.permission.INSTALL_PACKAGES& /&
& && &&uses-permission android:name=&android.permission.DELETE_PACKAGES& /&
& && &&uses-permission android:name=&android.permission.CLEAR_APP_CACHE& /&
& && &&uses-permission android:name=&android.permission.CLEAR_APP_USER_DATA& /&
& && &&uses-permission android:name=&android.permission.READ_PHONE_STATE& /&
同样编写MK文件,然后在linux底下编译
在eclipse里面写好了,不需要右键运行,把R文件删掉,然后把代码拷贝到linux底下mm一下
当我们的项目中有加入三方的jar,mk是另外一种写法,如下
# Copyright
The Android Open Source Project
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_STATIC_JAVA_LIBRARIES := android_api //还有这里
LOCAL_SRC_FILES := $(call all-java-files-under)
LOCAL_PACKAGE_NAME := sxs //这个是编译出来的名字,随便取一个
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := android_api:libs/android_api.jar //修改这里
include $(BUILD_MULTI_PREBUILT)
# Use the following include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))
以下是4.2上面编译的静默安装MK文件
# Copyright
The Android Open Source Project
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under)
LOCAL_PACKAGE_NAME := install
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)
# Use the following include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))
这个是清单文件配置的权限,不需要分享系统UID
&uses-permission android:name=&android.permission.WRITE_EXTERNAL_STORAGE& /&
& & &uses-permission android:name=&android.permission.INSTALL_PACKAGES& /&
& & &uses-permission android:name=&android.permission.DELETE_PACKAGES& /&
& & &uses-permission android:name=&android.permission.CLEAR_APP_CACHE& /&
& & &uses-permission android:name=&android.permission.CLEAR_APP_USER_DATA& /&
& & &uses-permission android:name=&android.permission.READ_PHONE_STATE& /&
静默安装代码代码如下:
String fileName = Environment.getExternalStorageDirectory()+ &/a.apk&;
install(fileName);
public String install(String apkAbsolutePath ){&&
& && && & String[] args = { &pm&, &install&, &-r&, apkAbsolutePath };
& && && &String result = &&;
& && && & ProcessBuilder processBuilder = new ProcessBuilder(args);
& && && &Process process =
& && && &InputStream errIs =
& && && & InputStream inIs =
& && && & try {
& && && && &&&ByteArrayOutputStream baos = new ByteArrayOutputStream();
& && && && &&&int read = -1;
& && && && &&&process = processBuilder.start();
& && && && &&&errIs = process.getErrorStream();
& && && && & while ((read = errIs.read()) != -1) {
& && && && && &&&baos.write(read);
& && && && &&&}
& && && && &&&baos.write(&/n&.getBytes());
& && && && &&&inIs = process.getInputStream();
& && && && &&&while ((read = inIs.read()) != -1) {
& && && && && && &baos.write(read);
& && && && & }
& && && && &&&byte[] data = baos.toByteArray();
& && && && &&&result = new String(data);
& && && & } catch (IOException e) {
& && && && &&&e.printStackTrace();
& && && & } catch (Exception e) {
& && && && &&&e.printStackTrace();
& && && &} finally {
& && && && & try {
& && && && && &&&if (errIs != null) {
& && && && && && && &errIs.close();
& && && && && &&&}
& && && && && &&&if (inIs != null) {
& && && && && && && &inIs.close();
& && && && && &&&}
& && && && &&&} catch (IOException e) {
& && && && && && &e.printStackTrace();
& && && && &&&}
& && && && &&&if (process != null) {
& && && && && && &process.destroy();
& && && && &&&}
& && && & }
& &&&在linux下编译后,system/app下面的apk就是我们想要的apk了
助理工程师
小米表示不行,系统源码被改变比较多了,其他有些手机也是。
另外,这种方法和root权限无关,手机被root后也能实现。
助理工程师
我对linux的开发环境不懂。。。所以,想求教下,在linux下如何进行编译我的android项目。
现在就知道猫大神开发是在linux的,所以……你懂的,猫大神啊
助理工程师
各位大神也帮忙看看,看有谁对linux有了解的 ,非常感谢!
, , , ,&&
助理工程师
引用:原帖由 九界冰荒 于
10:53 发表
小米表示不行,系统源码被改变比较多了,其他有些手机也是。
另外,这种方法和root权限无关,手机被root后也能实现。 玩安卓买谷歌的亲儿子吧..淘宝有 不贵 800左右吧..
助理工程师
感谢分享...你的求教...LINUX是常玩 但都是在搭建服务器倒腾的& &还没试过在LINUX开发安卓.. 不好意思 帮不上...-_,- 等待大神解答引用:原帖由 九界冰荒 于
10:55 发表
我对linux的开发环境不懂。。。所以,想求教下,在linux下如何进行编译我的android项目。
现在就知道猫大神开发是在linux的,所以……你懂的,猫大神啊
本帖最后由 林的理想 于
11:23 编辑
中级工程师
猫,不是说在linux下载一个linux版的eclipse的不就行了吗?
应该不难吧?基本的linux命令会。。。
不过没折腾过。。
没试过。。。
助理工程师
引用:原帖由 kaluosi0 于
12:06 发表
猫,不是说在linux下载一个linux版的eclipse的不就行了吗?
应该不难吧?基本的linux命令会。。。
不过没折腾过。。
没试过。。。 不仅要有开发工具等开发环境,还得下android系统源码,听说8个G,我同学下几天没下下来,经常卡死,所以后面的搞不下去
中级工程师
引用:原帖由 九界冰荒 于
12:14 发表
不仅要有开发工具等开发环境,还得下android系统源码,听说8个G,我同学下几天没下下来,经常卡死,所以后面的搞不下去 貌似,猫,之前有发过一次怎么在linux下编译的,你去他那里,找找他发的帖子看看。。。
资深技术经理
引用:原帖由 九界冰荒 于
12:14 发表
不仅要有开发工具等开发环境,还得下android系统源码,听说8个G,我同学下几天没下下来,经常卡死,所以后面的搞不下去 下载android 源代码,可以参考下我以前写的一篇帖子:
也做了改进,我记得的...
资深技术经理
引用:原帖由 九界冰荒 于
10:55 发表
我对linux的开发环境不懂。。。所以,想求教下,在linux下如何进行编译我的android项目。
现在就知道猫大神开发是在linux的,所以……你懂的,猫大神啊
... 正如你所说,等你把源代码下载下来,你可以把你的程序丢到package/app/目录下,然后执行编译命令就可以了。
刚看你的程序mk文件,写的是platform,这样编译出来的程序是不能安装到其他手机上的。因为签名不对。。
助理工程师
引用:原帖由 rongwei84n 于
14:03 发表
正如你所说,等你把源代码下载下来,你可以把你的程序丢到package/app/目录下,然后执行编译命令就可以了。
刚看你的程序mk文件,写的是platform,这样编译出来的程序是不能安装到其他手机上的。因为签名不对。。 ... 正在搞源码。。。还是谢谢猫大神!
另外,【转】apk反编译生成程序的源代码和图片、XML配置、语言资源等文件
这个帖子。。。被删了?收藏夹进去点它都无效了。。
资深技术经理
引用:原帖由 九界冰荒 于
15:54 发表
正在搞源码。。。还是谢谢猫大神!
另外,【转】apk反编译生成程序的源代码和图片、XML配置、语言资源等文件
这个帖子。。。被删了?收藏夹进去点它都无效了。。 ... 可能被管理员删除了吧,不是很清楚。你把那个帖子给个链接过来看看。
助理工程师
引用:原帖由 rongwei84n 于
17:48 发表
可能被管理员删除了吧,不是很清楚。你把那个帖子给个链接过来看看。
提示: 作者被禁止或删除 内容自动屏蔽
提示: 作者被禁止或删除 内容自动屏蔽
求Android-Apk实现静默安装的源码学习研究下,试了多种方式一直没成功,看到你的apk试了下,成功实现,但是不知道实现过程,求源码学习下
本帖最后由 hades 于
16:40 编辑
可以成功安装,求源码学习下
求源码学习一下&&,

我要回帖

更多关于 adb install 静默安装 的文章

 

随机推荐