【Android】玩转命令行工具-apkanalyzer

apkanalyzer,从名字就可以看出这是一个分析apk的工具,最简单的使用方法是在AndroidStudio中点击Build,然后选择Analyze APK...,本文介绍如何在命令行使用apkanalyzer。

apkanalyzer在Android SDK中,位置为android_sdk/tools/bin/apkanalyzer
apkanalyzer的语法如下:

apkanalyzer [global-options] subject verb [options] apk-file [apk-file2]
  • global-options:可选项,- -human-readable,可缩写为-h,表示以可读性好的格式打印文件大小。
  • subject:必选项,包括apk、files、manifest、dex、resources。
  • verb:必选项,根据subject的不同而不同。
  • options:可选项,根据subject和verb的不同而不同。
  • apk-file:必选项,表示需要分析的apk。
  • apk-file2:仅在比较两个apk时才需要。

下面详细说明apkanalyzer的用法。

1 打印App ID、版本信息

apkanalyzer apk summary apk-file

$ ./apkanalyzer apk summary Animal.apk 
a.b.animal	27	8.1.0

2 打印apk的文件大小

apkanalyzer apk file-size apk-file

$ ./apkanalyzer apk file-size Animal.apk 
376139

3 打印apk的download大小

apkanalyzer apk download-size apk-file

$ ./apkanalyzer apk download-size Animal.apk 
369340

4 打印apk用到的feature

apkanalyzer apk features [options] apk-file
options包括:--not-required

$ ./apkanalyzer apk features Animal.apk 
android.hardware.faketouch implied: default feature for all apps

5 比较两个apk的大小

apkanalyzer apk compare [options] apk-file apk-file2
options包括:--different-only、--files-only、--patch-size

$ ./apkanalyzer apk compare Animal.apk Animal2.apk 
376139	301359	-74780	/
8804	8828	24	/classes.dex
6192	6192	0	/META-INF/
2191	2191	0	/META-INF/MANIFEST.MF
1722	1722	0	/META-INF/CERT.RSA
2279	2279	0	/META-INF/CERT.SF
2764	2764	0	/AndroidManifest.xml
4112	4112	0	/resources.arsc
367539	292731	-74808	/res/
1104	1104	0	/res/mipmap-anydpi-v26/
552	552	0	/res/mipmap-anydpi-v26/ic_launcher_round.xml
552	552	0	/res/mipmap-anydpi-v26/ic_launcher.xml
1208	1208	0	/res/layout/
1208	1208	0	/res/layout/layout_main.xml
3416	3416	0	/res/drawable-v24/
760	760	0	/res/drawable-v24/ic_launcher_foreground_1.xml
2656	2656	0	/res/drawable-v24/ic_launcher_foreground.xml
25133	25133	0	/res/mipmap-xxxhdpi-v4/
16187	16187	0	/res/mipmap-xxxhdpi-v4/ic_launcher_round.png
8946	8946	0	/res/mipmap-xxxhdpi-v4/ic_launcher.png
18161	18161	0	/res/mipmap-xxhdpi-v4/
11607	11607	0	/res/mipmap-xxhdpi-v4/ic_launcher_round.png
6554	6554	0	/res/mipmap-xxhdpi-v4/ic_launcher.png
12680	12680	0	/res/mipmap-xhdpi-v4/
8004	8004	0	/res/mipmap-xhdpi-v4/ic_launcher_round.png
4676	4676	0	/res/mipmap-xhdpi-v4/ic_launcher.png
5816	5816	0	/res/mipmap-mdpi-v4/
3487	3487	0	/res/mipmap-mdpi-v4/ic_launcher_round.png
2329	2329	0	/res/mipmap-mdpi-v4/ic_launcher.png
9165	9165	0	/res/mipmap-hdpi-v4/
5843	5843	0	/res/mipmap-hdpi-v4/ic_launcher_round.png
3322	3322	0	/res/mipmap-hdpi-v4/ic_launcher.png
290856	216048	-74808	/res/drawable/
6280	6280	0	/res/drawable/ic_launcher_background.xml
284576	209768	-74808	/res/drawable/animal.jpg

6 打印apk中的文件列表

apkanalyzer files list apk-file

