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 = returnCode;
mHandler.sendMessage(msg);
}
};
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case INSTALL_COMPLETE:
int centerTextLabel;
Drawable centerTextDrawable = null;
if(msg.arg1 == SUCCEEDED) {
} else {}
if (centerTextDrawable != null) {}
break;
default:
break;
}
}
};
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 = null;
InputStream errIs = null;
InputStream inIs = null;
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();
}
}
return result;
}
添加系统权限:
<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 2007-2008 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 2007-2008 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 = null;
InputStream errIs = null;
InputStream inIs = null;
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();
}
}
return result;
}
在linux下编译后,system/app下面的apk就是我们想要的apk了