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))
这样,我们就不用查文档寻找特定的颜色值,也能解决任意颜色的设置。
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()
的用法,应该也是第一种情况。
相关资料:
PS:
Android反编译 -- 错误代码还原的更多相关文章
- Android 反编译
Android 反编译 步骤:1.下载apktool 工具,这一步 主要是反编译 xml 文件. 步骤:2 把xx.smali 文件转为java 工具 (单个) 图形界面 下载dex2jar 和xj ...
- 转 谈谈android反编译和防止反编译的方法
谈谈android反编译和防止反编译的方法 android基于java的,而java反编译工具很强悍,所以对正常apk应用程序基本上可以做到100%反编译还原. 因此开发人员如果不准备开源自己的项 ...
- 谈谈android反编译和防止反编译的方法(转)
谈谈android反编译和防止反编译的方法(转) android基于java的,而java反编译工具很强悍,所以对正常apk应用程序基本上可以做到100%反编译还原. 因此开发人员如果不准备开源自己的 ...
- ubuntu下Android反编译详细教程-apktool,dex2jar,jd-gui的使用
转载请注明出处:http://blog.csdn.net/fightlei/article/details/52432161 最近在学习Android反编译的一些知识,虽然在网上搜到了很多相关的文章, ...
- Android反编译与防止反编译
1.Android反编译 1)下载两个工具 dex2jar,jar2java,相关阅读下载见:http://www.linuxidc.com/Linux/2011-02/32775.htm ...
- Android反编译(三)之重签名
Android反编译(三) 之重签名 [目录] 1.原理 2.工具与准备工作 3.操作步骤 4.装X技巧 5.问题 1.原理 1).APK签名的要点 a.所有的应用程序都必须有数字证书 ,Androi ...
- Android反编译(二)之反编译XML资源文件
Android反编译(二) 之反编译XML资源文件 [目录] 1.工具 2.反编译步骤 3.重新编译APK 4.实例 5.装X技巧 6.学习总结 1.工具 1).反编译工具 apktool http ...
- Android反编译(一)之反编译JAVA源码
Android反编译(一) 之反编译JAVA源码 [目录] 1.工具 2.反编译步骤 3.实例 4.装X技巧 1.工具 1).dex反编译JAR工具 dex2jar http://code.go ...
- Atitti.java android反编译解决方案-----虚拟机方案
Atitti.java android反编译解决方案-----虚拟机方案 哈哈,终极解决方案是虚拟机...c++也可以反编译为汇编代码,但无需担心,因为读懂汇编太麻烦..只要不能拿到c++源码就可.. ...
随机推荐
- ●BZOJ 4289 PA2012 Tax
●赘述题目 算了,题目没有重复的必要. 注意理解:对答案造成贡献的是每个点,就是了. 举个栗子: 对于如下数据: 2 1 1 2 1 答案是 2: ●题解 方法:建图(难点)+最短路. 先来几个链接: ...
- [APIO2011]
来自FallDream的博客,未经允许,请勿转载,谢谢. ------------------------------------------------------ A.[Apio2011]方格染色 ...
- django rest-framework 1.序列化 一
上图为项目完整的目录结构 一.入门 需要先安装需要使用到包 pip install django pip install djangorestframework 先来创建一个新项目 django-ad ...
- NGUI制作可滚动的文本框(摘,如有侵权,联系删除)
NGUI制作可滚动的文本框 1.首先创建一个UI Root 2.选择UI Root右键 Create 选择Scoll View创建. 3.Scroll view的大小是可以调节的,调节为你需要的适当大 ...
- Linux下运行当前目录需要加./的原因
在Windows下运行当前目录的文件,可以直接输入文件全名,就能够运行该文件.但对于Linux则必须加上./文件名才能运行.对于这一点表示很疑惑,最后查阅了资料才弄明白. 原因如下: 1.在Windo ...
- cocos2d-x-3.x 学习总结(一)
这周学习了<cocos2d-x 3.x 游戏开发之旅>的第三章,做如下总结: 1.关于创建标签对象 书中是 Label* label = Label::create(); 可是总是提示出错 ...
- C语言程序设计第二次作业1
(一)改错题 1.输出带框文字:在屏幕上输出以下3行信息. ************* Welcome ************* 源程序 include int mian() { printf(&q ...
- Selenium之unittest测试框架详谈及实操
申明:本文是基于python3.x及selenium3.x. unittest,也可以称为PyUnit,可以用来创建全面的测试套件,可以用于单元自动化测试(模块).功能自动化测试(UI)等等. 官方文 ...
- 使用Aes对称加密解密Web.Config数据库连接串
现在很多公司开始为了保证数据库的安全性,通常会对Web.Config的数据库连接字符串进行加密.本文将介绍学习使用Aes加密解密数据库连接字符串.本文采用MySql数据库. AES概念简述 AES 是 ...
- css控制file控件透明 漂浮
css控件透明属性设置IE firefor设置方法<STYLE type=text/css>.upfilefield{position:absolute; FILTER: alpha(op ...