$ ./apkanalyzer files list Animal.apk 
/
/META-INF/
/META-INF/MANIFEST.MF
/META-INF/CERT.RSA
/META-INF/CERT.SF
/classes.dex
/AndroidManifest.xml
/resources.arsc
/res/
/res/mipmap-anydpi-v26/
/res/mipmap-anydpi-v26/ic_launcher_round.xml
/res/mipmap-anydpi-v26/ic_launcher.xml
/res/layout/
/res/layout/layout_main.xml
/res/drawable-v24/
/res/drawable-v24/ic_launcher_foreground_1.xml
/res/drawable-v24/ic_launcher_foreground.xml
/res/mipmap-xxxhdpi-v4/
/res/mipmap-xxxhdpi-v4/ic_launcher_round.png
/res/mipmap-xxxhdpi-v4/ic_launcher.png
/res/mipmap-xxhdpi-v4/
/res/mipmap-xxhdpi-v4/ic_launcher_round.png
/res/mipmap-xxhdpi-v4/ic_launcher.png
/res/mipmap-xhdpi-v4/
/res/mipmap-xhdpi-v4/ic_launcher_round.png
/res/mipmap-xhdpi-v4/ic_launcher.png
/res/mipmap-mdpi-v4/
/res/mipmap-mdpi-v4/ic_launcher_round.png
/res/mipmap-mdpi-v4/ic_launcher.png
/res/mipmap-hdpi-v4/
/res/mipmap-hdpi-v4/ic_launcher_round.png
/res/mipmap-hdpi-v4/ic_launcher.png
/res/drawable/
/res/drawable/ic_launcher_background.xml
/res/drawable/animal.jpg

7 打印apk中某个文件的内容(二进制内容会原样显示)

apkanalyzer files cat --file path apk-file

$ ./apkanalyzer files cat --file /AndroidManifest.xml Animal.apk 
�
�'�6Pn������,:L����"6Nv����l�8Pd�����
                                                                       sharedUserId
                                                                                   versionCode
minSdkVersiontargetSdkVersionname                                                           versionName
                                   allowBackuphardwareAcceleratediconlabel	roundIcon
                                                                                         supportsRtlthemeandroid*http://schemas.android.com/apk/res/androidpackageplatformBuildVersionCodeplatformBuildVersionNammanifest
a.b.animalandroid.uid.system8.1.02uses-sdkuses-permission'android.permission.MODIFY_THEME_OVERLAY*android.permission.CHANGE_OVERLAY_PACKAGES(android.permission.INTERACT_ACROSS_USERS-android.permission.INTERACT_ACROSS_USERS_FULL
                                              application
intent-filteractionandroid.intent.action.MAIcategoryandroid.intent.category.DEFAULT�<
                                                                                        
������������������������L����������������������8����������������8��������������������������������8	��������	���������
                                             ��������
                                                       ���	��������������������
                                                                                            �������

8 打印AndroidManifest.xml(文本格式)

apkanalyzer manifest print apk-file

$ ./apkanalyzer manifest print Animal.apk 
<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:sharedUserId="android.uid.system"
    android:versionCode="27"
    android:versionName="8.1.0"
    package="a.b.animal"
    platformBuildVersionCode="27"
    platformBuildVersionName="8.1.0">

    <uses-sdk
        android:minSdkVersion="27"
        android:targetSdkVersion="27" />

    <uses-permission
        android:name="android.permission.MODIFY_THEME_OVERLAY" />

    <uses-permission
        android:name="android.permission.CHANGE_OVERLAY_PACKAGES" />

    <uses-permission
        android:name="android.permission.INTERACT_ACROSS_USERS" />

    <uses-permission
        android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />

    <application
        android:theme="@ref/0x7f070000"
        android:label="@ref/0x7f060000"
        android:icon="@ref/0x7f030000"
        android:name=".AnimalApp"
        android:allowBackup="true"
        android:hardwareAccelerated="true"
        android:supportsRtl="true"
        android:roundIcon="@ref/0x7f030001">

        <activity
            android:name=".MainActivity">

            <intent-filter>

                <action
                    android:name="android.intent.action.MAIN" />

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

9 打印App ID

apkanalyzer manifest application-id apk-file

