android 如何启动apk,Android 命令:实现启动一个apk

1、产生背景:

为了调试方便,常常希望通过知道apk的路径,直接去启动它,所以就写了这个命令

2、使用方法:

adb push launch /data/

adb push launch.jar /data/

adb shell

launch

其实放到/system/下面也可以,把jar包放到/system/framework/下面,把launch命令放到/system/bin/下面,

然后adb shell 进去,直接执行launch就可以了,传入apk的路径参数。

3、eg:

launch /data/app/abc.apk

4、代码:

Android.mk:

# Copyright 2008 The Android Open Source Project

#

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := $(call all-subdir-java-files)

LOCAL_MODULE := launch

include $(BUILD_JAVA_LIBRARY)

launch:

# Script to start "launch" on the device, which has a very rudimentary

# shell.

#

export CLASSPATH=/system/framework/launch.jar

exec app_process /system/bin com.android.commands.launch.Launch $*

#export CLASSPATH=/data/launch.jar

#exec app_process /data/ com.android.commands.launch.Launch $*

Launch.java:

/*

* Copyright (C) 2007 The Android Open Source Project

*

* Licensed under the Apache License, Version 2.0 (the "License");

* you may not use this file except in compliance with the License.

* You may obtain a copy of the License at

*

* http://www.apache.org/licenses/LICENSE-2.0

*

* Unless required by applicable law or agreed to in writing, software

* distributed under the License is distributed on an "AS IS" BASIS,

* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

* See the License for the specific language governing permissions and

* limitations under the License.

*/

package com.android.commands.launch;

import android.app.ActivityManager;

import android.app.ActivityManagerNative;

import android.app.IActivityController;

import android.app.IActivityManager;

import android.app.IInstrumentationWatcher;

import android.app.Instrumentation;

import android.content.ComponentName;

import android.content.Context;

import android.content.IIntentReceiver;

import android.content.Intent;

import android.content.pm.IPackageManager;

import android.content.pm.ResolveInfo;

import android.net.Uri;

import android.os.Bundle;

import android.os.ParcelFileDescriptor;

import android.os.RemoteException;

import android.os.ServiceManager;

import android.os.SystemProperties;

import android.os.UserHandle;

import android.util.AndroidException;

import android.view.Display;

import android.view.IWindowManager;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintStream;

import java.net.URISyntaxException;

import java.util.HashSet;

import java.util.List;

import android.util.Log;

import android.content.pm.ApplicationInfo;

import android.content.pm.PackageInfo;

import android.content.pm.PackageManager;

import android.content.pm.PackageUserState;

import android.content.pm.PackageParser;

import android.util.DisplayMetrics;

/**

* Launch

*/

public class Launch {

private static final String TAG = "Launch";

private IPackageManager mPM;

private IActivityManager mAm;

/**

* Command-line entry point.

*

* @param args The command-line arguments

*/

public static void main(String[] args) {

(new Launch()).run(args);

}

private void init(){

IPackageManager mPM = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));

mAm = ActivityManagerNative.getDefault();

}

private void run(String[] args) {

init();

if (args.length < 1) {

showUsage();

return;

}

String command = args[0];

if(args.length == 1){

PackageInfo info = getPackageArchiveInfo(command, PackageManager.GET_ACTIVITIES);

if(info != null){

ApplicationInfo appInfo = info.applicationInfo;

String packageName = appInfo.packageName;

String className = info.activities[0].name;

log("-->packageName=" + packageName);

log("-->className=" + className);

log("-->all activities:");

for(int i = 0; i < info.activities.length; i++){

log(info.activities[i]);

}

startApp(packageName, className);

//String execCmd= "am start -n " + packageName + "/" + className;

//log(execCmd);

//runLinuxCmd(execCmd);

}

return ;

}

System.err.println("Error: Invalid arguments for command: " + command);

showUsage();

}

private PackageInfo getPackageArchiveInfo(String archiveFilePath, int flags) {

PackageParser packageParser = new PackageParser(archiveFilePath);

DisplayMetrics metrics = new DisplayMetrics();

metrics.setToDefaults();

final File sourceFile = new File(archiveFilePath);

PackageParser.Package pkg = packageParser.parsePackage(

sourceFile, archiveFilePath, metrics, 0);

if (pkg == null) {

return null;

}

if ((flags & PackageManager.GET_SIGNATURES) != 0) {

packageParser.collectCertificates(pkg, 0);

}

PackageUserState state = new PackageUserState();

return PackageParser.generatePackageInfo(pkg, null, flags, 0, 0, null, state);

}

private Process runLinuxCmd(String cmd){

Process process = null;

try{

process = Runtime.getRuntime().exec(cmd);

return process;

} catch(IOException e){

Log.d(TAG, "runLinuxCmd error:" +e);

}

return process;

}

private void startApp(String packageName, String className){

Intent intent = new Intent();

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

ComponentName comp = new ComponentName(packageName, className);

intent.setComponent(comp);

try{

mAm.startActivityAndWait(null, intent, "",

null, null, 0, 0, "", null, null, 0);

}catch(RemoteException e){

log("startApp error:" + e);

}

}

private void showUsage() {

System.err.println("usage: input ...");

System.err.println(" launch ");

}

private void log(Object o){

System.err.println("" + o);

}

}

放到源码/framework/base/cmds/launch/目录下面编译就可以了!

亲测,可以的,祝你好运!

proud.gif

原文:http://blog.youkuaiyun.com/cyq1028/article/details/18559967

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值