当前位置:   article > 正文

使用AndroidStudio反编译代码方法片段-分析Google开机向导语言选择界面_谷歌 反编译 启动页

谷歌 反编译 启动页

为什么会用到?

我们经常需要和别人做好的apk进行对比,有时候就需要反编译查看其中的一些内容。

一般我们反编译代码,都是使用的ApkTool进行,但是有时候,apkTool无法实现反编译。所以,就发现了新版本的Android Studio中,增加了一个Analyze Aok 功能,此功能就在Run菜单中。通过它,可以快速的查看编译后的java代码和资源,便于快速分析apk。

要分析的是什么?

这里,我们分析一下Google SetupWizard中的一个界面,就是恢复出厂设置后,第一个界面:语言选择界面,我们通过反编译,来了解一下语言选择界面是如何实现的。其实我最关注的是,语言列表中的内容是如何获取的。

实际上,这个apk可以听过apktool进行反编译,所以这里我也会对这两个进行比较,这样更容易理解java的原始代码(或者说在Android Studio中看到的样子)。

分析Google Setupwizard apk

我们可以在Android源代码的 vendor/google/apps/SetupWizard/SetupWizard_arm64.apk 位置,找到这个apk。或者直接从手机中获取。

加载apk到Android Studio

下图,是加载后的截图。
在这里插入图片描述
说明:

  1. classes.dex
    代码,所有的java文件编译后,会成成dex文件,用来提供给系统执行,而不是给我们看。
  2. resources.arsc
    通过aapt编译后的资源包,其中放置的主要就是String。其它就是color,anim等等。例如strings.xml中的内容会被编译在其中。这样做也是为了提供使用时候的效率。其实就是可以被直接解析的xml都被编译成了这种形式。
  3. res
    这里是所有的不能被直接解析的资源,例如:图片,布局,xml 等等
  4. lib
  5. META-INF
  6. AndroidManifest.xml
    apk的描述文件,apk在手机系统中的加载,就是从解析此文件开始的。apk可以做什么,也只有这个恩建才能描述。
    上边我做了解释的部分,在后边都会使用到,到时候再详细说明

找到语言选择界面对应的类(class)

如果想要找到这个界面,我们需要看看这个应用支持哪些界面。因为我差不多知道这个界面是Welcom,欢迎界面,所以我会朝着这个方向找。

最笨的办法是找到这个界面相关的词条,根据ID,再找到相关的代码或者布局。

也可以通过log查看当前正在执行的界面,不过刚开机,一般adb没有打开。这时候只能拿一个userdebug的版本来操作了。

当然,我就按照简单的方法来了,一般都能找到。

  1. 打开Manifst文件
    在这里插入图片描述
    上图就是打开的文件样式,完整的文件我就不贴了,下边是找到的Welcome相关Activity。
        <activity
            android:label="@ref/0x7f100156"
            android:name="com.google.android.setupwizard.user.WelcomeActivity"
            android:enabled="false"
            android:exported="false"
            android:configChanges="0x2027"
            android:immersive="true"
            android:directBootAware="true">

            <intent-filter>

                <action
                    android:name="com.android.setupwizard.WELCOME" />

                <category
                    android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

找到的类就是com.google.android.setupwizard.user.WelcomeActivity

打开代码进行分析

点击classes.dex, 下边就会显示所有的类信息,然后根据目录,找到对应的类
在这里插入图片描述
在文件上右键选择Show Bytecode,就可以看到完整的代码,当然,也看不懂。

在其中,我们尝试找到对应的界面吧,然后和正常apktool反编译的内容比较(也就是和正常代码比较,看看这个代码究竟是怎么看的)

因为我们关心的是语言列表如何生成的,那么我们首先要找到语言列表对应的布局,再看看它是怎么被设置数值的。

  1. 查找onCreate,找到activity的加载部分,这里我将从开始到setContentView部分都拿出来了。

在这部分中,查看SetContentView可以知道加载的布局是哪一个奥。

.method protected final onCreate(Landroid/os/Bundle;)V
    .registers 8

    .line 105
    invoke-super {
   p0, p1}, Lagx;->onCreate(Landroid/os/Bundle;)V

    .line 106
    const/4 v0, 0x0

    invoke-virtual {
   p0, v0}, Lagx;->a(Z)V

    .line 107
    invoke-static {
   p0}, Lahr;->a(Landroid/content/Context;)Lahr;

    move-result-object v1

    iput-object v1, p0, Lcom/google/android/setupwizard/user/WelcomeActivity;->C:Lahr;

    new-instance v1, Landroid/os/Handler;

    .line 108
    invoke-static {
   }, Landroid/os/Looper;->getMainLooper()Landroid/os/Looper;

    move-result-object v2

    invoke-direct {
   v1, v2}, Landroid/os/Handler;-><init>(Landroid/os/Looper;)V

    iput-object v1, p0, Lcom/google/android/setupwizard/user/WelcomeActivity;->z:Landroid/os/Handler;

    const/4 v1, 0x1

    if-nez p1, :cond_45

    .line 109
    sget-object v2, Lahe;->b:[I

    invoke-virtual {
   p0, v2}, Lcom/google/android/setupwizard/user/WelcomeActivity;->obtainStyledAttributes([I)Landroid/content/res/TypedArray;

    move-result-object v2

    .line 110
    invoke-virtual {
   v2, v0, v0}, Landroid/content/res/TypedArray;->getResourceId(II)I

    move-result v3

    .line 111
    invoke-virtual {
   v2, v1, v0}, Landroid/content/res/TypedArray;->getResourceId(II)I

    move-result v4

    .line 112
    invoke-virtual {
   v2}, Landroid/content/res/TypedArray;->recycle()V

    if-nez v3, :cond_2f

    goto :goto_45

    .line 132
    :cond_2f
    if-eqz v4, :cond_45

    const/4 v2, 0x3

    .line 115
    invoke-static {
   p0, v2}, Lbdo;->a(Landroid/app/Activity;I)V

    .line 116
    invoke-virtual {
   p0, v3}, Lcom/google/android/setupwizard/user/WelcomeActivity;->setContentView(I)V

    iget-object v2, p0, Lcom/google/android/setupwizard/user/WelcomeActivity;->z:Landroid/os/Handler;

    new-instance v3, Lbax;

    .line 117
    invoke-direct {
   v3, p0, v4}, Lbax;-><init>(Lcom
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/255645
推荐阅读
相关标签
  

闽ICP备14008679号