$ ./apkanalyzer manifest application-id Animal.apk 
a.b.animal

10 打印版本名

apkanalyzer manifest version-name apk-file

$ ./apkanalyzer manifest version-name Animal.apk 
8.1.0

11 打印版本号

apkanalyzer manifest version-code apk-file

$ ./apkanalyzer manifest version-code Animal.apk 
27

12 打印最低的SDK版本

apkanalyzer manifest min-sdk apk-file

$ ./apkanalyzer manifest min-sdk Animal.apk 
27

13 打印目标SDK版本

apkanalyzer manifest target-sdk apk-file

$ ./apkanalyzer manifest target-sdk Animal.apk 
27

14 打印用到的权限列表

apkanalyzer manifest permissions apk-file

$ ./apkanalyzer manifest permissions Animal.apk 
android.permission.CHANGE_OVERLAY_PACKAGES
android.permission.MODIFY_THEME_OVERLAY
android.permission.INTERACT_ACROSS_USERS_FULL
android.permission.INTERACT_ACROSS_USERS

15 打印是否debug模式

apkanalyzer manifest debuggable apk-file

$ ./apkanalyzer manifest debuggable Animal.apk 
false

16 打印apk中的dex文件列表

apkanalyzer dex list apk-file

$ ./apkanalyzer dex list Animal.apk 
classes.dex

17 打印dex文件中引用的方法个数(默认打印所有的dex文件)

apkanalyzer dex references [--files path] [--files path2] apk-file

$ ./apkanalyzer dex references Animal.apk 
classes.dex	64

18 打印dex文件中的类信息

apkanalyzer dex packages [option1 option2 ...] apk-file
options包括:--defined-only、--files、--proguard-folder file、--proguard-mappings file、--proguard-seeds file、--proguard-usages file、--show-removed

