1.使一个程序成为系统程序
我们必须在manifest 中配置android:sharedUserId="android.uid.system"
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.flyaudio.floatwindows"
android:versionCode="1"
android:sharedUserId="android.uid.system"
android:versionName="1.0" >加上权限:<uses-permission android:name="android.permission.INJECT_EVENTS" />
这个权限就是为了允许一个程序截获用户事件如按键、触摸、轨迹球等等到一个时间流。
2.模拟home、back、menu
private void homePress()
{
Intent mHomeIntent = new Intent(Intent.ACTION_MAIN);
mHomeIntent.addCategory(Intent.CATEGORY_HOME);
mHomeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
getContext().startActivity(mHomeIntent);
}
private void backPress()
{
Runtime runtime = Runtime.getRuntime();
try {
runtime.exec("input keyevent " + KeyEvent.KEYCODE_BACK);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void menuPress()
{
Runtime runtime = Runtime.getRuntime();
try {
runtime.exec("input keyevent " + KeyEvent.KEYCODE_MENU);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}其实还有一种方法就是:
new Thread(){
public void run() {
try{
Instrumentation inst = new Instrumentation();
inst.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
}
catch (Exception e) {
Log.e("Exception when onBack", e.toString());
}
}
}.start();inst.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);这里可以传入任何键值。
3.添加系统签名
完成上面2个步骤之后,安装程序发现会出现Failure [INSTALL_FAILED_SHARED_USER_INCOMPATIBLE]错误。因为使用eclipse编译后的程序不带有platform签名,所以作为系统程序安装不了。
所以需要对apk进行签名
将签名工具(signapk.jar)、签名证书(platform.pk8和platform.x509.pem)及编译出来的apk文件都放到同一目录
终端进入该目录执行java -jar signapk.jar -w platform.x509.pem platform.pk8 XXX.apk out/XXX.apk
拿出out目录下被签名后的apk进行安装
4.附上签名工具
里面有2种签名shared和platform
将程序变成system app 实现home、back、menu等按键模拟
原文:http://blog.csdn.net/tangnengwu/article/details/40110903