转储的XML布局文件填充位置不正常

时间:2009-12-30 11:23:57

标签: android

我一直在试图弄清楚如何理解倾斜的XML布局,并且它的进展“相当不错”。我目前唯一不确定的是以下内容:

当我使用命令时:

aapt dump xmltree <pathofapk> <pathofxmlfile>

我得到以下结果:

   N: android=http://schemas.android.com/apk/res/android
  E: LinearLayout (line=2)
    A: android:orientation(0x010100c4)=(type 0x10)0x1
    A: android:layout_width(0x010100f4)=(type 0x10)0xffffffff
    A: android:layout_height(0x010100f5)=(type 0x10)0xffffffff
    E: LinearLayout (line=7)
      A: android:orientation(0x010100c4)=(type 0x10)0x0
      A: android:background(0x010100d4)=@0x7f020004
      A: android:layout_width(0x010100f4)=(type 0x10)0xffffffff
      A: android:layout_height(0x010100f5)=(type 0x10)0xfffffffe
      E: ImageView (line=12)
        A: android:gravity(0x010100af)=(type 0x11)0x3
        A: android:layout_gravity(0x010100b3)=(type 0x11)0x13
        A: android:id(0x010100d0)=@0x7f090021
        A: android:paddingLeft(0x010100d6)=(type 0x5)0xa01
        A: android:paddingTop(0x010100d7)=(type 0x5)0x401
        A: android:layout_width(0x010100f4)=(type 0x10)0xfffffffe
        A: android:layout_height(0x010100f5)=(type 0x10)0xfffffffe
        A: android:src(0x01010119)=@0x7f020006
    E: ScrollView (line=21)
      A: android:orientation(0x010100c4)=(type 0x10)0x1
      A: android:layout_width(0x010100f4)=(type 0x10)0xffffffff
      A: android:layout_height(0x010100f5)=(type 0x10)0xffffffff
      A: android:layout_weight(0x01010181)=(type 0x4)0x3f800000
      E: LinearLayout (line=25)
        A: android:orientation(0x010100c4)=(type 0x10)0x1
        A: android:id(0x010100d0)=@0x7f09002d
        A: android:padding(0x010100d5)=(type 0x5)0xa01
        A: android:layout_width(0x010100f4)=(type 0x10)0xffffffff
        A: android:layout_height(0x010100f5)=(type 0x10)0xffffffff
        E: EditText (line=29)
          A: android:layout_gravity(0x010100b3)=(type 0x11)0x51
          A: android:id(0x010100d0)=@0x7f09002e
          A: android:layout_width(0x010100f4)=(type 0x10)0xffffffff
          A: android:layout_height(0x010100f5)=(type 0x10)0xfffffffe
          A: android:text(0x0101014f)="" (Raw: "")
          A: android:hint(0x01010150)=@0x7f070050
        E: EditText (line=36)
          A: android:layout_gravity(0x010100b3)=(type 0x11)0x51
          A: android:id(0x010100d0)=@0x7f09002f
          A: android:layout_width(0x010100f4)=(type 0x10)0xffffffff
          A: android:layout_height(0x010100f5)=(type 0x10)0xfffffffe
          A: android:text(0x0101014f)="" (Raw: "")
          A: android:hint(0x01010150)=@0x7f070051
          A: android:password(0x0101015c)=(type 0x12)0xffffffff
        E: LinearLayout (line=44)
          A: android:orientation(0x010100c4)=(type 0x10)0x0
          A: android:padding(0x010100d5)=(type 0x5)0xa01
          A: android:layout_width(0x010100f4)=(type 0x10)0xffffffff
          A: android:layout_height(0x010100f5)=(type 0x10)0xfffffffe
          E: Button (line=48)
            A: android:id(0x010100d0)=@0x7f090030
            A: android:layout_width(0x010100f4)=(type 0x10)0xffffffff
            A: android:layout_height(0x010100f5)=(type 0x10)0xfffffffe
            A: android:text(0x0101014f)=@0x7f07000a
            A: android:layout_weight(0x01010181)=(type 0x4)0x3f800000
          E: Button (line=54)
            A: android:id(0x010100d0)=@0x7f090031
            A: android:layout_width(0x010100f4)=(type 0x10)0xffffffff
            A: android:layout_height(0x010100f5)=(type 0x10)0xfffffffe
            A: android:text(0x0101014f)=@0x7f070003
            A: android:layout_weight(0x01010181)=(type 0x4)0x3f800000

这一切都很好,但我想弄清楚的是如何将以下代码转换为XML布局文件:

    A: android:paddingLeft(0x010100d6)=(type 0x5)0xa01
    A: android:paddingTop(0x010100d7)=(type 0x5)0x401

将这些值转换为十进制将导致:

paddingLeft:2561
paddingTop:1025

一切都很好,但我一直想弄清楚(类型0x5的意思)。对于所有其他类型,结果在Android.util.TypedValue.class文件中定义

反编译,给出0x5的以下结果:

      // Field descriptor #8 I
  public static final int TYPE_DIMENSION = 5;

在某种程度上有道理。但是,我需要知道它是什么样的价值,所以往下看,我发现以下价值:

  // Field descriptor #8 I
  public static final int COMPLEX_UNIT_MM = 5;

但是,当我尝试使用2561mm和1025mm时(无论如何它有点大,25cm比我的屏幕大),整个屏幕充满了'父线性阵列'。

我不知道出了什么问题。谁能在这个问题上启发我?

3 个答案:

答案 0 :(得分:3)

这些类型值的数据结构在此处定义:

https://android.googlesource.com/platform/frameworks/base/+/gingerbread-release/include/utils/ResourceTypes.h#220

Inside是类型代码的枚举;之后是分数和单位类型的位的定义。 (你在这里看到的是单位类型 - 即20sp。)

答案 1 :(得分:1)

是的,你是对的!在这个回答之前我有点乱,我发现了同样的事情。

我总是考虑一些浮点值,因为它更有意义,但我无法在浮点数中创建任何值0xa01,所以经过一些窥探后,我发现了以下函数:

public static float complexToFloat (int complex)

当我使用设置为0xa01的复杂变量调用此方法时,我得到了正确的结果,即10.0(而另一个值为4.0)。

所以是的,10.0毫米/4.0毫米做了伎俩!,谢谢一堆^ _ ^

答案 2 :(得分:0)

如果我不得不猜测,你会错误地解释这些价值观。 1025和2561可能是这些十六进制值的十进制等值,但在Android中有 no 度量单位,这些单位有意义 - 即使对于px,这些数字也太大了,让单独mm。我的猜测是,它们的编码方式与您预期的不同。例如,我怀疑它们确实是浮点值,因为它们对于维度是合法的。

你可以通过创建一个废料项目,在布局中设置一些填充值,编译它,然后在你自己的APK上运行转储来测试这个理论,看看你是否可以对正在发生的事情进行逆向工程。或者,您可以尝试查看代码以获取自身,该代码应位于开源树中。