接上一篇:创作中心-CSDN
直接上代码【
cpp
/*
* Main entry of app process.
* Starts the interpreted runtime, then starts up the application.
*
*/
#define LOG_TAG "app2"
#include <stdio.h>
#include <stdlib.h>
#include <sys/prctl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <binder/IPCThreadState.h>
#include <hwbinder/IPCThreadState.h>
#include <utils/Log.h>
#include <cutils/memory.h>
#include <cutils/properties.h>
#include <cutils/trace.h>
#include <android-base/macros.h>
#include <android_runtime/AndroidRuntime.h>
#include <private/android_filesystem_config.h> // for AID_SYSTEM
#include <utils/CallStack.h>
#include <jni.h>
#include <nativehelper/JniInvocation.h>
using namespace android;
namespace android {
class PppRuntime : public AndroidRuntime
{
public:
PppRuntime(char* argBlockStart, const size_t argBlockLength)
: AndroidRuntime(argBlockStart, argBlockLength)
, mClass(NULL)
{
}
void setClassNameAndArgs(const String8& className, int argc, char * const *argv) {
ALOGE("app_main.cpp +42 setClassNameAndArgs ------- start className=%s argc=%d ", className.c_str(), argc); // 42
mClassName = className;
for (int i = 0; i < argc; ++i) {
mArgs.add(String8(argv[i]));
}
ALOGE("app_main.cpp +47 setClassNameAndArgs ------- end"); // 46
}
virtual void onVmCreated(JNIEnv* env)
{
ALOGE("app_main.cpp +52 onVmCreated ------- start env=%p ", env); // 50
if (mClassName.empty()) {
ALOGE("app_main.cpp +54 onVmCreated ------- ifelse return;"); // 51
return;
}
char* slashClassName = toSlashClassName(mClassName.c_str());
mClass = env->FindClass(slashClassName);
if (mClass == NULL) {
ALOGE("app_main.cpp +61 onVmCreated ------- ifelse ALOGE(ERROR: c ___ sName.c_str());"); // 57
ALOGE("ERROR: could not find class '%s'\n", mClassName.c_str());
}
free(slashClassName);
mClass = reinterpret_cast<jclass>(env->NewGlobalRef(mClass));
ALOGE("app_main.cpp +67 onVmCreated ------- end"); // 62
}
virtual void onStarted()
{
ALOGE("app_main.cpp +72 onStarted ------- start "); // 66
sp<ProcessState> proc = ProcessState::self();
ALOGD("ppp: starting thread pool.\n");
proc->startThreadPool();
AndroidRuntime* ar = AndroidRuntime::getRuntime();
ar->callMain(mClassName, mClass, mArgs);
IPCThreadState::self()->stopProcess();
hardware::IPCThreadState::self()->stopProcess();
ALOGE("app_main.cpp +82 onStarted ------- end"); // 75
}
virtual void onExit(int code)
{
ALOGE("app_main.cpp +87 onExit ------- start code=%d ", code); // 79
AndroidRuntime::onExit(code);
ALOGE("app_main.cpp +89 onExit ------- end"); // 80
}
String8 mClassName;
Vector<String8> mArgs;
jclass mClass;
};
}
using namespace android;
static size_t computeArgBlockSize(int argc, char* const argv[]) {
ALOGE("app_main.cpp +102 computeArgBlockSize ------- start argc=%d argv=%s ", argc, argv); // 92
uintptr_t start = reinterpret_cast<uintptr_t>(argv[0]);
uintptr_t end = reinterpret_cast<uintptr_t>(argv[argc - 1]);
end += strlen(argv[argc - 1]) + 1;
ALOGE("app_main.cpp +106 computeArgBlockSize ------- return (end - start);"); // 95
return (end - start);
}
static void maybeCreateDalvikCache() {
ALOGE("app_main.cpp +111 maybeCreateDalvikCache ------- start "); // 99
const char* androidRoot = getenv("ANDROID_DATA");
if (androidRoot == NULL) {
ALOGE("app_main.cpp +114 maybeCreateDalvikCache ------- ifelse return;"); // 101
return;
}
char dalvikCacheDir[PATH_MAX];
const int numChars = snprintf(dalvikCacheDir, PATH_MAX,
"%s/dalvik-cache/", ABI_STRING, androidRoot);
if (numChars >= PATH_MAX || numChars < 0) {
ALOGE("app_main.cpp +122 maybeCreateDalvikCache ------- ifelse return;"); // 108
return;
}
int result = mkdir(dalvikCacheDir, 0711);
if (result < 0 && errno != EEXIST) {
ALOGE("app_main.cpp +128 maybeCreateDalvikCache ------- ifelse return;"); // 113
return;
}
chown(dalvikCacheDir, AID_ROOT, AID_ROOT);
chmod(dalvikCacheDir, 0711);
ALOGE("app_main.cpp +134 maybeCreateDalvikCache ------- end"); // 118
}
int main(int argc, char* const argv[])
{
ALOGE("app_main.cpp +139 main ------- start argc=%d argv=%s ", argc, argv); // 122
if (!LOG_NDEBUG) {
ALOGE("app_main.cpp +141 main ------- ifelse String8 argv_String;"); // 123
String8 argv_String;
for (int i = 0; i < argc; ++i) {
argv_String.append("\"");
argv_String.append(argv[i]);
argv_String.append("\" ");
}
ALOGV("ppp main with argv: %s", argv_String.c_str());
}
maybeCreateDalvikCache();
// Hardcode the entry class and classpath, so the tool can be launched simply as "ppp [args]".
setenv("CLASSPATH", "/system/framework/bm.jar", 1);
PppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));
// ignore argv[0]
argc--;
argv++;
Vector<String8> options;
// Everything up to the first non '-' arg goes to the vm as options.
int i;
for (i = 0; i < argc; i++) {
if (argv[i][0] != '-') {
ALOGE("app_main.cpp +167 main ------- ifelse break;"); // 148
break;
}
if (argv[i][1] == '-' && argv[i][2] == 0) {
ALOGE("app_main.cpp +171 main ------- ifelse ++i; // Skip --."); // 151
++i; // Skip --.
ALOGE("app_main.cpp +173 main ------- break;"); // 152
break;
}
runtime.addOption(strdup(argv[i]));
}
String8 className("com.android.commands.bm.Bm");
Vector<String8> args;
args.add(String8("tool"));
runtime.setClassNameAndArgs(className, argc - i, argv + i);
runtime.start(className.c_str(), args, false /*zygote*/);
ALOGE("app_main.cpp +187 main ------- return 0;"); // 165
return 0;
}
】
直接实例化AndroidRuntime对象,
好处之一是其调用的java代码可以直接使用所有Android层面的java api。
题外话:里面 的日志是使用自动加日志的工具添加的。比较方便不用手动加,对加日志定位问题较友好。https://gitee.com/peiqingzhen/addlog