博文

命令行使用JKS文件为APK签名

    目前拿到一个机器的Android系统签名,以JKS格式文件提供,要如何对APK签名呢?按如下步骤操作:     jarsigner -verbose -keystore xxx.jks -signedjar xxx_signed.apk xxx_unsigned.apk xxx_alias    其中,xxx.jdk为相应的签名文件,xxx_alias为签名文件里面配置的keystore别名。例如:   jarsigner -verbose -keystore xbh.jks -signedjar Explorer_signed.apk Explorer_unsigned.apk android    执行该命令后,要求输入keystore的密码,输入完后,碰到如下提示:     jarsigner: 无法对 jar 进行签名: java.util.zip.ZipException: invalid entry compressed size (expected 6716 but got 6831 bytes)    查了下资料,是由于APK已有签名了,于是执行如下命令删除到现有签名:     zip -d Explorer_unsigned.apk META-INF/\*    命令执行后有如下提示:    deleting: META-INF/MANIFEST.MF    deleting: META-INF/CERT.SF    deleting: META-INF/CERT.RSA    执行完该命令后,再执行上面的jarsigner命令重新签名即可,此时有如下提示输出:    正在添加: META-INF/MANIFEST.MF    正在添加: META-INF/ANDROID.SF    正在添加: META-INF/ANDROID.RSA    正在签名: res/drawable-1280x600/content_item.9.png    正在签名: res/drawable-1280x600/explorer_logo.png    正在签名: res/drawable-1280x600/icon.png    正在签名: res/drawable-1280x6