$ ./apkanalyzer dex packages Animal.apk 
P d 28	64	5214	<TOTAL>
P d 28	31	4448	a
P d 28	31	4448	a.b
P d 28	31	4448	a.b.animal
C d 9	12	1136	a.b.animal.MainActivity
M d 1	1	58	a.b.animal.MainActivity int -get0(a.b.animal.MainActivity)
M d 1	1	58	a.b.animal.MainActivity android.content.om.IOverlayManager -get1(a.b.animal.MainActivity)
M d 1	1	55	a.b.animal.MainActivity <init>()
M d 1	1	453	a.b.animal.MainActivity void onCreate(android.os.Bundle)
M d 1	1	74	a.b.animal.MainActivity void onDestroy()
M d 1	1	73	a.b.animal.MainActivity void onPause()
M d 1	1	73	a.b.animal.MainActivity void onResume()
M d 1	1	73	a.b.animal.MainActivity void onStart()
M d 1	1	74	a.b.animal.MainActivity void onStop()
M r 0	1	26	a.b.animal.MainActivity android.view.View findViewById(int)
M r 0	1	20	a.b.animal.MainActivity android.content.res.Resources getResources()
M r 0	1	26	a.b.animal.MainActivity void setContentView(int)
F d 0	0	12	a.b.animal.MainActivity java.lang.String TAG
F d 0	0	10	a.b.animal.MainActivity int mCurrentUserId
F d 0	0	10	a.b.animal.MainActivity android.content.om.IOverlayManager mOverlayManager
C d 4	4	369	a.b.animal.AnimalApp
M d 1	1	75	a.b.animal.AnimalApp <init>()
M d 1	1	109	a.b.animal.AnimalApp void onConfigurationChanged(android.content.res.Configuration)
M d 1	1	66	a.b.animal.AnimalApp void onCreate()
M d 1	1	66	a.b.animal.AnimalApp void onTerminate()
F d 0	0	12	a.b.animal.AnimalApp java.lang.String TAG
C d 2	2	620	a.b.animal.MainActivity$1
M d 1	1	73	a.b.animal.MainActivity$1 <init>(a.b.animal.MainActivity)
M d 1	1	462	a.b.animal.MainActivity$1 void onClick(android.view.View)
F d 0	0	11	a.b.animal.MainActivity$1 a.b.animal.MainActivity this$0
C d 2	2	479	a.b.animal.MainActivity$2
M d 1	1	75	a.b.animal.MainActivity$2 <init>(a.b.animal.MainActivity)
M d 1	1	319	a.b.animal.MainActivity$2 void onClick(android.view.View)
F d 0	0	11	a.b.animal.MainActivity$2 a.b.animal.MainActivity this$0
C d 2	2	479	a.b.animal.MainActivity$3
M d 1	1	75	a.b.animal.MainActivity$3 <init>(a.b.animal.MainActivity)
M d 1	1	319	a.b.animal.MainActivity$3 void onClick(android.view.View)
F d 0	0	11	a.b.animal.MainActivity$3 a.b.animal.MainActivity this$0
C d 1	1	123	a.b.animal.R$attr
M d 1	1	55	a.b.animal.R$attr <init>()
C d 1	1	139	a.b.animal.R$color
M d 1	1	55	a.b.animal.R$color <init>()
F d 0	0	15	a.b.animal.R$color int color_default
C d 1	1	184	a.b.animal.R$drawable
M d 1	1	55	a.b.animal.R$drawable <init>()
F d 0	0	15	a.b.animal.R$drawable int animal
F d 0	0	15	a.b.animal.R$drawable int ic_launcher_background
F d 0	0	15	a.b.animal.R$drawable int ic_launcher_foreground
F d 0	0	15	a.b.animal.R$drawable int ic_launcher_foreground_1
C d 1	1	184	a.b.animal.R$id
M d 1	1	55	a.b.animal.R$id <init>()
F d 0	0	15	a.b.animal.R$id int image_animal
F d 0	0	15	a.b.animal.R$id int theme_default
F d 0	0	15	a.b.animal.R$id int theme_dog
F d 0	0	15	a.b.animal.R$id int theme_monkey
C d 1	1	139	a.b.animal.R$layout
M d 1	1	55	a.b.animal.R$layout <init>()
F d 0	0	15	a.b.animal.R$layout int layout_main
C d 1	1	154	a.b.animal.R$mipmap
M d 1	1	55	a.b.animal.R$mipmap <init>()
F d 0	0	15	a.b.animal.R$mipmap int ic_launcher
F d 0	0	15	a.b.animal.R$mipmap int ic_launcher_round
C d 1	1	184	a.b.animal.R$string
M d 1	1	55	a.b.animal.R$string <init>()
F d 0	0	15	a.b.animal.R$string int app_name
F d 0	0	15	a.b.animal.R$string int theme_default
F d 0	0	15	a.b.animal.R$string int theme_dog
F d 0	0	15	a.b.animal.R$string int theme_monkey
C d 1	1	139	a.b.animal.R$style
M d 1	1	55	a.b.animal.R$style <init>()
F d 0	0	15	a.b.animal.R$style int AppTheme
C d 1	1	119	a.b.animal.R
M d 1	1	55	a.b.animal.R <init>()
P r 0	18	430	android
P r 0	9	186	android.app
C r 0	7	146	android.app.Activity
M r 0	1	20	android.app.Activity <init>()
M r 0	1	26	android.app.Activity void onCreate(android.os.Bundle)
M r 0	1	20	android.app.Activity void onDestroy()
M r 0	1	20	android.app.Activity void onPause()
M r 0	1	20	android.app.Activity void onResume()
M r 0	1	20	android.app.Activity void onStart()
M r 0	1	20	android.app.Activity void onStop()
C r 0	1	20	android.app.ActivityManager
M r 0	1	20	android.app.ActivityManager int getCurrentUser()
C r 0	1	20	android.app.Application
M r 0	1	20	android.app.Application <init>()
P r 0	4	108	android.content
P r 0	3	82	android.content.om
C r 0	2	56	android.content.om.IOverlayManager
M r 0	1	26	android.content.om.IOverlayManager java.util.Map getAllOverlays(int)
M r 0	1	30	android.content.om.IOverlayManager boolean setEnabledExclusive(java.lang.String,boolean,int)
C r 0	1	26	android.content.om.IOverlayManager$Stub
M r 0	1	26	android.content.om.IOverlayManager$Stub android.content.om.IOverlayManager asInterface(android.os.IBinder)
P r 0	1	26	android.content.res
C r 0	1	26	android.content.res.Resources
M r 0	1	26	android.content.res.Resources int getColor(int)
P r 0	2	58	android.util
C r 0	2	58	android.util.Log
M r 0	1	28	android.util.Log int d(java.lang.String,java.lang.String)
M r 0	1	30	android.util.Log int w(java.lang.String,java.lang.String,java.lang.Throwable)
P r 0	2	52	android.widget
C r 0	2	52	android.widget.Button
M r 0	1	26	android.widget.Button void setBackgroundColor(int)
M r 0	1	26	android.widget.Button void setOnClickListener(android.view.View$OnClickListener)
P r 0	1	26	android.os
C r 0	1	26	android.os.ServiceManager
M r 0	1	26	android.os.ServiceManager android.os.IBinder getService(java.lang.String)
P r 0	15	336	java
P r 0	8	184	java.lang
C r 0	6	144	java.lang.StringBuilder
M r 0	1	20	java.lang.StringBuilder <init>()
M r 0	1	26	java.lang.StringBuilder java.lang.StringBuilder append(int)
M r 0	1	26	java.lang.StringBuilder java.lang.StringBuilder append(java.lang.Object)
M r 0	1	26	java.lang.StringBuilder java.lang.StringBuilder append(java.lang.String)
M r 0	1	26	java.lang.StringBuilder java.lang.StringBuilder append(boolean)
M r 0	1	20	java.lang.StringBuilder java.lang.String toString()
C r 0	1	20	java.lang.Object
M r 0	1	20	java.lang.Object <init>()
C r 0	1	20	java.lang.Iterable
M r 0	1	20	java.lang.Iterable java.util.Iterator iterator()
P r 0	7	152	java.util
C r 0	3	66	java.util.Map
M r 0	1	26	java.util.Map java.lang.Object get(java.lang.Object)
M r 0	1	20	java.util.Map boolean isEmpty()
M r 0	1	20	java.util.Map java.util.Set keySet()
C r 0	2	40	java.util.Iterator
M r 0	1	20	java.util.Iterator boolean hasNext()
M r 0	1	20	java.util.Iterator java.lang.Object next()
C r 0	2	46	java.util.List
M r 0	1	26	java.util.List java.lang.Object get(int)
M r 0	1	20	java.util.List int size()

