Android-用apktool工具进行拆包、重打包

准备工作:

一、拆包。(Mac环境)

1.下载apktool,我用的是apktool_2.1.1.jar。
2.需要拆包的apk。
用到的命令:
解包:
java -jar apktool_2.1.1.jar d app-test.apk
打包:
java -jar apktool_2.1.1.jar b app-test/
签名:
jarsigner -verbose -keystore moonlighting.jks(证书) -storepass [密钥] -keypass [密钥] -signedjar Thinkdrive_signed.apk(签名完后的apk) app-test/dist/app-debug.apk(上一步中产生的apk) moonlighting(证书名)

操作步骤:

1.打开Terminal,进入apktool的工作路径:


image

执行命令:java -jar apktool_2.1.1.jar d app-test.apk


image

操作成功后会产生一个与apk文件名相同的一个文件夹,结构如下:
image

二、修改。

从上图文件结构可以看到。所有的xml文件都是可以在这里找到的,资源文件在名为res的文件下,而且没有变化。而之前的java代码在这里变成了.smali文件在名为smali的文件夹中。
1.(简单修改)因为资源文件没有变化,可以直接修改,比如修改一些字符串的对应值,样式、颜色等。布局文件也没有变化,可以直接对布局中的控件的位置、长宽、背景颜色等直接做修改。
2.(加入新的页面)举个例子,我现在要在当前程序再加一个前导页:

2.1.首先创建一个工程,工程只包含一个Activity,为了排除干扰,我将Test目录删除,去除工程其他的依赖包:

image

LauncherActivity.xml:

package com.mrtian.project.launcherapplication;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class LauncherActivity extends Activity {
private TextView textView;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_launcher);
textView = (TextView) findViewById(R.id.zz_tv_main);
button = (Button) findViewById(R.id.zz_btn_start);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
textView.setText("start!!!");
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Intent intent = new Intent("com.parttime.happytime.start");
startActivity(intent);
}
},6000);
}
});
}
}

activity_launcher.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.mrtian.project.launcherapplication.LauncherActivity">
<TextView
android:id="@+id/zz_tv_main"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
<Button
android:id="@+id/zz_btn_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击进入"/>
</LinearLayout>

将前导页工程编译产生apk,用一种同样的方法解包:


image

将程序的入口改成新加入的Activity,将原来的入口添加action为com.zhuanfa.money.lanch,方便我们的隐式调用。

image

工程中引用的资源都需要在这边添加(res),res/layout中的activity_launcher.xml布局加入,

还有一个比较重要的地方,就是添加的控件id必须在res/values文件下的ids.xml和public.xml中添加(布局只需要在public.xml添加id,而控件ids.xml和public.xml都需要添加):

ids.xml:


image

public.xml:
值得一说的是public.xml内部的id值是16进制数编号,我们只需要在对应的type最后按顺序添加就可以了。


image
image

将前导页工程smali下的文件添加到本工程的com包下(AndroidManifest.xml注册组件时对应包名):

image

因为smali文件都是之前产生的,合并到本工程时id需要改为现在修改的id:
在目录里面找到LauncherActivity.smali文件并打开,
所有资源的id对需要改为刚才我们在public.xml中给资源添加的id值:
布局:


image

控件:


image
image

如果需要const/high16这样的声明,指的是对这个id值舍入,修改id值时将其改成const就行了,否则之后打包会报错

三、重新打包并签名(不签名不能安装)。

经过上面的步骤,我们的工程算是合并完了,打开终端,输入命令:
java -jar apktool_2.1.1.jar b app-test/
成功执行后会在app-test/dist目录下产生一个apk
在对该apk进行签名操作:
jarsigner -verbose -keystore moonlighting.jks(证书) -storepass [密钥] -keypass [密钥] -signedjar Thinkdrive_signed.apk(签名完后的apk) app-test/dist/app-debug.apk(上一步中产生的apk) moonlighting(证书名)

这样两个工程就巧妙的合并了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,482评论 25 707
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,397评论 2 45
  • 之前一直想看《肖申克的救赎》,可是一直没有机会。偶然看到,我只能说经典就是经典,无法超越。 ...
    木子小妞阅读 283评论 0 1
  • 文章内容来自李笑来的公众号「学习学习再学习」的理财相关的文章。想要查看原文,只需要关注公众号,然后输入理财就可以了...
    现实目标决心阅读 303评论 0 3
  • 认识一个朋友,开始交往时,为他的会来事折服。特别是在一些熟人场合,他说的话恰到好处,往往把气氛调的非常的热闹。 后...
    王子和白龙马阅读 265评论 1 0