当前位置:   article > 正文

[Android]dump调用_安卓 dump binder 链接

安卓 dump binder 链接

dumpsys采用了binder机制调用了服务里的dump方法,

Binder.java 里有dump方法,

这里我们来研究下dump的调用


dumpsys源码

使用binder进行通信

 

vi ./frameworks/native/cmds/dumpsys/dumpsys.cpp

#define LOG_TAG "dumpsys"

 

#include <utils/Log.h>

#include <binder/Parcel.h>

#include <binder/ProcessState.h>

#include <binder/IServiceManager.h>

#include <binder/TextOutput.h>

#include <utils/Vector.h>

 

#include <getopt.h>

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <unistd.h>

#include <sys/time.h>

 

using namespace android;

 

static int sort_func(const String16* lhs, const String16* rhs)

{

    return lhs->compare(*rhs);

}

 

int main(int argc, char* const argv[])

{

    signal(SIGPIPE, SIG_IGN);

    sp<IServiceManager> sm = defaultServiceManager();

    fflush(stdout);

    if (sm == NULL) {

                ALOGE("Unable to get default service manager!");

        aerr << "dumpsys: Unable to get default service manager!" << endl;

        return 20;

    }

 

    Vector<String16> services;

    Vector<String16> args;

    bool showListOnly = false;

    if ((argc == 2) && (strcmp(argv[1], "-l") == 0)) {

        showListOnly = true;

    }

    if ((argc == 1) || showListOnly) {

        services = sm->listServices();

        services.sort(sort_func);

        args.add(String16("-a"));

    } else {

        services.add(String16(argv[1]));

        for (int i=2; i<argc; i++) {

            args.add(String16(argv[i]));

        }

    }

 

    const size_t N = services.size();

 

    if (N > 1) {

        // first print a list of the current services

        aout << "Currently running services:" << endl;

 

        for (size_t i=0; i<N; i++) {

            sp<IBinder> service = sm->checkService(services[i]);

            if (service != NULL) {

                aout << "  " << services[i] << endl;

            }

        }

    }

 

    if (showListOnly) {

        return 0;

    }

 

    for (size_t i=0; i<N; i++) {

        sp<IBinder> service = sm->checkService(services[i]);

        if (service != NULL) {

            if (N > 1) {

                aout << "------------------------------------------------------------"

                        "-------------------" << endl;

                aout << "DUMP OF SERVICE " << services[i] << ":" << endl;

            }

//10-10, 这里能够这样写是因为class sp {里对->进行了重载

// inline  T*      operator-> () const { return m_ptr;  }

            int err = service->dump(STDOUT_FILENO, args);

            if (err != 0) {

                aerr << "Error dumping service info: (" << strerror(err)

                        << ") " << services[i] << endl;

            }

        } else {

            aerr << "Can't find service: " << services[i] << endl;

        }

    }

 

    return 0;

}


        int err = service->dump(STDOUT_FILENO, args);
这里进行了binder方法调用

 发起调用

android/frameworks/native/libs/binder

 

vi BpBinder.cpp

 

status_t BpBinder::dump(int fd, const Vector<String16>& args)

{

    Parcel send;

    Parcel reply;

    send.writeFileDescriptor(fd);

    const size_t numArgs = args.size();

    send.writeInt32(numArgs);

    for (size_t i = 0; i < numArgs; i++) {

        send.writeString16(args[i]);

    }

    status_t err = transact(DUMP_TRANSACTION, send, &reply);

    return err;

}

 


 

PMS里的dump的调用堆栈

10-08 10:42:19.099: D/PackageManagerService(1103): ===== begin =====

10-08 10:42:19.099: D/PackageManagerService(1103): com.android.server.pm.PackageManagerService.dump(PackageManagerService.java:16865)

10-08 10:42:19.099: D/PackageManagerService(1103): android.os.Binder.dump(Binder.java:331)

10-08 10:42:19.099: D/PackageManagerService(1103): android.os.Binder.onTransact(Binder.java:297)

10-08 10:42:19.099: D/PackageManagerService(1103): android.content.pm.IPackageManager$Stub.onTransact(IPackageManager.java:2161)

10-08 10:42:19.099: D/PackageManagerService(1103): com.android.server.pm.PackageManagerService.onTransact(PackageManagerService.java:3146)

10-08 10:42:19.099: D/PackageManagerService(1103): android.os.Binder.execTransact(Binder.java:458)

 

服务端执行调用


注意

public class PackageManagerService extends IPackageManager.Stub {

 

PackageManagerService里有