19 打印类的字节码或者方法的反编译格式

apkanalyzer dex code --class class [--method method]

$ ./apkanalyzer dex code --class a.b.animal.MainActivity Animal.apk 
.class public La/b/animal/MainActivity;
.super Landroid/app/Activity;
.source "MainActivity.java"


# static fields
.field private static final TAG:Ljava/lang/String; = "Animal"


# instance fields
.field private mCurrentUserId:I

.field private mOverlayManager:Landroid/content/om/IOverlayManager;


# direct methods
.method static synthetic -get0(La/b/animal/MainActivity;)I
    .registers 2
    .param p0, "-this"    # La/b/animal/MainActivity;

    .prologue
    iget v0, p0, La/b/animal/MainActivity;->mCurrentUserId:I

    return v0
.end method

.method static synthetic -get1(La/b/animal/MainActivity;)Landroid/content/om/IOverlayManager;
    .registers 2
    .param p0, "-this"    # La/b/animal/MainActivity;

    .prologue
    iget-object v0, p0, La/b/animal/MainActivity;->mOverlayManager:Landroid/content/om/IOverlayManager;

    return-object v0
.end method

.method public constructor <init>()V
    .registers 1

    .prologue
    .line 19
    invoke-direct {p0}, Landroid/app/Activity;-><init>()V

    return-void
.end method