制作Android7.1关机充电动画

    在Android7.1系统上面,关机充电动画已不再是5.1里的几张图片,如下:     在Android5.1的system/core/healthd/images目录下,有如下文件:     battery_0.png     battery_1.png     battery_2.png     battery_3.png     battery_4.png     battery_5.png     battery_charge.png     battery_fail.png     capacity_text_bottom.png     capacity_text_left.png     capacity_text_right.png     capacity_text_top.png     而在Android7.1的同一目录下,则只有如下文件:     battery_fail.png     battery_scale.png     其中,battery_scale.png为相应的动画文件,我们查找了一翻,发现在bootable/recovery目录下有interlace-frames.py文件,该文件用于将几张PNG图片合成一张PNG图片,我们使用如下命令将上面的battery_scale.png解包:     python interlace-frames.py -d battery_scale.png -o battery.png     会生成battery00.png、……、battery05.png共6个文件,而这6个文件刚好对应system/core/healthd/healthd_mode_charger.cpp文件里的default_animation_frames定义: static struct animation::frame default_animation_frames[] = {     {         .disp_time = 750,         .min_level = 0,         .max_level = 19,         .surface = NULL,     },     {         .disp_tim

Android7.1 UAS移动硬盘识别问题

在RK3399 Android7.1.2上面的USB3.0口上使用一款SONY移动硬盘,接入时识别信息如下: rk3399_box:/ # [   25.497767] usb 6-1.4: new SuperSpeed USB device number 4 using xhci-hcd [   25.512350] usb 6-1.4: New USB device found, idVendor=2537, idProduct=1068 [   25.513043] usb 6-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [   25.513732] usb 6-1.4: Product: NS1068 [   25.514119] usb 6-1.4: Manufacturer: Norelsys [   25.514189] usb 6-1.4: SerialNumber: 0123456789ABCDE [   25.527826] scsi host0: uas [   29.089929] scsi 0:0:0:0: Direct-Access     ATA      TOSHIBA MQ01ABD1 1U   PQ: 0 ANSI: 6 [   29.100317] sd 0:0:0:0: [sda] 1953525168 512-byte logical blocks: (1.00 TB/932 GiB) [   29.100418] sd 0:0:0:0: [sda] 4096-byte physical blocks [   29.104389] sd 0:0:0:0: [sda] Write Protect is off [   29.105420] sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA [   29.105603] xhci-hcd xhci-hcd.7.auto: ERROR Transfer event for disabled endpoint or incorrect stre

升级MacOS(Mojave)后使用git问题

将MacOS升级到Mojave版本后,使用git工具时,出现如下错误提示: guochongxindeMacBook-Pro:study guochongxin$ git status . xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun 解决方法: 执行xcode-select --install命令,会弹出一个对话框,按提示安装上相应工具即可,因为git附加了Xcode的命令。 参考资料: https://my.oschina.net/gooiem/blog/2208380 http://www.cnblogs.com/snifferhu/p/6196687.html https://stackoverflow.com/questions/32896524/invalid-active-developer-path-error-after-upgrading-to-el-capitan

Ubuntu下安装Docker

1.安装Docker        sudo apt-get install curl    curl -fsSL https://get.docker.com/ | sh   安装好后有如下提示:   If you would like to use Docker as a non-root user, you should now consider   adding your user to the "docker" group with something like:     sudo usermod -aG docker guochongxin   Remember that you will have to log out and back in for this to take effect!   可根据实际需要执行上面提示中的命令,将当前用户加到docker用户组里,避免后期需要加sudo执行。   接下来执行sudo docker run hello-world命令来验证安装情况,如有下面提示则表示安装成功:   Hello from Docker.      This message shows that your installation appears to be working correctly.       To generate this message, Docker took the following steps:        1. The Docker client contacted the Docker daemon.      2. The Docker daemon pulled the "hello-world" image from the Docker Hub.      3. The Docker daemon created a new container from that image which runs the        executable that produces the output you are currently reading.      4. The Docker daemon streamed that output to the

初试Netlink之unicast

        在之前已经了解了好几种内核态与用户态之间数据的交换方法,但那些方法都是单向的(即单工),其关系是一对一的,而Netlink Socket则是一种用于内核与用户空间之间传递信息的特殊IPC,在用户进程中,其以标准的Socket API为内核和用户之间提供了全双工的通信通道,在内核模块中则提供了一类特殊的API。相比TCP/IP socket所使用的AF_INET地址族,Netlink socket则使用AF_NETLINK地址族,每一个Netlink Socket都在Kernel的include/uapi/linux/netlink.h(linux-3.11.0-rc4,关于Netlink部分相关文档,如无注明均以该版本为基准)中定义了相应的protocol type。         在Linux  Kernel中,以模块形式去创建Netlink Socket时需要涉及到如下相关的API及数据结构:         1.创建Socket            在include/linux/netlink.h文件中,有如下的定义:            /* optional Netlink kernel configuration parameters */            struct netlink_kernel_cfg {                    unsigned int    groups;                    unsigned int    flags;                    void            (*input)(struct sk_buff *skb);                    struct mutex    *cb_mutex;                    void            (*bind)(int group);                    bool            (*compare)(struct net *net, struct sock *sk);            };            extern struct sock *__netlink_kernel_create(s

C编程使用内联汇编控制PC蜂鸣器发声

有了“内联汇编控制PC蜂鸣器”的基础了解后,我们使用内联汇编来改造“C编程控制PC蜂鸣器”一文的例子,最终的代码如下: #include <stdio.h> #include <unistd.h> #include <sys/io.h> /* The clock frequency of the i8253/i8254 PIT */ #define PIT_TICK_RATE 1193182ul void beep(unsigned int value) { unsigned int count = 0; unsigned char val; unsigned short port; if (value > 20 && value < 32767) count = PIT_TICK_RATE / value; iopl(3); if (count) { val = 0xB6; port = 0x43; asm volatile("outb %0,%1" : : "a" (val), "dN" (port)); val = count & 0xff; port = 0x42; asm volatile("outb %0,%1" : : "a" (val), "dN" (port)); val = (count >> 8) & 0xff; asm volatile("outb %0,%1" : : "a" (val), "dN" (port)); port = 0x61;