Android反编译 -- 错误代码还原

PS:如果阅读体验不好,可以尝试Github版 (<-点左边)

1. setColor(-16777216)

反编译的代码中会有很多setColor(int)的情况,比如setColor(-16777216),这个值比较特别,能轻易的查到Android文档中对这个整数的定义:

public static final int BLACK. Added in API level 1 Constant Value: -16777216 ( 0xff000000).

也就是说setColor(-16777216)-16777216对应的颜色是BLACK(0xff000000),那么其他系统未定义成某个颜色名的值呢?

-16777216 对应 0xff000000
       -1 对应 0xffffffff
 0xffffff 的值 16777215

那么对任意的 setColor(int)中的int值,我们可以:
0xffffffff+(int)+1 或 0xffffffff-(-int+1) 

则对于 :setColor(-16777216)
可写成 :setColor(0xffffffff - 16777215)) 或 setColor(-16777216 + 1 + 0xffffffff))

这样,我们就不用查文档寻找特定的颜色值,也能解决任意颜色的设置。

Stackoverflow : How to set color using integer?

2.MeasureSpec.makeMeasureSpec(xx, int)

反编译的代码中MeasureSpec.makeMeasureSpec(xx, int)的第二个参数是个int类型的数,这个比较简单,直接看文档或者源码即可找到:

源码:

public static class MeasureSpec {
        public static final int UNSPECIFIED = 0;
        public static final int EXACTLY = 1073741824;
        public static final int AT_MOST = -2147483648;
        ...
        }

文档:

public static final int AT_MOST
Added in API level 1
Measure specification mode: The child can be as large as it wants up to the specified size.
Constant Value: -2147483648 (0x80000000)

public static final int EXACTLY
Added in API level 1
Measure specification mode: The parent has determined an exact size for the child. The child is going to be given those bounds regardless of how big it wants to be.
Constant Value: 1073741824 (0x40000000)

public static final int UNSPECIFIED
Added in API level 1
Measure specification mode: The parent has not imposed any constraint on the child. It can be whatever size it wants.
Constant Value: 0 (0x00000000)

则对于: MeasureSpec.makeMeasureSpec(xx, 0) 我们应该修改为 MeasureSpec.makeMeasureSpec(xx, View.MeasureSpec.UNSPECIFIED)

其他依次类推。

3.setVisibility(int)

这个同[2],看文档或者看源码:

public static final int VISIBLE = 0;
public static final int INVISIBLE = 4;
public static final int GONE = 8;

则对于:setVisibility(0) ==> setVisibility(View.VISIBLE)

其他依次类推。

4.new Runnable()...

反编译的代码中:

new Runnable() {
    final /* synthetic */ AbstractButton a;
        {
        this.a = r1;
       }

       public final void run() {
          this.a.xxxxx();
       }
};

可直接去掉成员变量:

new Runnable() {
       public final void run() {
          xxxxx();
       }
};

5.new Handler()...

[4],直接去掉成员变量:

new Handler() {
            final /* synthetic */ ButtonSave a;

            {
                this.a = r1;
            }

            public final void handleMessage(Message message) {
                    this.a.xxx();
            }
        };
//修改为
new Handler() {
            public final void handleMessage(Message message) {
                xxx();
            }
        };

6.context.getSystemService("layout_inflater")

直接看源码即可:

public static final String POWER_SERVICE = "power";
public static final String WINDOW_SERVICE = "window";
public static final String LAYOUT_INFLATER_SERVICE = "layout_inflater";
public static final String ACCOUNT_SERVICE = "account";
public static final String ACTIVITY_SERVICE = "activity";
public static final String ALARM_SERVICE = "alarm";
public static final String NOTIFICATION_SERVICE = "notification";
public static final String ACCESSIBILITY_SERVICE = "accessibility";
...

context.getSystemService("layout_inflater") ==> context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)

其他依次类推。

7.intent.setFlags(335544320)

先看源码:

Intent implements Parcelable, Cloneable  {
    public static final int FLAG_GRANT_READ_URI_PERMISSION = 1;
    public static final int FLAG_GRANT_WRITE_URI_PERMISSION = 2;
    public static final int FLAG_FROM_BACKGROUND = 4;
    public static final int FLAG_DEBUG_LOG_RESOLUTION = 8;
    public static final int FLAG_EXCLUDE_STOPPED_PACKAGES = 16;
    public static final int FLAG_INCLUDE_STOPPED_PACKAGES = 32;
    public static final int FLAG_ACTIVITY_NO_HISTORY = 1073741824;
    public static final int FLAG_ACTIVITY_SINGLE_TOP = 536870912;
    public static final int FLAG_ACTIVITY_NEW_TASK = 268435456;
    public static final int FLAG_ACTIVITY_MULTIPLE_TASK = 134217728;
    public static final int FLAG_ACTIVITY_CLEAR_TOP = 67108864;
    public static final int FLAG_ACTIVITY_FORWARD_RESULT = 33554432;
    public static final int FLAG_ACTIVITY_PREVIOUS_IS_TOP = 16777216;
    public static final int FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS = 8388608;
    public static final int FLAG_ACTIVITY_BROUGHT_TO_FRONT = 4194304;
    public static final int FLAG_ACTIVITY_RESET_TASK_IF_NEEDED = 2097152;
    public static final int FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY = 1048576;
    public static final int FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET = 524288;
    public static final int FLAG_ACTIVITY_NO_USER_ACTION = 262144;
    public static final int FLAG_ACTIVITY_REORDER_TO_FRONT = 131072;
    public static final int FLAG_ACTIVITY_NO_ANIMATION = 65536;
    public static final int FLAG_ACTIVITY_CLEAR_TASK = 32768;
    public static final int FLAG_ACTIVITY_TASK_ON_HOME = 16384;
    public static final int FLAG_RECEIVER_REGISTERED_ONLY = 1073741824;
    public static final int FLAG_RECEIVER_REPLACE_PENDING = 536870912;
    public static final int FLAG_RECEIVER_FOREGROUND = 268435456;

那么对于intent.setFlags(int);int值是上面四种之一的话就比较简单,例如:

intent.setFlags(536870912); ==> intent.setFlags(PendingIntent.FLAG_NO_CREATE);

但是遇到一个比较特别的:intent.setFlags(335544320);

源码里根本没有这样一个值啊,其实intent.setFlags( A | B )是可以使用|(或运算)的,那么:

10000000000000000000000000000 = 268435456
                    |               |
  100000000000000000000000000 =  67108864
10100000000000000000000000000 = 335544320

即 268435456 | 67108864 = 335544320

从而:

intent.setFlags(335544320);==>

intent.setFlags( FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP )

或者

intent.setFlags( FLAG_RECEIVER_FOREGROUND | FLAG_ACTIVITY_CLEAR_TOP )

Codota 中搜索intent.setFlags(335544320);看到的是第一种情况,结合intent.setFlags()的用法,应该也是第一种情况。

相关资料:

http://farwmarth.com/2013/04/23/android%20反编译和代码解读/

PS:

本文已整理到Github上,欢迎提交更多代码! 你可以关注的我GithubCSDN微博

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据饕餮

NLP专题:LSA浅层语义分析

在Wiki上看到的LSA的详细介绍,感觉挺好的,遂翻译过来,有翻译不对之处还望指教。

22420
来自专栏智慧协同

Gitlab安装配置教程

下面介绍在centos 6 上安装的方法,其他方法可参考官网https://about.gitlab.com/downloads

39120
来自专栏程序员的知识天地

大数据告诉你:为啥近5年来Python如此火爆?

我们最近讨论过,那些被世界银行定义为高收入水平的发达国家,在选择使用什么类型的技术方面,和世界上的其他地方往往有着较大的区别。这类区别中,差异最大的例子之一,就...

15020
来自专栏PHP修行之路

【php设计模式】组合模式

  是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结...

9120
来自专栏秃头哥编程

Redis常用技术----事务

Redis的事务是使用MULTI-EXEC的命令组合,使用它可以提供两个重要的保证:

13320
来自专栏波波烤鸭

微服务综合案例-03-其他服务的创建

  上篇文章我们详细的介绍了product服务的创建,因为其他几个服务的创建过程是相似的,所以其他几个服务我们就快速创建了。

13620
来自专栏菲宇

linux 查看日志的几种基本操作

注意:>意思是创建,>>是追加。千万不要弄混了。 cat其他参数与tail 类似

76250
来自专栏Devops专栏

Django 2.1.7 runserver启动直接报错 django.core.exceptions.ImproperlyConfigured: Passing a 3-tuple to i...

在其他办公电脑创建的Django项目 2.2.1 版本都可以直接 runserver 启动服务正常。 但是本地创建的项目,只要执行python3 manage...

14920
来自专栏BanzClub

内存模型与轻量级同步机制volatile

Java中为了线程通信的安全性(数据一致性),除了提供内置锁synchronized和显示锁ReentrantLock,还提供了另外一种线程同步机制——vola...

9510
来自专栏爱撸猫的杰

Java并发机制的底层实现原理之volatile应用,初学者误看!

  Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制...

13420

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励