编译源码out下面(/mydroid/out/target/product/generic/symbols/system/bin)的dexopt-wrapper拷到手机
adb push ./dexopt-wrapper /data/local
adb shell
cd /data/local
./dexopt-wrapper sim.apk sim.odex
补充:
1:dexopt-wrapper 是生成odex的工具,我是repo下载android 2.1源码,然后编译后得到的
2:mydroid是放源码的目录,编译成功后就会有以上路径了
3:odex的作用是优化后的dex 文件,可以提高加载速度,但具体多少没有测试,我原来只是想修改android联系人源码(改改他的中文排序和查找功能),
发现很多系统程序有个odex文件,所以才找这个生成odex的方法,但有个缺点,生成的odex文件比较大,可能是没压缩的原故
4:adb push 把dexopt-wrapper文件拷贝到/data/local
5:adb shell 是从电脑进入android linux shell 状态,最后两行是linux 命令
点击“充值”打开“阳光卡充值”对话框,在对话框中输入充值金额,然后点击“确定”,显示“请等待”进度条。
在显示进度条的后面,创建一个线程来处理请求,当处理完毕时,不显示进度条,同时显示Toast提示充值成功。
在新建的线程里要调整UI的显示,必须通过发送请求给Handler实现。
private void credit() { LayoutInflater factory = LayoutInflater.from(this); // 得到自定义对话框 final View DialogView = factory.inflate(R.layout.ebcredit, null); // 创建对话框 AlertDialog creditDialog = new AlertDialog.Builder(this) .setTitle("阳光卡充值").setView(DialogView)// 设置自定义对话框的样式 .setPositiveButton("确定", // 设置"确定"按钮 new DialogInterface.OnClickListener(){ // 设置事件监听 public void onClick(DialogInterface dialog, int whichButton) { //final String amount = mEditTextCredit.getText().toString(); // 输入完成后,点击“确定”开始充值 mProgressDialog = ProgressDialog.show( EBActivity.this, "请等待...", "正在充值...", true); new Thread() { public void run() { try { sleep(3000); } catch (Exception e) { Log.e(LOG_TAG, "阳光卡充值出错", e); } finally { // 充值结束,取消mProgressDialog对话框 mProgressDialog.dismiss(); Message msg = new Message(); msg.what = WHAT_CREDIT; try{ Bundle data = new Bundle(); //data.putString("amount", amount); msg.setData(data); handler.sendMessage(msg); }catch(Exception ex){ Log.e(LOG_TAG, "充值出现问题", ex); } } } }.start(); } }).setNegativeButton("取消", // 设置“取消”按钮 new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { // 什么都不做,点击时对话框就会关闭 } }).create();// 创建 creditDialog.show(); }
private final Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { Bundle data = msg.getData(); if(msg.what==WHAT_CREDIT){ //mBalance.setText("200.50"); try{ double curBalance = Integer.parseInt(mBalance.getText().toString()); double amount = Double.parseDouble(data.getString("amount")); double balance = curBalance + amount; mBalance.setText(String.valueOf(balance)); DisplayToast("充值成功"); }catch(Exception ex){ Log.e(LOG_TAG, "充值出现错误", ex); } } } };
public void DisplayToast(String str) { Toast.makeText(this, str, Toast.LENGTH_SHORT).show(); }
ARM处理器使用流水线来增加处理器指令流的速度,这样可使几个操作同时进行,并使处理与存储器系统之间的操作更加流畅,连续,能提供0.9MIPS/MHZ的指令执行速度
PC代表程序计数器,流水线使用三个阶段,因此指令分为三个阶段执行:1、取指(从存储器装载一条指令);2、译码(识别将要被执行的指令,得到下一指令占据数据路径,寄存器被读取,操作数在桶式移位器中被以为。ALU产生相应的运算结果并写回到目的寄存器中,ALU结果根据指令需求更改状态寄存器的条件位)。而R15(PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指令。一般来说,人们习惯性约定将“正在执行的指令作为参考点”,称之为当前指令第一条指令,因此PC总是指向第三条指令。当ARM状态时,每条指令4字节长,所以PC始终指向该指令地址加8字节的地址,即:PC值=当前程序执行位置+8;详细分解:
第一周期对第一指令进行取指操作。
第二周期对第一指令进行译码,同时对第二指令进行取指操作。
第三周期对第一指令进行执行,第二指令进行译码,并同时对第三条指令执行操作
地址 指令
0x3000 A
0x3004 B
0x3008 C
0x300c D
(1)SWI和未定义指令异常
此时正在执行指令A(此时PC=0x3008)的同时在译码阶段发生SWI或未定义指令异常,等指令A执行完后(此时PC还没有发生改变PC=0x3008)进行SWI或未定义指令粗合理,同时把当前PC值赋给寄存器LR(LR=0x3008)然后再进行自动调整LR=LR-0x04(此时LR=0x3004),这样当异常返回时就到地址为0x3004的指令处执行。所以再进入异常的时候LR不需要修改
(2)IRQ和FIQ异常
此时正在执行指令A(此时PC=0x3008)的同时发生IRQ和FIQ异常,等指令A执行完后(此时PC发生改变PC=0x300c)进行IRQ和FIQ异常响应,同时把当前PC值赋给寄存器LR(LR=0x300c)然后再进行自动调整LR=LR-0x04(此时LR=0x3008),这样当异常返回时就到地址为0x3008的指令C处执行(可以看出跳过了执行指令B),所以当进入异常的时候要执行“SUB LR,LR,#4”(此时LR=0x3004),当异常返回时就到地址为0x3004的指令B处执行。
(3)预取指令中止
此时正在执行指令A(此时PC=0x3008)发生预取指令中止异常,(此时PC没有发生改变PC=0x3008)进入预取指令中止异常响应,同时把当前PC值赋给寄存器LR(LR=0x3008)然后再进行自动调整LR=LR-0x04(此时LR=0x3004),这样当异常返回时就到地址为0x3004的指令B处执行,但是当发生指令预取中止异常时,程序要返回到该有问题的指令处,重新读取并执行该指令。异常指令预取中止异常中断程序应该返回到产生该指令预取中止异常中断的指令处。所以当进入异常的时候要执行“SUB LR,LR,#4”(此时LR=0x3000),当异常返回时就到地址为0x3000的指令A处重新执行
(4)数据中止异常
此时正在执行指令A(此时PC=0x3008)的同时发生数据中止异常,等指令A执行完后进入下一条指令时(此时PC发生改变PC=0x300c)发生数据中止异常响应,同时把当前PC值赋给寄存器LR(LR=0x300c)然后再进行自动调整LR=LR-0x04(此时LR=0x3008),这样当异常返回时就到地址为0x3008的指令c处执行,但是发生数据访问中止异常中断时,程序要返回到该有问题的数据访问处,重新访问该数据。因此数据访问中止异常中断程序应该返回到产生该数据访问中止异常中断的指令处所以当进入异常的时候要执行“SUB LR,LR,#8”(此时LR=0x3000),当异常返回时就到地址为0x3000的指令A处重新执行
异常或入口
返回指令
之前的状态
ARM R14_x Thumb R14_x
备注
BL
MOV PC,R14
PC+4
PC+2
此处PC 为BL, SWI, 未定义的指令取指或者预取中止指令的地址。
SWI
MOVS PC,R14_svc
PC+4
PC+2
未定义的指令
MOVS PC,R14_und
PC+4
PC+2
预取中止
SUBS PC,R14_abt,#4
PC+4
PC+4
快中断
SUBS PC,R14_fiq,#4
PC+4
PC+4
此处PC 为由于FIQ 或IRQ 占先而没有被执行的指令的地址
中断
SUBS PC,R14_irq,#4
PC+4
PC+4
数据中止
SUBS PC,R14_abt,#8
PC+8
PC+8
此处PC 为产生数据中止的装载或保存指令的地址。
复位
无
-
-
复位时保存在R14_svc 中的值不可预知。