5. apktool 给XX手机卫士加广告页
一. 编写广告页
写一个广告页面,并调用其他页面的demo
(1) 设计界面如下
(2) 编写代码如下
public class SplashActivity extends Activity {
private static final int MSG_START_MENU = 1;
@SuppressLint("HandlerLeak")
Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case MSG_START_MENU:
Intent intent = new Intent();
intent.setClass(SplashActivity.this, HomeActivity.class);
startActivity(intent);
finish();
break;
default:
break;
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
// 设置字体
Typeface fontFace = Typeface.createFromAsset(getAssets(),
"fonts/handwriting.ttf");
TextView textSplash = (TextView) findViewById(R.id.textSplash);
textSplash.setTypeface(fontFace);
// 延时启动下一个Activity
mHandler.sendEmptyMessageDelayed(MSG_START_MENU, 2000);
}
} 运行效果:
(3). 确定修改点
如果要把这个Splash页面插入到别的Activity中,需要修改哪些地方?
AndroidManifest.xml
资源拷贝(图片,字体)
资源ID
控件ID
调用原逻辑的Activity
Activity中修正
类名称 包名称
资源ID
被调用Activity
字符串
二.反编译自己的APK
1. 解包APK
apktool d test.apk
2. 目录说明
assets 存放字体资源
res 存放图片资源 layout 字符串等资源
smali存放代码
其他文件请参考开发中的目录,基本一一对应
需要注意的是在res/values目录有一个public.xml
该文件由apktool生成, 里面保存了所有的ID选项
如果需要添加资源ID,直接在这里添加,apktool就会帮你编译回去
三.开始修改过程
1.先把目标apk解包
2. 添加字符串
定位到public.xml中加入
<public type="string" name="splash_info" id="0x7f040027" />
定位到string.xml加入
请确保id和名称的值不要和string的其他字符串有重叠
3. 添加字体
目标APK没有assets文件夹,我们直接把我们的assets文件夹拷贝过去
放到根目录即可
4. 添加图片
把图片拷贝到res\drawable文件夹(注意有重名的情况)
我们这次没有重名,如果有请在开始的时候就取一个特殊的名字
修改public.xml文件
<public type="drawable" name="splash" id="0x7f02001c" />
可以看到值和名字选中之后都没有重复的即可
5.添加layout
把layout目录下的activity_splash.xml拷贝到目标layout下面
基本上该Activity有多少控件id 就要在public.xml定义多少
为了方便 我把dimen全部直接替换过来了
修改public.xml如下
<public type="id" name="textSplash" id="0x7f080051" />
同时需要在public.xml加上activity_splash的ID
<public type="layout" name="activity_splash" id="0x7f030023" />
同时需要在ids.xml中加上一项
记录下这2个ID值
textSplash 0x7f080051
activity_splash 0x7f030023
6. 添加代码
把Test\smali\org\bing\test目录下的SplashActivity拷贝过去
mobilesafe\smali\com\mobilesafe
此时我们发现已经存在SplashActivity
2种解决方案
a. 换一个目录拷贝
b. 重命名
我们选择较麻烦的重命名法:
(1). 重命名源文件
源文件:
重命名成: (^ _ ^ 后面加了一个1)
(2). 替换类名
打开我们的SplashActivity1.smali
将org/bing/test/SplashActivity全部替换成com/mobilesafe/SplashActivity1
同样在SplashActivity1$1.smali中
将org/bing/test/SplashActivity全部替换成com/mobilesafe/SplashActivity1
最后修改handleMessage里面HomeActivity为
com/mobilesafe/SplashActivity (目标APP的主Activity)
(3).修改资源ID
找到setContentView 将上面的常量值修改成0x7f030023
找到findViewById将上面的常量值修改成0x7f080051
发现变红了 有smali语法插件就是爽(请百度:sublime配置smali语法插件 用记事本估计又被坑一波)
爆红是因为指令格式的问题, 把
const/high16 修改成 const就好
7.修改AndroidManifest文件
将原来的主Activity 改成我们的Activity
8. 回编译
报错则回顾哪里还没有做到位
然后签名,运行成功
四.总结
基本上开发需要的哪些细节,这里修改就得修改哪些点
实际运用可以考虑把过程写成自动化流程,给定广告模版文件,自动插入相应位置
这样就可以批量插广告 ^ _ ^
例子下载链接
链接:http://pan.baidu.com/s/1i5hlCCd 密码:pc1c