工作,学习,生活,这里将会有一些记录. 备用域名:http://meisw.wdlinux.cn 注册 | 登陆
浏览模式: 标准 | 列表全部文章

Android平板电脑刷机包简单解释

本文将对android刷机包的刷机步骤进行简单的解释,本人用的设备是7寸山寨的flytouchCPU为威盛8505,本次用的固件包为VIA8505的1.7.2,之所以用这个是因为这个固件包的scriptcmd比较完善,在2.0.88scriptcmd被封装到prepare.bin中了,其实效果应该是一样的。

 

在此想先提一下Android的启动方式:1.u-boot启动2.加载linux内核3.linux内核进行系统初始化4.在内核的start_kernel()函数的kernel_init()中设定ramdisk_execute_command = "/init";最终在init_post()函数中调用init程序,而这个init程序就是Android编译好的在根目录下的init程序。明白了这个过程,对于理解刷机的原理就方便多了。

 

下面用红框圈起来的是本刷机包中主要用到的几个文件:

各文件用途:

Android_fs.tgz 整个Android的文件系统,里面文件虽然多,但主要的就是根目录下的文件和System文件夹里的文件,System文件夹里的文件又和Android编译出来的System.img里面的文件类似,所以这里推测,如果修改自己的刷机包,把自己修改好的System文件夹进行一下替换即可,当然要注意驱动的问题。

Ramdisk.gz        应该是linux的根文件系统镜像

Data.tgz            用户数据的部分,里面主要是各种用户程序和安装包,对应编译好的Data.img

uzImage.bin   linux内核镜像

u-boot.bin      u-boot启动文件

wload.bin              不知道

pre_****_disk文件夹 是可用这里面的文件来替代android_fs.tgz data.tgz里面的文件的,因为在后面判断若存在这几个文件夹,会进行相同目录的合并工作,这时肯定要发生替换了。

 

 

常用命令格式:

fatload <interface> <dev[:part]>  <addr(目的地址)> <filename> [bytes] 仅限内存中

cp source target   count

nand write addr off size Nand Flash烧写命令,将SDRAM addr地址处的size 字节的数据烧写到Nand off 偏移地址。

 

Scriptcmd中的文件拷贝地址:

nandrw erase all

1.fatload mmc 0 0 script/wload.binu-boot

erase ffff0000 +10000

cp.b 0 ffff0000 10000

cp source target   count

即将wload.bin拷贝到内存ffff0000的位置,count=10000

2.fatload mmc 0 0 script/u-boot.bin

erase fff80000 +50000

cp.b 0 fff80000 50000    

3.fatload mmc 0 0 script/ramdisk.gz

nand write 0 C00000 $(filesize)

4.fatload mmc 0 0 script/uzImage.bin(这个是linux内核的镜像,u代表是u-boot模式)

nand write 0 0 $(filesize)

5. 设置环境变量:setenv bootargs mem=237M root=/dev/ram rw initrd=0x01000000,32M console=ttyS0,115200n8 init=/linuxrc lcdid=1

fatload mmc 0 1000000 script/mvl5_v5t_ramdisk_WM8505.090922.loop.gz(这个类似linux启动时的initrd文件,mmc代表接口(类似usb)),就是从设备0拷贝,拷到内存地址0x01000000处,不是和以前一样拷到内存地址0处。

6.bootm 0 bootm [addr [arg ...]] addr是地址,arg是传递给内核的参数bootm命令可以引导启动存储在内存中的程序映像。这些内存包括RAM和可以永久保存的Flash。作用是从内存地址0处启动,在上面第四点中把uzImage.bin拷贝在内存地址0处,所以这里bootm 0就是执行uzImage.bin,在bootargs中还设置了initrd,所以刷机时第一次加载时是需要initrd来执行的,这里initrd就是mvl5_v5t_ramdisk_WM8505.090922.loop.gz这个文件,先用gzip解压再挂载,就可以看出它其实就是个临时的linux文件系统。

 

可以看出scriptcmd只负责文件拷贝,文件拷贝完打印"Please wait...",之后就bootm,所以这里出错的可能性很小,有一点是这个刷机包只是支持nand flash的,还有一种是udisk的,所以进行nand write时可能会不行。

 

之后就要执行update.sh文件了

 

Update.sh解释:

常用命令格式:

if [ -f /mnt/mmcblk0p1/script/android_fs.tgz ] ; then

-f 表示判断该文件名是否存在且为文件,-d表示directory,文件夹)

    string="Update filesystem Start ......"

    echo $string

    gui-echo $pointX $pointY "$string" 这里显示字符串要用两个echo

else

    exit 0 退出

fi  : 结束if条件   if反过来写

 

if [ $? -ne 0 ] ; then ……else……: $?是上一个操作的返回值,-nenot equal 的意思,因为linux中返回0代表出错,所以上面的操作就是若不出错,就执行else中的内容。

 

猜测:

/dev/mtdblock9nand flash闪存,因为根文件系统在此处

 

1.       if [ -f /mnt/mmcblk0p1/script/android_fs.tgz ] ; 先判断这个压缩文件是否存在,因为这个文件时超重要的,没有肯定要退出了~~ 这里不知何故sd卡已经自动挂载     到/mnt/mmcblk0p1/了,又是看不见的操作…………,我的猜想是这样的,在scriptcmd中,已经把ramdisk加载到sd卡了,这是个可以运行的linux根文件目录,这里肯定     有/mnt/这个目录的

2.       flash_eraseall /dev/mtd9 不解释

3.       mount -t yaffs2 /dev/mtdblock9 /mnt/mtd    -t只是表示我这次挂载要制定文件类型,文件类型自然为yaffs2了,把/dev/mtdblock9挂载到/mnt/mtd

4.       tar zxvf /mnt/mmcblk0p1/script/android_fs.tgz -C /mnt/mtd 解压到/mnt/mtd上,实际上是解压到/dev/mtdblock9上了,算是耗时最长的一步了。

