systemui.apk是什么么软件的输出格式

Android apk反编译工具引见_Bit地图文件格式简介_[GoLang学习小结]Go语言中的Slice__脚本百事通
稍等,加载中……
^_^请注意,有可能下面的2篇文章才是您想要的内容:
Android apk反编译工具引见
Bit地图文件格式简介
[GoLang学习小结]Go语言中的Slice
Android apk反编译工具引见
Android apk反编译工具介绍
首先apk不能被代码混淆(或未经编译优化),如果混淆了,反编译出来的代号还是看不懂,
当然,在你没反编译出来之前,你也不知道有没有混淆。
网上各种反编译工具,眼花缭乱,本文是个人对这些工作做的一个简单的梳理。
最靠谱也是最原始的方法就是用下面的三个工具:apktool + dex2jar + jd-gui
其他的工具大部分都是衍生自这三个工具,或者说对这三个工具的包装。
/p/android-apktool/ 官方功能介绍
It is a tool for reverse engineering 3rd party, closed, binary Android apps. It can decode resources to nearly original form
and rebuild them after makin it makes possible to debug smali code step by step.
Also it makes working with app easier because of project-like files structure
and automation of some repetitive tasks like building apk, etc.
/p/android-apktool/downloads/list //官方下载
反编译apk,输出资源文件和源码的smali文件:
用法:D:\apktool.bat F:\workspace\tmp\test.apk F:workspace\tmp\out
/p/dex2jar/ //官方功能介绍
/p/dex2jar/downloads/list //官方下载
dex2jar contains following compment
dex-reader is designed to read the Dalvik
Executable (.dex/.odex) format. It has a light weight API similar with ASM. An
example here
dex-translator is designed to do the convert job. It
reads the dex instruction to dex-ir format, after some optimize, convert to ASM format.
dex-ir used by dex-translator, is designed to represent the dex
instruction
dex-tools tools to work with .class files. here are examples:
Modify a apk
DeObfuscate a jar
d2j-smali [To be published] disassemble dex to smali files and assemble
dex from smali files. different implementation to smali/baksmali, same syntax, but we support escape in type desc "Lcom/dex2jar\t\u1234;"
dex-writer [To be published] write dex same way as dex-reader.
到官网下载最新的版本,直接反编译apk,apk文件名不能包含中文名称,新版本的aex2jar不用把apk换成zip解压了,直接反编译:
生产jar,然后用jd打开这个文件,在jd中可以查看代码,也可以导出为java文件
使用 dex2jar 来生成 .jar 文件. dex2jar会在someApk.apk所在目录下生成一个someApk_dex2jar.jar文件.
linux sh /home/dex2jar-version/dex2jar.sh /home/someApk.apk
windows C:\dex2jar-version\dex2jar.bat someApk.apk
注意:dex2jar只能生成jar文件,无法生成资源文件
Levin:apktool和dex2jar都能生成smali代码,两者有何异同?个人认为,两者都是将.dex文件即DalvikExecutable文件
反编译成smali代码,不同的是,apktool输出的是一个一个.smali代码文件,这种单个的.smali代码文件,
jd-gui打不开(我还没找到什么工具能打开),而dex2jar生成的为打包成*.jar格式的smali源码包,
这种jar格式的smali源码包,可以通过jd-gui转换为java代码。
http://jd.benow.ca///官方功能介绍、官方下载
Java Decompiler graphical UI
JD-GUI is a standalone graphical utility that displays Java source codes of “.class” files.
You can browse the reconstructed source code with the JD-GUI for instant access to methods and fields.
前文说过,其他的工具大部分都是衍生自这三个工具,或者说对这三个工具的包装,你可以看到其安装目录下有apktool等工具
下面对这些工具做个罗列,和本人的使用心得:
APKMultiTool:国外团队开发,Console交互界面,用来反编译apk,修改,并重新签名打包。只能反编译出资源文件,不能反编译出java代码ApkDec: android开发社区开发,图形界面,可以反编译出资源文件盒smali的jar包,
目前只有ApkDec-Release-0.1,win32版本,无法在64为机器上运行。找官方团队索要,无果。
Dodo APKTools:国产,只能反编译出一个一个的smali文件
Smali2Java:国产,这款反编译软件比较牛逼,能过将smali文件高保真还原成java文件。比jd-gui更上一层楼
/cn/smali2java/ //官方功能介绍、官方下载
smali2java是一个将smali代码反编译成java代码的工具。
什么是smali?smali是将Android字节码用可阅读的字符串形式表现出来的一种语言,可以称之为Android字节码的反汇编语言。使用baksmali或apktool可以将Android应用程序包(apk或jar)反编译为smali代码。
Levin:jd-gui可以反编译smali代码,说明smali代码,类似于.class代码。
smali2java的反编译过程是:dex字节码--&smali代码--&java代码
smali2java工具基于apktool v1.5.0(baksmali v1.3.4)生成的smali文件,依赖于smali文件中的代码行数(.line关键字)和变量别名(.local关键字)等信息,可以最大程度还原原始的java代码。还原出的java代码将具有原始的变量命名,代码的顺序也与原始的java代码保持一致。因此,本工具也具有局限性,仅适用于带有行数和变量别名信息的smali文件(java编译器的编译选项可以在生成的字节码中剔除这些信息)。
总结:如果你即想反编译出资源,又想反编译出java源码,本人推荐如下最优方式(省时省力,效果好):
step1:使用apktool,反编译出所有的资源文件
step2:使用Smali2Java反编译出高保真的java代码
Bit地图文件格式简介
Bitmap文件格式简介
位图是Windows标准格式的图形文件。它将图像定义为由像素组成,每个点可以由多种色彩表示。位图文件格式如下表所示:
BITMAPFILEHEADER 的结构
typedef struct tagBITMAPFILEHEADER
指定文件类型,必须是0x424D,即字符串“BM”,也就是说所有.bmp文件的头两个字节都是“BM”。
指定文件大小,包括这14个字节。
bfReserved1;
为保留字,不用考虑
bfReserved2;
为保留字,不用考虑
为从文件头到实际的位图数据的偏移字节数。
} BITMAPFILEHEADER;
BITMAPINFOHEADER 的结构
typedef struct tagBITMAPINFOHEADER
指定这个结构的长度,为40
指定图象的宽度,单位是象素
指定图象的高度,单位是象素
必须是1,不用考虑
biBitCount
指定表示颜色时要用到的位数,常用的值为1(黑白二色图), 4(16色图), 8(256色), 24(真彩色图),32。
biC 指定位图是否压缩,有效的值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS(都是一些Windows定义好的常量)。要说明的是,Windows位图可以采用RLE4,和RLE8的压缩格式,但用的不多。我们今后所讨论的只有第一种不压缩的情况,即biCompression为BI_RGB的情况。
指定实际的位图数据占用的字节数,其实也可以从以下的公式中计算出来:
要注意的是:上述公式中的biWidth’必须是4的整倍数(所以不是biWidth,而是biWidth’,表示大于或等于biWidth的,最接近4的整倍数。举个例子,如果biWidth=240,则biWidth’=240;如果biWidth=241,biWidth’=244)。如果biCompression为BI_RGB,则该项可能为零。
biXPelsPerM 指定目标设备的水平分辨率,单位是每米的象素个数。
biYPelsPerM 指定目标设备的垂直分辨率,单位同上。
指定本图象实际用到的颜色数,如果该值为零,则用到的颜色数为2biBitCount。
指定本图象中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的。
} BITMAPINFOHEADER;
RGBQUAD 的结构
typedef struct tagRGBQUAD
该颜色的蓝色分量
该颜色的绿色分量
该颜色的红色分量
} RGBQUAD;
下面是一幅具体的Bitmap图像的存储数据
一般来说,.bMP文件的数据从下到上,从左到右的。也就是说,从文件中最先读到的是图象最下面一行的左边第一个象素,然后是左边第二个象素……接下来是倒数第二行左边第一个象素,左边第二个象素……依次类推,最后得到的是最上面一行的最右一个象素。要注意的一点是在BMP位图中,位图的每行像素值要填充到一个四字节边界,即位图每行所占的存储长度为四字节的倍数,不足时将多余位用0填充。
[GoLang学习小结]Go语言中的Slice
[GoLang学习总结]Go语言中的Slice概念
Slice切片是对底层数组Array的封装,在内存中的存储本质就是数组,体现为连续的内存块,Go语言中的数组定义之后,长度就已经固定了,在使用过程中并不能改变其长度,而Slice就可以看做一个长度可变的数组进行使用,最为关键的,是数组在使用的过程中都是值传递,将一个数组赋值给一个新变量或作为方法参数传递时,是将源数组在内存中完全复制了一份,而不是引用源数组在内存中的地址,为了满足内存空间的复用和数组元素的值的一致性的应用需求,Slice出现了,每个Slice都是都源数组在内存中的地址的一个引用,源数组可以衍生出多个Slice,Slice也可以继续衍生Slice,而内存中,始终只有源数组,当然,也有例外,后边再说。
1.Slice的定义
Slice可以通过两种方式定义,一种是从源数组中衍生,一种是通过make函数定义,本质上来说都一样,都是在内存中通过数组的初始化的方式开辟一块内存,将其划分为若干个小块用来存储数组元素,然后Slice就去引用整个或者局部数组元素。
从数组中切片构建Slice:
a := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
s := a[2:8]
fmt.Println(s) //输出:[3 4 5 6 7 8]
定义一个数组a,截取下标为2到8之间部分(包括2不包括8),构建一个Slice。
通过make函数定义:
s := make([]int, 10, 20)
fmt.Println(s) //输出:[0 0 0 0 0 0 0 0 0 0]make函数第一个参数表示构建的数组的类型,第二个参数为数组的长度,第三个参数可选,是slice的容量,默认为第二个参数值。
2.Slice的长度和容量
Slice有两个比较混淆的概念,就是长度和容量,何谓长度?这个长度跟数组的长度是一个概念,即在内存中进行了初始化实际存在的元素的个数。何谓容量?如果通过make函数创建Slice的时候指定了容量参数,那内存管理器会根据指定的容量的值先划分一块内存空间,然后才在其中存放有数组元素,多余部分处于空闲状态,在Slice上追加元素的时候,首先会放到这块空闲的内存中,如果添加的参数个数超过了容量值,内存管理器会重新划分一块容量值为原容量值*2大小的内存空间,依次类推。这个机制的好处在能够提升运算性能,因为内存的重新划分会降低性能。
a := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
s := a[0:]
s = append(s, 11, 22, 33)
sa := a[2:7]
sb := sa[3:5]
fmt.Println(a, len(a), cap(a))
//输出:[1 2 3 4 5 6 7 8 9 0] 10 10
fmt.Println(s, len(s), cap(s))
//输出:[1 2 3 4 5 6 7 8 9 0 11 22 33] 13 20
fmt.Println(sa, len(sa), cap(sa)) //输出:[3 4 5 6 7] 5 8
fmt.Println(sb, len(sb), cap(sb)) //输出:[6 7] 2 5
可以看出,数组的len和cap是永远相等的,并且是在定义的时候就已经指定的,不能改变。切片s引用这个数组的全部元素,初始长度和容量都为10,继续追加3个元素后,其长度变为13容量为20,。切片sa截取下标2到7的数组片段,长度为5,容量为8,这个容量的改变规则为原容量值减掉起始下标,此时若追加元素,会覆盖掉原内存地址中存在的值。切片sb截取切片sa下标3到5的数组片段,注意,这里的下标指的是sa的下标,不是源数组的下标,长度为2,容量为8-3=5。
3.Slice是引用类型
上边已经提到过,Slice是对源数组的一个引用,改变Slice中的元素的值,实质上就是改变源数组的元素的值。
a := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
sa := a[2:7]
sa = append(sa, 100)
sb := sa[3:8]
sb[0] = 99
fmt.Println(a)
//输出:[1 2 3 4 5 99 7 100 9 0]
fmt.Println(sa) //输出:[3 4 5 99 7 100]
fmt.Println(sb) //输出:[99 7 100 9 0]可以看到,不管是append操作,还是赋值操作,都影响了源数组或者其他引用同一数组的Slice的元素。Slice进行数组引用的时候,其实是将指针指向了内存中具体元素的地址,如数组的内存地址,事实上是数组中第一个元素的内存地址,Slice也是如此。
a := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
sa := a[2:7]
sb := sa[3:8]
fmt.Printf("%p\n", sa)
//输出:0xc
fmt.Println(&a[2], &sa[0])
//输出:0xcxc
fmt.Printf("%p\n", sb)
//输出:0xc
fmt.Println(&a[5], &sb[0])
//输出:0xc 0xc
4.Slice引用传递发生“意外”
上边我们一直在说,Slice是引用类型,指向的都是内存中的同一块内存,不过在实际应用中,有的时候却会发生“意外”,这种情况只有在像切片append元素的时候出现,Slice的处理机制是这样的,当Slice的容量还有空闲的时候,append进来的元素会直接使用空闲的容量空间,但是一旦append进来的元素个数超过了原来指定容量值的时候,内存管理器就是重新开辟一个更大的内存空间,用于存储多出来的元素,并且会将原来的元素复制一份,放到这块新开辟的内存空间。
a := []int{1, 2, 3, 4}
sa := a[1:3]
fmt.Printf("%p\n", sa) //输出:0xc
sa = append(sa, 11, 22, 33)
fmt.Printf("%p\n", sa) //输出:0xc
可以看到执行了append操作后,内存地址发生了变化,说明已经不是引用传递。
如果您想提高自己的技术水平,欢迎加入本站官方1号QQ群:&&,&&2号QQ群:,在群里结识技术精英和交流技术^_^
本站联系邮箱:1986人阅读
是 PacKage 的缩写,即
安装包。将
文件直接传到
手机中执行即可安装。
文件其实是
格式,但后缀名被修改为
上可以通过 W
等程序直接解压查看。
&&&& APK解压后,一般的可看到的目录结构如下:
文件或目录
也就是一个 manifest ,从 java jar 文件引入的描述包信息的目录
资源文件目录
如果存在的话,存放的是 ndk 编出来的 so 库
AndroidManifest.xml
程序全局配置文件
classes.dex
&&dalvik 字节码&
resources.ars
编译后的二进制资源文件
&&&&& 资源文件比较重要的如下, sdk 文档 ( 中文指南 ) 上有相关的详细介绍:
目录 Directory
资源类型 Resource Types
Define pre-determined animations.
Tween animations are saved in res/anim/ and accessed from the R.anim class.
Frame animations are saved in res/drawable/ and accessed from the R.drawable class.
定义的是预置的动画对象。一般是逐帧动画 (Frame animations) 或补间动画( Tween animations )。而实际使用上,都是一些淡入淡出、缩放和移动等的补间动画居多。
Define a color resources that changes based on the View state.
Saved in res/color/ and accessed from the R.color class
定义一些 android view 状态变化时,使用的颜色值。这通常是绑定到一个界面元素上的,比如一个 button 被按下,弹起或 disable 时的颜色。
res/drawable/
res/drawable-hdpi
res/drawable-land-hdpi
res/drawable/mdpi
res/drawable/ldpi
res/drawable/port
Define various graphics with bitmaps or XML.
Saved in res/drawable/ and accessed from the R.drawable class.
定义要被用到的位图资源文件。这些位图资源可以是 bitmap ,也可以是用 xml 描述的 bitmap 。
注意:文件后缀为 9.png 是一种特殊的位图,一般是通过 draw9patch 生成的,是一种可自动伸缩的位图资源。
Drawable 的其他目录形势, land 是横屏的, port 是竖屏的; hdpi 是高分辨率的, ldpi 是低分辨率的, hdpi 是高分辨率的。这里可以放置为特定情况下的界面优化资源。
res/layout/
Define the layout for your application UI.
Saved in res/layout/ and accessed from the R.layout class.
定义的 UI layout ,被 aapt parser 后,可由 android 直接 render 成 view 界面。
这里也有横竖屏和 dpi 之分。
res/values/
可以被编译成很多种类型的资源的 XML 文件。
注意 : 不像其他的 res/ 文件夹,它可以保存任意数量的文件,这些文件保存了要创建资源的描述,而不是资源本身。 XML 元素类型控制这些资源应该放在 R 类的什么地方。
尽管这个文件夹里的文件可以任意命名,不过下面使一些比较典型的文件(文件命名的惯例是将元素类型包含在该名称之中):
&&&&& array.xml 定义数组
&&&& colors.xml 定义 和 。使用 Resource.getDrawable() 和 Resources.getColor() 分别获得这些资源。
&&&& dimens.xml 定义 。使用 Resources.getDimension() 获得这些资源。
&&&&& strings.xml 定义 值。使用 Resources.getString() 或者 Resources.getText() 获取这些资源。 getText() 会保留在 UI 字符串上应用的丰富的文本样式。
&&&&& styles.xml 定义 对象。
多国语言,由 values-xxx 的后缀组成。比如简体中文 :res/values-zh-rCN
任意的 XML 文件,在运行时可以通过调用 读取。
直接复制到设备中的任意文件。它们无需编译,添加到你的应用程序编译产生的压缩文件中。要使用这些资源,可以调用 ,参数是资源的 ID ,即 R.raw.somefilename 。
应用程序的生成过程,输入就是
或源码中的工程及其下面的源文件;输出就是处理后的
文件。整个过程可以如下图所示:
第一步:资源打包的工作,就是 aapt 这个工具完成的。
1.& 在最后打包的 apk 中,所有的 xml 文件已经不是原来的文本文件了,是被 aapt parser 后,直接保存下来的 xml 数据结构,这样做的好处:到手机中无需再次 parser xml 文件,直接读到定义好的数据结构中就可以了。
2. drawable 中的 png 图片也被 aapt 给优化过了。
3. 所有的资源文件都被自动生成一个索引,并生成到 R.java 中。为什么这么做?我想一个是效率,另一个好处就是最大限度的在编译过程中由编译器给你找错 ( 通过 string 来索引很难做到 ) 。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:330849次
积分:4264
积分:4264
排名:第2224名
原创:109篇
转载:157篇
评论:87条
(2)(7)(7)(2)(2)(13)(8)(3)(2)(2)(11)(2)(3)(3)(14)(7)(7)(11)(1)(6)(9)(19)(14)(3)(7)(10)(3)(4)(7)(6)(14)(13)(4)(4)(22)(3)(6)(6)4033人阅读
APK工具的使用
工欲善其事必先利其器。我们先来介绍一下编译AKP文件的工具APKtool。Apktool是一个反编译和回编译apk文件的工具,有了它我们就可以打造自己的apk文件。
首先我们可以用winrar打开apk文件,看似好像是一个普通的压缩包,但实际上远非这么简单。WINRAR解压文件后,查看图片似乎没有什么问题,但当你查看xml文件的时候就会发现—“乱码”。
apk是经过程序编译后的文件,不能单纯解压后进行修改。当然主要针对classes.dex、resources.arsc ,RES目录下的图片等资源文件一般可不用反编译直接替换。
要想修改APK文件,我们首先要进行反编译。进行反编译工作前,我们先来构筑JAVA运行环境。
一,构筑运行环境
运行APKtool,首先要下载JAVA SDK 1.6,安装后设置环境变量,
Windows XP:右键点击“我的电脑”,点击“属性”,选择“高级”选项卡,点击“环境变量”
Windows 7:右键点击“我的电脑”,点击“高级系统设置”,点击最下面的“环境变量”
在系统变量下
变量名JAVA_HOME
变量值C:\Program Files\Java\jdk1.6 此处路径是按照你的JAVA安装目录为准。
变量名CLASSPATH
变量值 .;%JAVA_HOME%\jre\lib\rt.%JAVA_HOME%\lib\tools.%JAVA_HOME%\lib\dt.jar 注意前边的点别丢了。
编辑PATH变量
在PATH变量后面添加 ;%JAVA_HOME%\bin& 分号是为了与前边已有项隔开
然后点击开始菜单,点击“运行”,输入CMD,出现DOS窗口
输入java和javac,如果显示参数提示,环境设置就OK了。
二,反编译和回编译
我们来看apktool,完整的apktool包括3个文件,aapt.exe ;apktool.bat;apktool.jar
可将这3个文件放入c:\windows目录下方便调用。
可在C盘下建立APK文件夹方便操作,把需要修改的apk文件和系统框架framework-res.apk一起放入,如有副框架也需放入(如不清楚可把system/framework下所有apk放入)。
运行中输入cmd打开DOS窗口,输入命令进入新建apk文件夹
1.安装框架
apktool if framework-res.apk
完成后显示 I: Framework installed to: C:\Documents and Settings\Administrator\apktool\framework\1.apk
apktool已经包含了标准框架,大多数APK解包时不需要安装框架,但某些制造商(如三星、HTC)使用了自己的框架文件,如果要修改手机system/app下系统文件必须加载框架,否则回编译会出错。框架文件framework-res.apk在手机system/framework/下,应加载此文件夹下所有apk文件(一般1到2个)。华为U8825D也有副框架不过一般没用。副框架加载一般会生成名为2.apk的文件。
下面以修改systemui.apk为例
2.反编译命令
Apktool d systemui.apk
会在当前目录下生成systemui目录,反编译后的文件就在这里。目录名称可自定,
如Apktool d systemui.apk 123&&&&& 123为生成目录
3.回编译命令
Apktool b systemui 456.apk
回编译systemui目录,然后生成456.apk文件,名称自定。
此时已生成456.apk为编译后文件,用winrar打开后发现与原文件比较缺少META-INF目录,此目录包含apk签名文件,没有被签名的程序,系统将不能安装。只有相同签名的程序,才能替换升级。
为了不破坏签名文件,我们用winrar打开原apk和修改后的apk(不要解压出来),将resources.arsc 文件拖回原apk窗口覆盖源文件,压缩模式选择储存。将classes.dex也拖回覆盖,压缩模式选择标准。如果修改了图片等资源文件可将res文件夹拖回覆盖,关闭winrar完成对APK的修改。
补充:一般res目录可删掉然后把处理后的res目录选择储存模式拖回原apk,但其中的.9.png格式比较特殊,会由aapt进行编译,不可随意替换。另外反编译后也不要替换“AndroidManifest.xml”
否则容易出错。
附:为什么要签名?
每个应用都有一个唯一合法的ID,这就签名,签名可以保证软件升级的一致性,使用相同签名的应用可以覆盖安装,不一致的签名将无法共享使用数据,无法覆盖安装,这样可防止篡改,保护开发者利益。但签名只能保证检测到修改,并不能阻止你修改。
三,zipalign优化
使用zipalign优化你的APK文件,可以减少运行内存RAM的占用。
如果你下载过Android SDK Tools,此文件位于android-sdk-windows\tools目录下
命令格式
zipalign.exe -v 4 你的apk文件
参数v:详细输出。 参数4:对齐为4字节。
zipalign能够确保apk文件中未压缩的数据在4个字节边界上对齐,这样android系统就在读取资源上获得较高的性能,从而减少RAM占用,但文件大小一般会有所增加。
如果对APK进行签名,那么在签名后才可进行zipalign优化。
四,版本选择及工具下载
网上有不少集成的工具,可反编、回编、签名、优化,相当方便。但掌握命令行模式将会让我们打好基础,出错也比较好找原因。编译framework-res.apk框架尤其推荐命令行模式。
如使用集成的工具,可自行将aapt.exe和apktool.jar替换为最新版,一般没有问题。提示:系统apk无需自己签名,用winrar替换回去可保留原文件签名,属于只认签名不认人的类型。
反编译也不是一定保证成功,华为自带的框架和系统文件就有点问题,可到找修改好能运行的拿来修改,当然修改过的出问题的几率也大。推荐用BCompare等比较工具比较文件差异,这工具相当方便。
网上有很多apktool的版本,当初找的我头晕眼花,也没人说下原来这货是有官网的,X,最新版是1.5,网上流传多是1.43。
Apktool---&
aapt.exe和 zipalign.exe是Android SDK tools自带,可自行更新官方版,也可于XDA论坛下载作者修改版。(修改版个头几乎是原版10倍)
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:46772次
排名:第19276名
原创:44篇
转载:15篇
评论:27条
(1)(1)(1)(1)(1)(1)(5)(4)(14)(14)(3)(1)(1)(6)(5)

我要回帖

更多关于 systemui.apk是什么 的文章

 

随机推荐