我一直在试图弄清楚如何理解倾斜的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比我的屏幕大),整个屏幕充满了'父线性阵列'。
我不知道出了什么问题。谁能在这个问题上启发我?
答案 0 :(得分:3)
这些类型值的数据结构在此处定义:
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上运行转储来测试这个理论,看看你是否可以对正在发生的事情进行逆向工程。或者,您可以尝试查看代码以获取自身,该代码应位于开源树中。