# virtual methods
.method protected onCreate(Landroid/os/Bundle;)V
    .registers 9
    .param p1, "savedInstanceState"    # Landroid/os/Bundle;

    .prologue
    const/high16 v6, 0x7f050000

    .line 27
    const-string/jumbo v3, "Animal"

    const-string/jumbo v4, "onCreate"

    invoke-static {v3, v4}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

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

    .line 31
    const/high16 v3, 0x7f040000

    invoke-virtual {p0, v3}, La/b/animal/MainActivity;->setContentView(I)V

    .line 33
    invoke-static {}, Landroid/app/ActivityManager;->getCurrentUser()I

    move-result v3

    iput v3, p0, La/b/animal/MainActivity;->mCurrentUserId:I

    .line 34
    const-string/jumbo v3, "Animal"

    new-instance v4, Ljava/lang/StringBuilder;

    invoke-direct {v4}, Ljava/lang/StringBuilder;-><init>()V

    const-string/jumbo v5, "CurrentUser "

    invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v4

    iget v5, p0, La/b/animal/MainActivity;->mCurrentUserId:I

    invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;

    move-result-object v4

    invoke-virtual {v4}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v4

    invoke-static {v3, v4}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

    .line 37
    const-string/jumbo v3, "overlay"

    invoke-static {v3}, Landroid/os/ServiceManager;->getService(Ljava/lang/String;)Landroid/os/IBinder;

    move-result-object v3

    .line 36
    invoke-static {v3}, Landroid/content/om/IOverlayManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/om/IOverlayManager;

    move-result-object v3

    iput-object v3, p0, La/b/animal/MainActivity;->mOverlayManager:Landroid/content/om/IOverlayManager;

    .line 38
    const-string/jumbo v3, "Animal"

    new-instance v4, Ljava/lang/StringBuilder;

    invoke-direct {v4}, Ljava/lang/StringBuilder;-><init>()V

    const-string/jumbo v5, "OverlayManager "

    invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v4

    iget-object v5, p0, La/b/animal/MainActivity;->mOverlayManager:Landroid/content/om/IOverlayManager;

    invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;

    move-result-object v4

    invoke-virtual {v4}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v4

    invoke-static {v3, v4}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

    .line 40
    const v3, 0x7f080001

    invoke-virtual {p0, v3}, La/b/animal/MainActivity;->findViewById(I)Landroid/view/View;

    move-result-object v0

    check-cast v0, Landroid/widget/Button;

    .line 41
    .local v0, "themeDefault":Landroid/widget/Button;
    invoke-virtual {p0}, La/b/animal/MainActivity;->getResources()Landroid/content/res/Resources;

    move-result-object v3

    invoke-virtual {v3, v6}, Landroid/content/res/Resources;->getColor(I)I

    move-result v3

    invoke-virtual {v0, v3}, Landroid/widget/Button;->setBackgroundColor(I)V

    .line 42
    new-instance v3, La/b/animal/MainActivity$1;

    invoke-direct {v3, p0}, La/b/animal/MainActivity$1;-><init>(La/b/animal/MainActivity;)V

    invoke-virtual {v0, v3}, Landroid/widget/Button;->setOnClickListener(Landroid/view/View$OnClickListener;)V

    .line 69
    const v3, 0x7f080002

    invoke-virtual {p0, v3}, La/b/animal/MainActivity;->findViewById(I)Landroid/view/View;

    move-result-object v1

    check-cast v1, Landroid/widget/Button;

    .line 70
    .local v1, "themeDog":Landroid/widget/Button;
    invoke-virtual {p0}, La/b/animal/MainActivity;->getResources()Landroid/content/res/Resources;

    move-result-object v3

    invoke-virtual {v3, v6}, Landroid/content/res/Resources;->getColor(I)I

    move-result v3

    invoke-virtual {v1, v3}, Landroid/widget/Button;->setBackgroundColor(I)V

    .line 71
    new-instance v3, La/b/animal/MainActivity$2;

    invoke-direct {v3, p0}, La/b/animal/MainActivity$2;-><init>(La/b/animal/MainActivity;)V

    invoke-virtual {v1, v3}, Landroid/widget/Button;->setOnClickListener(Landroid/view/View$OnClickListener;)V

    .line 88
    const v3, 0x7f080003

    invoke-virtual {p0, v3}, La/b/animal/MainActivity;->findViewById(I)Landroid/view/View;

    move-result-object v2

    check-cast v2, Landroid/widget/Button;

    .line 89
    .local v2, "themeMonkey":Landroid/widget/Button;
    invoke-virtual {p0}, La/b/animal/MainActivity;->getResources()Landroid/content/res/Resources;

    move-result-object v3

    invoke-virtual {v3, v6}, Landroid/content/res/Resources;->getColor(I)I

    move-result v3

    invoke-virtual {v2, v3}, Landroid/widget/Button;->setBackgroundColor(I)V

    .line 90
    new-instance v3, La/b/animal/MainActivity$3;

    invoke-direct {v3, p0}, La/b/animal/MainActivity$3;-><init>(La/b/animal/MainActivity;)V

    invoke-virtual {v2, v3}, Landroid/widget/Button;->setOnClickListener(Landroid/view/View$OnClickListener;)V

    .line 106
    return-void