   @Override

    public boolean onTransact(int code, Parcel data, Parcel reply, int flags)

            throws RemoteException {

        try {

            return super.onTransact(code, data, reply, flags);

        } catch (RuntimeException e) {

            if (!(e instanceof SecurityException) && !(e instanceof IllegalArgumentException)) {

                Slog.wtf(TAG, "Package Manager Crash", e);

            }

            throw e;

        }

    }

 



IPackageManager.java


public interface IPackageManager extends android.os.IInterface
{
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements android.content.pm.IPackageManager
{
private static final java.lang.String DESCRIPTOR = "android.content.pm.IPackageManager";
/** Construct the stub at attach it to the interface. */
public Stub()
{
this.attachInterface(this, DESCRIPTOR);
}
/**
 * Cast an IBinder object into an android.content.pm.IPackageManager interface,
 * generating a proxy if needed.
 */
public static android.content.pm.IPackageManager asInterface(android.os.IBinder obj)
{
if ((obj==null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin!=null)&&(iin instanceof android.content.pm.IPackageManager))) {
return ((android.content.pm.IPackageManager)iin);
}
return new android.content.pm.IPackageManager.Stub.Proxy(obj);
}
@Override public android.os.IBinder asBinder()
{
return this;
}
@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
{
switch (code)
{
case INTERFACE_TRANSACTION:
{
reply.writeString(DESCRIPTOR);

... ...
return super.onTransact(code, data, reply, flags);
}

super.onTransact(code, data, reply, flags)

superbinder.java

    protected boolean onTransact(int code, Parcel data, Parcel reply,

            int flags) throws RemoteException {

        if (code == INTERFACE_TRANSACTION) {

            reply.writeString(getInterfaceDescriptor());

            return true;

        } else if (code == DUMP_TRANSACTION) {

            ParcelFileDescriptor fd = data.readFileDescriptor();

            String[] args = data.readStringArray();

            if (fd != null) {

                try {

                    dump(fd.getFileDescriptor(), args);

                } finally {

                    IoUtils.closeQuietly(fd);

                }

   








Android 7上

调用 dumpsys battery的堆栈

01-01 07:19:19.893 1220-1622/? D/BatteryService: java.lang.Throwable
                                                     at com.android.server.BatteryService$BinderService.dump(BatteryService.java:1159)
                                                     at android.os.Binder.doDump(Binder.java:418)
                                                     at android.os.Binder.dump(Binder.java:405)
                                                     at android.os.Binder.onTransact(Binder.java:352)
                                                     at android.os.Binder.execTransact(Binder.java:575)



调用 dumpsys package 的堆栈
01-01 08:09:28.180 1220-3179/? D/PackageManager: java.lang.Throwable
                                                     at com.android.server.pm.PackageManagerService.dump(PackageManagerService.java:19397)
                                                     at android.os.Binder.doDump(Binder.java:418)
                                                     at android.os.Binder.dump(Binder.java:405)
                                                     at android.os.Binder.onTransact(Binder.java:352)
                                                     at android.content.pm.IPackageManager$Stub.onTransact(IPackageManager.java:2451)
                                                     at com.android.server.pm.PackageManagerService.onTransact(PackageManagerService.java:3732)
                                                     at android.os.Binder.execTransact(Binder.java:575)

 


class A{
    public void t1()
    {
        System.out.println("======== A.t1 called");
        t2();
    }

    public void t2()
    {
        System.out.println("A.t2  called");
    }
}

class B extends A{
    public void t1(){
        System.out.println("B.t1 called");
        super.t1();
    }

    public void t2()
    {
        System.out.println("B.t2  called");
    }

}


        A a = new B();
        a.t1();


B.t1 called
======== A.t1 called
B.t2  called


这里实现了多态。

这里我们需要留意下,Java里多态调用时默认的,而在C++里,需要使用virtual关键字去说明。

如果不进行说明,如下:

#include <iostream>

using namespace std;

class A{
public:
    void t1()
    {
        cout << ("======== A.t1 called\n");
        t2();
    }

    void t2()
    {
        cout << ("A.t2  called\n");
    }
};

class B : public A{
    void t1(){
        cout << ("B.t1 called\n");
        A::t1();

    }

    void t2()
    {
        cout << ("B.t2  called\n");
    }
};


int _tmain(int argc, _TCHAR* argv[])
{
    A * b = new B;
    b->t1();

    return 0;
}


输出为
======== A.t1 called
A.t2  called



声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/830148
推荐阅读
相关标签
  

闽ICP备14008679号