Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 转储的XML布局文件填充位置行为不正确_Android - Fatal编程技术网

Android 转储的XML布局文件填充位置行为不正确

Android 转储的XML布局文件填充位置行为不正确,android,Android,我一直在试图弄清楚如何理解废弃的XML布局,现在进展得“相当不错”。我目前唯一不确定的是: 当我使用命令时: aapt dump xmltree <pathofapk> <pathofxmlfile> 这很好,但我想知道的是如何将以下代码转换为XML布局文件: A: android:paddingLeft(0x010100d6)=(type 0x5)0xa01 A: android:paddingTop(0x010100d7)=(type 0x5)0x4

我一直在试图弄清楚如何理解废弃的XML布局,现在进展得“相当不错”。我目前唯一不确定的是:

当我使用命令时:

aapt dump xmltree <pathofapk> <pathofxmlfile>
这很好,但我想知道的是如何将以下代码转换为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是。。比我的屏幕大,整个屏幕充满了“父LinearLayout”


我不知道怎么了。有人能在这个问题上给我一些启发吗?

如果非要我猜的话,你误解了这些价值观。1025和2561可能是这些十六进制值的十进制等价物,但在Android中,没有任何有意义的度量单位——这些数字对于px来说都太大了,更不用说mm了。我的猜测是,它们的编码方式与您预期的不同。例如,我怀疑它们是真正的浮点值,因为它们对维度是合法的


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

如果我不得不猜测,您误解了这些值。1025和2561可能是这些十六进制值的十进制等价物,但在Android中,没有任何有意义的度量单位——这些数字对于px来说都太大了,更不用说mm了。我的猜测是,它们的编码方式与您预期的不同。例如,我怀疑它们是真正的浮点值,因为它们对维度是合法的


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

是的,您是对的!在回答这个问题之前,我有点胡思乱想,我发现了同样的事情

我一直在考虑一些浮点值,因为它更有意义,但我无法在float中对值0xa01进行任何处理,因此在仔细研究之后,我发现了以下函数:

public static float complexToFloat (int complex)
当我使用设置为0xa01的复变量调用这个方法时,我得到了正确的结果,对于另一个值是10.0和4.0


所以是的,10.0mm/4.0mm成功了!,非常感谢,是的,你是对的!在回答这个问题之前,我有点胡思乱想,我发现了同样的事情

我一直在考虑一些浮点值,因为它更有意义,但我无法在float中对值0xa01进行任何处理,因此在仔细研究之后,我发现了以下函数:

public static float complexToFloat (int complex)
当我使用设置为0xa01的复变量调用这个方法时,我得到了正确的结果,对于另一个值是10.0和4.0


所以是的,10.0mm/4.0mm成功了!,感谢大家^ ^

这里定义了这些类型化值的数据结构:


里面是类型代码的枚举;之后是分数和单位类型的位定义。您在这里看到的是单位类型,即20sp。

这些类型值的数据结构定义如下:


里面是类型代码的枚举;之后是分数和单位类型的位定义。您在这里看到的是单元类型,即20sp。

您能简单地查看正在运行的应用程序并判断两种填充大小吗嗯,我希望我可以,但是我目前正在试用的应用程序不能正常运行,因为我有一个2.0单元,而且应用程序不是为它开发的。是的,你可以简单地查看正在运行的应用程序并判断两个填充大小是什么吗好吧,我希望我可以,但是我目前正在尝试的应用程序不能正常运行,因为我有一个2.0单元,而且应用程序不是为它开发的。yetI已经在那里了,正如OP TypedValue.class中所述,它与ResourceTypes几乎相等。它仍然没有说那里的值是一个浮点值,应该被视为一个应该用复数尾数移位/复数尾数掩码移位的值。不过,对于新事物来说,这是一个很好的参考。它比TypedValue好得多,谢谢!类型0x5表示这是一个维度;维度始终是一种类型
ed单位,因此该值的下4位是由复数单位移位和复数单位掩码定义的单位。这里,较低的4位是0x1,或复数单位DIP。对于值本身,基数在接下来的4位中,这里是0x0或复数基数。剩下的是实际值,第一个是0xa,第二个是0x4,所以这两个属性是10dip和4dip。哇,我欠你一个。我希望我能对这两个答案都投赞成票。哈哈哈,谢谢你提供的信息。我想我再也没有比这更好的了。感谢您提供的最终信息,我可以理解为什么现在是10.0,而不仅仅是获取值。那么,我的MM也被取消了?我还有很多东西要学:正如OP TypedValue中所述,我已经在那里学习过了。class与ResourceTypes几乎相等。它仍然没有说那里的值是一个浮点值,应该被视为一个应该用复数尾数移位/复数尾数掩码移位的值。不过,对于新事物来说,这是一个很好的参考。它比TypedValue好得多,谢谢!类型0x5表示这是一个维度;维度始终是一个类型化的单位,因此值的下4位是由复数单位移位和复数单位掩码定义的单位。这里,较低的4位是0x1,或复数单位DIP。对于值本身,基数在接下来的4位中,这里是0x0或复数基数。剩下的是实际值,第一个是0xa,第二个是0x4,所以这两个属性是10dip和4dip。哇,我欠你一个。我希望我能对这两个答案都投赞成票。哈哈哈,谢谢你提供的信息。我想我再也没有比这更好的了。感谢您提供的最终信息,我可以理解为什么现在是10.0,而不仅仅是获取值。那么,我的MM也被取消了?我还有很多东西要学: