前言
老夫也开始进行博客之旅了,2016年新的一年新的开始,之前想过各种做笔记的方式,网盘、写demo,感觉还是博客更加的实用,既能记录学习脚步,也能共享学习成果。
之前为了使用公司的业务需求,使用的友盟的平台管理及渠道管理,后来为了更好的做推广和地推,弄了一个调整渠道的方式,但是很麻烦,也有很大的局限性,在这里就不多做阐述了。
读了郭霖郭大师的博客,加上自己的实践,又了自己一些新的想法。
写一个简单的DEMO,一个按钮,点击谈一个test123的Toast,就不贴代码了,没什么技术含量。
反编译
apktool ,下载好apktool.jar和apktool.bat或者去官网去下载,下载玩之后本地最好新建一个专门的目录(我个人是在D:\apktool),将其拷贝进去。
将个人待反编译的APK也拷贝至该目录
在cmd下进入该目录
执行反编译指令
apktool d zxcv.apk,如出现错误,请参考郭大师的博客
展开文件,目录如下
其中,original文件夹下存放的是未经反编译过、原始的AndroidManifest.xml文件,res文件夹下存放的是反编译出来的所有资源,smali文件夹下存放的是反编译出来的所有代码,AndroidManifest.xml则是经过反编译还原后的manifest文件。这里值得一提的是smali文件夹,如果你进入到这个文件夹中你会发现它的目录结构和我们源码中src的目录结构是几乎一样的,主要的区别就是所有的java文件都变成了smali文件。smali文件其实也是真正的源代码,只不过它的语法和java完全不同,它有点类似于汇编的语法,是Android虚拟机所使用的寄存器语言。具体结构如下:.class Lcom/lpf/demo/MainActivity$1; .super Ljava/lang/Object; .source "MainActivity.java" # interfaces .implements Landroid/view/View$OnClickListener; # annotations .annotation system Ldalvik/annotation/EnclosingMethod; value = Lcom/lpf/demo/MainActivity;->onCreate(Landroid/os/Bundle;)V .end annotation .annotation system Ldalvik/annotation/InnerClass; accessFlags = 0x0 name = null .end annotation # instance fields .field final synthetic this$0:Lcom/lpf/demo/MainActivity; # direct methods .method constructor <init>(Lcom/lpf/demo/MainActivity;)V .locals 0 .prologue .line 1 iput-object p1, p0, Lcom/lpf/demo/MainActivity$1;->this$0:Lcom/lpf/demo/MainActivity; .line 18 invoke-direct {p0}, Ljava/lang/Object;-><init>()V return-void .end method # virtual methods .method public onClick(Landroid/view/View;)V .locals 3 .param p1, "v" # Landroid/view/View; .prologue .line 23 iget-object v0, p0, Lcom/lpf/demo/MainActivity$1;->this$0:Lcom/lpf/demo/MainActivity; const-string v1, "test123" const/4 v2, 0x1 invoke-static {v0, v1, v2}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast; move-result-object v0 .line 24 invoke-virtual {v0}, Landroid/widget/Toast;->show()V .line 25 return-void .end method
修改、调整
- 简单对代码做一些个修改
以上代码中“test123”为一个Toast,我们将这个Toast的内容修改为“test321”,然后保存。同时将res文件下测试应用的主图标(ic_launcher.png)全部更换为另外一张图片。
打包
将调整好的代码打包成一个APK
在cmd下执行:apktool b zxcv -o zxcv123.apk(其中b是build的意思,表示我们要将zxcv文件夹打包成APK文件,-o用于指定新生成的APK文件名,这里新的文件叫作zxcv123.apk。),如下图:
见到上图说明已经打包成功了,我们再查看目录,会发现多了一个zxcv123.apk。
到这里就完了?NO!NO!NO!
这里得到的zxcv123.apk是没有办法使用的,因为还没有对这个apk进行签名。那么下面来详细的讲讲如何进行签名。
签名
签名对每一个做app开发的码畜来说,应该是不陌生的,那么就不对理论进行说明了,咱来实际的,怎么做?
生成签名文件
通常我们使用的keystore文件都是使用工具去生成的,下面我开说一下如何使用keytool.exe去生成一个新的签名文件。安装jdk
作为一个java、android的码畜,jdk及环境变量就不做重复了在cmd下进入jdk的bin目录
执行:keytool -genkey -alias abc.keystore -keyalg RSA -validity 20000 -keystore abc.keystore
解析:keytool -genkey -alias 要生成的文件名称 -keyalg RSA -validity 有效时间 -keystore 文件名称(和前面的名称最好保持一致),更过详细的说明,请点击传送门执行为出现如下效果:
创建成功会在bin目录下生成一个test.keystore文件
签名APK
为了将少错误的概率,我们将上面打包那一步生成的zxcv123.apk文件拷贝只jdk的bin补录下。
执行:jarsigner -verbose -keystore test.keystore -signedjar zxcv_.apk zxcv123.apk test.keystore
解析:jarsigner -verbose -keystore 签名文件名称 -signedjar 签名后的apk名称 要签名的APK的名称 签名文件名称执行会出现如下效果:
到这里,那么可以阿弥陀佛了,新的包已经签名完成,一个完整的、修改过后的apk就此诞生了。
到这里,我们可能会突然发现,哦….!原来,曾经的汉化是这么来的、曾经的游戏bug版是出现的。但是我们作为一个有素质、有教养、有良知的码畜,坏事我们是不要干滴!
好!到此,人生的第一篇博客算是完了。磨蹭了几个小时,总算是有了一些结果,但愿是一个好的开始。