2024年安卓最新全面认识Android手机(MIUI ROM适配之旅第三天——反编译)(1),安卓面试必问

结尾

最后小编想说:不论以后选择什么方向发展,目前重要的是把Android方面的技术学好,毕竟其实对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。

高级UI,自定义View

UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。

不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

这条命令运行完后,在当前目录下会生成一个名为HelloActivity的目录。

该目录的结构为(名称后跟/表示这是一个目录):

HelloActivity/

|--------------AndroidManifest.xml

|--------------apktool.yml

|--------------res/

|--------------smali/

apktool.yml是apktool生成的一个配置文件,基本上你不需要修改这个文件。下面的章节我们逐个介绍剩下的AndroidManifest.xml文件和res, smali目录。

2. AndroidManifest.xml

要想完全理解这个文件,你得对Android的内部运作机制非常清楚。幸好我们修改一个APK的时候基本上不改这个文件。这里帮助你有个大致的了解。

Android安装程序一般叫apk文件(apk是Android Package的缩写,表示Android安装包)。一般来说,程序都会有一个或多个Activity, Activity是什么呢,从概念说它是一个和用户交互的窗口,你每天使用Android手机的时候基本上你打交道的每个界面都是一个Activity。AndroidManifest.xml是一个xml格式的清单文件,就像你去超市买东西会打印出一个购物清单,AndroidManifest.xml也起着一个清单的作用,它告诉系统,我有这些Activity。(实际情况远比这复杂,想学Android编程的同学请看这个 http://developer.android.com/guide/index.html,好好学习其中的内容)。

具体到HelloActivity下的AndroidManifest.xml文件,大家可以找到如下内容:

<application

android:label=“@string/app_name” android:icon=“@drawable/ic_launcher_hello”>

其中有一行,包含这一行的Activity会显示在桌面中,就是说你可以通过桌面显示的图标启动这个Activity。里面还有android:label=“@string/app_name” android:icon=“@drawable/ic_launcher_hello”。这两个属性是做什么的呢,android:label表示程序显示在桌面上的名字,android:icon表示程序显示在桌面上的图标。如果想要改显示的名字和图标,修改其后的两个资源,如何修改资源,下一节详细介绍。

3. 资源

res目录下放置了程序所需要的所有资源。资源是什么呢,一般来说,一个图形用户界面(GUI)程序总是会使用一些图片,或者显示的文字的大小和颜色等。或者界面的布局,比如显示的界面上面是文字,下面是两个按钮等等。这些程序的一个重要特点就是用户界面和代码逻辑的分离。当我们需要替换图片或者简单修改界面布局的时候,不需要改变代码。而Android程序会将这些代码中需要用到的文件都放在res目录下,称之为资源。

可以看到res目录的内容为:

res/

|--------drawable-hdpi/

|-----------ic_launcher_hello.png

|--------layout/

|---------hello_activity.xml

|--------values/

|---------ids.xml

|---------public.xml

|---------strings.xml

对于HelloActivity来说,res目录下有三个子目录drawable-hdpi, layout, values。由于HelloActivity比较简单,因此res下内容不多,但是一个复杂的程序res目录下内容相应的也会比较多,但是基本原理都是一样的。

res下面的子目录基本上是按照资源类型来分类组织的,以drawable开头的表示图片资源,大家可能会看到drawable-hdpi, drawable-mdpi, drawable-ldpi等,这些hdpi,mdpi,lpid分别表示高/中/低分辨率,会根据不同的屏幕分辨率选择不同的图片。要想替换图片,替换这些目录下的图片就可以了。(替换图片比这稍复杂点,一般替换图片,最好保持和原图片兼容,比如说色系,尺寸以及点9图片的一些参数等)。

以layout开头的表示布局文件,用来描述程序的界面。anim子目录存放程序使用到的动画,xml开头的目录存放程序用到的一些xml文件等。

values开头的目录下面存放一些我们称之为基本元素的定义,比如说colors.xml给出颜色值的定义,dimens.xml给出一些大小的定义。strings.xml是一些字符串的定义。我们看看HellloActivity的strings.xml文件。

<?xml version="1.0" encoding="utf-8"?>

Hello, World!

HelloWorld

其中的以<string开头便是这是一个字符串,name是给这个资源起一个名字,后面的字符串表示这个字符串的值。Android的资源大致按这种形式来组织的,先将资源分成几种类型,然后每一种类型的所有资源取一个名字,这个名字对应了这个资源的值/内容。

我们一般修改资源通常情况下是修改图片或者汉化。汉化比较简单,values/strings.xml文件存放程序用到的所有英文字符串值。要汉化,首先在values下建立一个目录values-zh-rCN。然后将values/strings.xml拷贝到该目录中,将每一个字符串翻译成中文。我们现在将strings.xml拷贝到values-zh-rCN目录下,并将文件内容改为:

<?xml version="1.0" encoding="utf-8"?>

你好,世界!

你好世界

现在我们需要把修改后的文件在编回apk文件,运行如下命令:

cracker~$ apktool b HelloActivity HelloActivity.apk

这条命令表示编译HelloActivity目录的内容,输出文件为HelloActivity.apk,如果你不想覆盖原有的文件,可以换一个名字或者放在另外一个目录下。

接下来我们需要对生成的APK进行签名,下载附件中的压缩包sign.zip, 解压后有一个脚本sign.sh。假定你把解压后的文件都放在/home/cracker/tools目录中。运行如下命令:

cracker~$ export KEY_PATH=/home/cracker/tools

cracker~$ /home/cracker/tools/sign.sh HelloActivity.apk

cracker~$ adb install -r HelloActivity.apk.signed.aligned

注意最后一条命令如果失败,如果你不是用我们提供的HelloActivity做实验的话,会发生签名不一致的错误,这个时候先卸载原来的,再安装。运行看看,对的,现在显示在你面前的是“你好,世界!”

汉化成功了,是的,汉化就这么简单。如果你只想停留在汉化或者替换图片这个阶段,从这里开始以后的文章不用看了。如果你没有Android编程基础,从这里开始以后的文章也不用看了。

到底发生了什么魔法,为什么这样替换一下图片或者改字符串就能改变程序最终运行的结果呢,想要理解这个,我们就的大致的了解一下资源的编译过程。首先我们看看values目录下一个有意思的文件publics.xml,它的内容如下:

<?xml version="1.0" encoding="utf-8"?>

每一行的id后面都有一个看起来很奇怪的数字,这个数字是干嘛的呢?Android下有一个资源编译器会编译res目录下的所有文件,它为每一个资源名字分配一个数字标识符,这个标识符分成3个部分,最前面的1个字节表示包名,所有的apk这个字节都是7f。表示这些资源是非共享的,其它APK访问不到。所有那些可以共享的资源放在system/framework/framework-res.apk下。/system/framework往往还有其它共享的资源包。这些共享的资源包前面的1个字节从0x1开始,依次增加。中间的一个字节表示资源的类型,每一个类型的数字标识符是不一样的,最后的2个字节是资源的序号,统一类型的资源序号从0依次往上递增。一般来说,资源id是由资源编译器(aapt)自动产生的,但是定义在publics.xml中的值告诉编译器,你必须为这个id使用这个值。apktool会为所有的资源名称定义这个值在publics.xml里,这样可以保证替换资源后资源的id不会变化。

为啥资源的id这么重要,如果变了,会怎么样呢,这得结合代码理解。我们在Java代码里通常这样引用资源,比如R.string.app_name。这个Java代码经过编译后,这条引用直接变成了资源id,即0x7f040001,所以你在下面反编译后的smali代码里面是看不到R.string.app_name这个东西的,只能看到0x7f040001。资源编译器会生成一个查找表,对于每一个id,查找表中保存了这个id对应的名字和值(如果是文件,则为文件所在路径)。程序在运行的时候,会根据id去查询这个查找表找到对应的资源的值或文件。

最后说一句,资源的ID非常重要,运行adb pull /system/framework/framework-res.apk反编译这个文件,好好的消化一下这一节的内容吧。

4. smali

终于迎来我们最重要的部分了smali目录,smali目录存放的是反编译后的Java代码,文件名以smali结尾,故称作smali文件。这些代码比一般的Java代码可读性差太多了,但是和传统的x86或者其他体系结构下的汇编文件那又是好读多了。虽然有工具可以直接把这些反汇编成java代码,单是好不了太多,我们还是直接读取修改smali文件。从这里我们才真正的开始是一名程序员。

我们来看一下反编译后的smali目录下的HelloActivity.smali文件,和Java组织源代码的方式一样,smali目录下的文件也是按文件包的包名结构组织目录结构的,文件的内容如下:

.class public Lcom/example/android/helloactivity/HelloActivity;

.super Landroid/app/Activity;

.source “HelloActivity.java”

# direct methods

.method public constructor ()V

.locals 0

.prologue

.line 27

最后

分享一份NDK基础开发资料

详解:Linux网络虚拟化技术

分享内容包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

给身边好友一起学习!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值