.end method

.method protected onDestroy()V
    .registers 3

    .prologue
    .line 134
    const-string/jumbo v0, "Animal"

    const-string/jumbo v1, "onDestroy"

    invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

    .line 135
    invoke-super {p0}, Landroid/app/Activity;->onDestroy()V

    .line 136
    return-void
.end method

.method protected onPause()V
    .registers 3

    .prologue
    .line 122
    const-string/jumbo v0, "Animal"

    const-string/jumbo v1, "onPause"

    invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

    .line 123
    invoke-super {p0}, Landroid/app/Activity;->onPause()V

    .line 124
    return-void
.end method

.method protected onResume()V
    .registers 3

    .prologue
    .line 116
    const-string/jumbo v0, "Animal"

    const-string/jumbo v1, "onResume"

    invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

    .line 117
    invoke-super {p0}, Landroid/app/Activity;->onResume()V

    .line 118
    return-void
.end method

.method protected onStart()V
    .registers 3

    .prologue
    .line 110
    const-string/jumbo v0, "Animal"

    const-string/jumbo v1, "onStart"

    invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

    .line 111
    invoke-super {p0}, Landroid/app/Activity;->onStart()V

    .line 112
    return-void
.end method

.method protected onStop()V
    .registers 3

    .prologue
    .line 128
    const-string/jumbo v0, "Animal"

    const-string/jumbo v1, "onStop"

    invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

    .line 129
    invoke-super {p0}, Landroid/app/Activity;->onStop()V

    .line 130
    return-void
.end method

20 打印资源表中的包

apkanalyzer resources packages apk-file

$ ./apkanalyzer resources packages Animal.apk 
a.b.animal

21 打印某个资源类型的配置

apkanalyzer resources configs --type type [--package package] apk-file

$ ./apkanalyzer resources configs --type string Animal.apk 
default
en-rXA
ar-rXB

22 打印某个资源的值

apkanalyzer resources value --config config --name name --type type [--package package] apk-file

$ ./apkanalyzer resources value --config default --name app_name --type string Animal.apk 
Animal

23 打印某种资源类型的所有名字

apkanalyzer resources names --config config --type type [--package package] apk-file

$ ./apkanalyzer resources names --config default --type string Animal.apk 
app_name
theme_default
theme_dog
theme_monkey

24 打印二进制xml文件(纯文本格式输出)

apkanalyzer resources xml --file path apk-file
$ ./apkanalyzer resources xml --file /AndroidManifest.xml Animal.apk 
<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:sharedUserId="android.uid.system"
    android:versionCode="27"
    android:versionName="8.1.0"
    package="a.b.animal"
    platformBuildVersionCode="27"
    platformBuildVersionName="8.1.0">

    <uses-sdk
        android:minSdkVersion="27"
        android:targetSdkVersion="27" />

    <uses-permission
        android:name="android.permission.MODIFY_THEME_OVERLAY" />

    <uses-permission
        android:name="android.permission.CHANGE_OVERLAY_PACKAGES" />

    <uses-permission
        android:name="android.permission.INTERACT_ACROSS_USERS" />

    <uses-permission
        android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />

    <application
        android:theme="@ref/0x7f070000"
        android:label="@ref/0x7f060000"
        android:icon="@ref/0x7f030000"
        android:name=".AnimalApp"
        android:allowBackup="true"
        android:hardwareAccelerated="true"
        android:supportsRtl="true"
        android:roundIcon="@ref/0x7f030001">

        <activity
            android:name=".MainActivity">

            <intent-filter>

                <action
                    android:name="android.intent.action.MAIN" />

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

参考:https://developer.android.com/studio/command-line/apkanalyzer

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值