5.       if [ -d /mnt/mmcblk0p1/script/driver ] ; cp -a /mnt/mmcblk0p1/script/driver/* /mnt/mtd    实际还是把驱动拷到设备里

6.       tar zxvf /mnt/mmcblk0p1/script/busybox_1.16.tgz -C /mnt/mtd

       if [ -x /mnt/mtd/busybox/bin/ash ] ; then mv /mnt/mtd/system/bin/sh    /mnt/mtd/system/bin/sh-org

       ln -s /busybox/bin/busybox /mnt/mtd/system/bin/sh busybox(不是busyboxsh)system原来的sh替换掉,不知何故

       if [ -d /mnt/mmcblk0p1/script/pre_root_disk ] ; then

7.      cp -a /mnt/mmcblk0p1/script/pre_root_disk/* /mnt/mtd   /pre_root_disk下的文件和andorid根目录的文件合并(其实没几个文件的,但可以自己添加定制了)

8.       cp /mnt/mmcblk0p1/script/data.tgz /mnt/mtd/restore cp /mnt/mmcblk0p1/script/cache.tgz /mnt/mtd/restore 本来还有后面这句的,但自己的刷机包里没  有cache.tgz,也无伤大雅了

9.       chmod 777 -R /mnt/mtd     chown root:0 /mnt/mtd/system/bin/preboot             umount /mnt/mtd   改变根文件系统的权限,改变preboot的拥有者和权限,    最后卸载/mnt/mtd,终于完成使命了?

10.    flash_eraseall /dev/mtd10   从哪又冒出来个mtd10   可能都是临时的吧。

11.    mount -t yaffs2 /dev/mtdblock10 /mnt/mtd  这是Data部分的挂载点。

12.    tar zxvf /mnt/mmcblk0p1/script/data.tgz -C /mnt/mtd       cp -a /mnt/mmcblk0p1/script/etc/* /mnt/mtd/wmtpref      cp -a    /mnt/mmcblk0p1/script/pre_data_disk/* /mnt/mtd             chmod 777 -R /mnt/mtd sync   umount /mnt/mtd 修改权限,再卸载掉

13.    flash_eraseall /dev/mtd12    mount -t yaffs2 /dev/mtdblock12 /mnt/mtd  

14.    create_loopfile mtd12 /mnt/mtd/vfat.bin bs=524288 

15.    mkdosfs /mnt/mtd/vfat.bin   格式化这个loop文件

16.     losetup /dev/loop/0 /mnt/mtd/vfat.bin          

mount -o iocharset=gb2312 -t vfat /dev/loop/0 /LocalDisk                                         

        cp -a /mnt/mmcblk0p1/script/pre_local_disk/* /LocalDisk            

  losetup -d /dev/loop/0                                                                        

        chmod 777 -R /mnt/mtd        sync      umount /mnt/mtd

17.   flash_eraseall /dev/mtd12

18.   mount -t yaffs2 /dev/mtdblock12 /mnt/mtd

19.   cp -a /mnt/mmcblk0p1/script/pre_local_disk/* /mnt/mtd

20.   echo 0 > /proc/boot-splash

21.   if [ -x /mnt/mmcblk0p1/script/update.sh ] ; then 通过判断update.sh文件还在不在来判断是否移除了SD

22.   reboot

 

代码部分写的有点乱,但基本原理还是清晰的, update.sh所作的工作无非还是解压,复制,合并这类的工作,和scriptcmd的工作本质上一样的,不过这也像是启动过程的两层引导,stage1stage2stage1先把内核加载进来,之后stage2linux内核下工作就容易多了。

 

看到这里,相信读者会明白刷机时怎么样会刷坏?而怎么样又不会刷坏?

在刷机的过程中只是文件的解压和复制,所以除非flash不支持或是其他硬件原因,刷机的过程一般是不会出问题的,关键是刷完之后的启动过程。

如果刷的u-boot的版本不对,连u-boot都启动不起来的话,那以后再刷也不行了;如果u-bootlinux内核的版本都正确,只是Android相关的文件运行不正确,虽然机器不能正常启动,但还是可以再刷的;如果u-boot正确,linux内核镜像有问题,那可能刷机过程只执行完scriptcmd就结束了,update.sh无法正确执行,但只要u-boot正确,还是可以再刷的,直到刷回好用的版本。

Android APK反编译得到Java源代码和资源文件

这段时间在学Android应用开发,在想既然是用Java开发的应该很好反编译从而得到源代码吧,google了一下,确实很简单,以下是我的实践过程。在此郑重声明,贴出来的目的不是为了去破解人家的软件,完全是一种学习的态度,不过好像通过这种方式也可以去汉化一些外国软件。

一.反编译Apk得到Java源代码

首先要下载两个工具:dex2jar和JD-GUI,前者是将apk中的classes.dex转化成Jar文件,而JD-GUI是一个反编译工具,可以直接查看Jar包的源代码。以下是下载地址:dex2jar:http://laichao.googlecode.com/files/dex2jar-0.0.7-SNAPSHOT.zip JD-GUI:http://laichao.googlecode.com/files/jdgui.zip

具体步骤:
  1. 首先将apk文件,将后缀改为zip,解压,得到其中的classes.dex,它就是java文件编译再通过dx工具打包而成的;
  2. 解压下载的dex2jar,将classes.dex复制到dex2jar.bat所在目录。在命令行下定位到dex2jar.bat所在目录,运行
    dex2jar.bat classes.dex

     

    生成classes.dex.dex2jar.jar

  3. 运行JD-GUI,打开上面生成的jar包,即可看到源代码了。

二.反编译apk生成程序的源代码和图片、XML配置、语言资源等文件

如果是只是汉化软件,这将特别有用。首先还是下载工具,这次用到的是apktool,下载地址:

http://code.google.com/p/android-apktool/,apktool-1.0.0.tar.bz2和apktool-install-windows-2.1_r01-1.zip两个包都要下。

具体步骤:
  1. 将下载的两个包解压到同一个文件夹下,应该会有三个文件:aapt.exe,apktool.bat,apktool.jar;
  2. 在命令行下定位到apktool.bat文件夹,输入以下命令:
    apktool d C:\***.apk  C:\***文件夹

     

    命令行解释:apktool d [要反编译的apk文件 ] [输出文件夹],特别注意:你要反编译的文件一定要放在C盘的根目录里;

  3. 将反编译完的文件重新打包成apk,很简单,输入apktool b c:\***文件夹(你编译出来文件夹)即可。

Android APK反编译

一.反编译Apk得到Java代码

转载自:http://hi.baidu.com/%CB%BF%D4%B5 ... fc541e495403ec.html



工具下载:需用到dex2jar和JD-GUI这2个工具

dex2jar下载地址:http://laichao.googlecode.com/files/dex2jar-0.0.7-SNAPSHOT.zip
JD-GUI下载地址:
  windows版JD-GUI:http://laichao.googlecode.com/files/jdgui.zip
  Linux版JD-GUI:http://laichao.googlecode.com/fi ... 2.linux.i686.tar.gz

步骤:

1.首先找到Android软件安装包中的classes.dex
把.apk文件改名为.zip,然后解压缩,得到其中的classes.dex文件,它就是java文件编译再通过dx工具打包成的,所以现在我们就用上述提到的2个工具来逆方向导出java源文件

2.把classes.dex拷贝到dex2jar.bat所在目录。
命令模式下定位到dex2jar.bat所在目录,运行 dex2jar.bat classes.dex  ,生成classes.dex.dex2jar.jar

3.运行JD-GUI工具(它是绿色无须安装的)
打开上面的jar文件,即可看到源代码

---------------------------------------------------------------------------------

---------------------------------------------------------------------------------

二.反编译apk生成程序的源代码和图片、XML配置、语言资源等文件。

转载自:http://blog.sina.com.cn/s/blog_5752764e0100kv34.html

工具下载:

在http://code.google.com/p/android-apktool/下 载获得,apktool-1.0.0.tar.bz2和apktool-install-windows-2.1_r01-1.zip两个包都要下。

步骤:

1.解压缩下载的两个文件包,apktool-install-windows-2.1_r01-1.zip解压缩后得到的包里有aapt.exe 和apktool.bat.(注意要把apktool-1.0.0.tar.bz2解压后的一个.jar 文件copy进来)

2.打开命令窗口 (开始 > 运行,输入cmd,回车。)进入到apktool.bat的文件夹里。

          输入:

                    apktool d C:\***.apk  C:\***文件夹

(命令行解释:apktool d 要反编译的文件 输出文件夹)

特别注意:你要反编译的文件一定要放在C盘的根目录里,

3.打开 C:\***文件夹 就可以得到我们学院的各种资源了。



三.将反编译完的文件重新打包成apk

很简单,只要输入:

     apktood b c:***文件夹(你编译出来文件夹)

缓存文件类型

refresh_pattern -i \.jpg$ 1440 50% 10080
refresh_pattern -i \.png$ 1440 50% 10080
refresh_pattern -i \.jpeg$ 1440 50% 10080
refresh_pattern -i \.bmp$ 1440 50% 10080
refresh_pattern -i \.psd$ 1440 50% 10080
refresh_pattern -i \.zip$ 1440 50% 10080
refresh_pattern -i \.rar$ 1440 50% 10080
refresh_pattern -i \.jar$ 1440 50% 10080
refresh_pattern -i \.gz$ 1440 50% 10080
refresh_pattern -i \.avi$ 1440 50% 10080
refresh_pattern -i \.mp3$ 1440 50% 10080
refresh_pattern -i \.mp4$ 1440 50% 10080
refresh_pattern -i \.3gp$ 1440 50% 10080
refresh_pattern -i \.pak$ 1440 50% 10080
refresh_pattern -i \.sis$ 1440 50% 10080
refresh_pattern -i \.wml$ 1440 50% 10080
refresh_pattern -i \.umd$ 1440 50% 10080
refresh_pattern -i \.txt$ 1440 50% 10080
refresh_pattern -i \.css$ 1440 50% 4320
refresh_pattern -i \.js$ 1440 50% 4320
refresh_pattern -i \.xml$ 1440 50% 4320
refresh_pattern -i \.htm$ 60 20% 4320
refresh_pattern -i \.html$ 60 20% 4320

DedeTag Engine Create File False的原因及解决办法

版本:DEDE所有版本,DEDE_v5,V5.3,V5.5
原因:要创建的目录或者文件没有写入权限

解决办法:

第一步,定位出错的文件,即查找生成什么文件时出的问题。

方法:修改 include/dedetag.class.php文件,搜索"DedeTag Engine Create File False",会找到以下代码

 
$fp = @fopen($filename,"w") or die("DedeTag Engine Create File False");


修改成
 

$fp = @fopen($filename,"w") or die("DedeTag Engine Create File False:$filename");

重新生成栏目或者文档时,即可提示当前文件信息。

第二步,找到提示错误的目录或者文件,检查是否有写入权限,windows服务器请给予写入权限,linux服务器请给予777权限。如果目录或者文件不存在,请手工建立。

常见的错误情况有,data目录没有写入权限,html静态文件目录没有写入权限,index.html首页静态文件没有写入权限。

警告:此修改操作可能会暴露程序目录结构信息,建议解决问题以后,还原程序文件

php编译时出libiconv错

/root/php-5.2.12/ext/iconv/iconv.c:2615: undefined reference to `libiconv'
/root/php-5.2.12/ext/iconv/iconv.c:2615: undefined reference to `libiconv'
ext/iconv/.libs/iconv.o:/root/php-5.2.12/ext/iconv/iconv.c:2537: more undefined references to `libiconv' follow
ext/iconv/.libs/iconv.o: In function `php_iconv_stream_filter_ctor':
/root/php-5.2.12/ext/iconv/iconv.c:2491: undefined reference to `libiconv_open'
ext/xmlrpc/libxmlrpc/.libs/encodings.o: In function `convert':
/root/php-5.2.12/ext/xmlrpc/libxmlrpc/encodings.c:73: undefined reference to `libiconv_open'
/root/php-5.2.12/ext/xmlrpc/libxmlrpc/encodings.c:81: undefined reference to `libiconv'
/root/php-5.2.12/ext/xmlrpc/libxmlrpc/encodings.c:101: undefined reference to `libiconv_close'
collect2: ld returned 1 exit status
make: *** [sapi/cli/php] ?.. 1
 
 
处理方法:
./configure ............
 
vi Makefile
找到下面这行:
EXTRA_LIBS = -lcrypt ...
在最后添加-liconv
保存后make通过;make install通过。

Android 固件管理器桌面版

http://zrizhi.com/android-rom-manager-desktop-released.html

制作Android ROM的步骤

制作Android ROM有两种方法:

  • 编译Android源代码的方法,这个比较复杂,以后再介绍;
  • 在已有的ROM基础上制作或者叫定制自己的ROM。

本文介绍的是在已有ROM基础上的定制步骤。

我这里使用的机器是Nexus One,于是下载了第三方的ROM,这里以安卓农夫ROM 2.4为基础。当然也可以用CyanogenMod提供的ROM,实际上安卓农夫的ROM就是在该ROM基础上做的定制。

解压缩ROM,比如安卓农夫ROM 2.4文件名为:

n1_2.4_signed 2.zip

解压缩后,可以看到目录中:

  • boot.img文件,这是系统的镜像,包括Linux内核以及系统启动的一些基本文件。
  • META-INF目录,这里主要有系统更新脚本,路径是:META-INF/com/google/android/updater-script
  • system/app目录,系统自带的应用程序都放在这个目录下,比如日历、联系人、gmail等,你可以把自己的apk文件放在该目录下,这样就可以在刷ROM的时候直接安装上
  • system/bin目录,系统命令,可以通过adb shell登录后执行,比如top
  • system/etc目录,类似linux的/etc目录
  • system/font目录,字体
  • system/framework目录,android框架,是java实现,在dalvik虚拟机下支持用户java开发的框架
  • system/lib目录,android本地共享库,都是so文件,是c、c++编译的本地共享库
  • system/media目录,一些媒体文件,比如bootanimation.zip,压缩包里面是一些png图,用于开机动画,替代这些可以改变开机画面,audio目录下是一些声音文件,用于铃声和通知等

 

其实,本文介绍的定制ROM主要步骤是如何将解开的ROM打包签名,如果只是打包回zip,android是不认的,recovery的时候会在校验ROM包的时候报错。

在将自定义的apk文件放在system/app目录下后,还可以改动比如开机画面,增加自定义铃声,增加命令(在system/bin下)等,然后还是要打包回zip文件。

然后,需要使用签名工具对zip包做签名,签名工具可以在:

http://androidforums.com/developer-101/8665-how-signing-roms.html

下载。需要注册用户登录才能下载。下载的工具是windows下执行的。

运行:

autosign.bat

第一次需要设置CLASS_PATH,将testsign.jar加进去,设置过程很简单,首先要输入2:

image

然后它会猜你的testsign.jar就在当前目录下,因此输入yes:

image

然后选择4,手工输入需要签名的ROM路径,然后输入yes,就可以了:

image

签名过程需要一段时间,需要耐心等待,签名后并不生成新的文件,是通过修改原文件完成的。