精华内容
下载资源
问答
  • 2020-08-31 16:15:03

    首先为了理解安卓系统是怎么工作的,就先来看一下android的系统架构,其架构大至可以分为四层:linux内核层、系统运行库层、应用框架层和应用层,那就先说说这几层。

     

    1.linux内核层:

     

    Android系统是基于Linux内核的,这一层为Android设备的各种硬件提供了底层的驱动(如显示,音频,照相机,蓝牙,WI-FI,电源管理等等),那么Android为什么会选择采用linux呢?原因与Linux的特性有关,内核作为一个抽象层存在硬件和软件之间,强大的内存管理和进程管理,基于权限的安全模式,支持共享库,经过认证的驱动模式,Linux本身就是开源项目等等。

    但同时Android对于Linux进行了改动,比如它没有glibc,最初用于一些便携的移动设备并没有采用glibc作为c库,而是goolge自己开发的Bionic Libc来作为代替品,也并没有完全照搬Linux系统的内核还增加了Gold-Fish平台以及yaffs2 Flash文件系统,而且它没有了本地基于x服务的窗口系统即Android并没有使用Linux的x窗口,同时还对驱动程序进行了增强显示驱动、键盘驱动、Flash内存驱动、照相机驱动、音频驱动、蓝牙驱动、WiFi驱动、Binder IPC驱动、Power Management(电源管理),包括硬件时钟,内存分配和共享,低内存管理,kernel调试,日志设备,android IPC机制,电源管理等。

     

    1)Binder IPC驱动:基于OpenBinder框架的一个驱动,用于提供 Android平台的进程间通信功能。源代码位于drivers/staging/android/binder.c。

     

    2)电源管理(PM) :一个基于标准Linux电源管理系统的轻量级Android电源管理驱动,针对嵌入式设备做了很多优化,比如电池电量。源代码位于:kernel/power/earlysuspend.c、kernel/power/consoleearlysuspend.c、kernel/power/fbearlysuspend.c、kernel/power/wakelock.c、kernel/power/userwakelock.c

     

    3)低内存管理器:比Linux的标准的OOM机制更加灵活,它可以根据需要杀死进程以释放需要的内存。源代码位于 drivers/staging/ android/lowmemorykiller.c。

     

    4)匿名共享内存: 为进程间提供大块共享内存,同时为内核提供回收和管理这个内存的机制。源代码位于mm/ashmem.c。

     

    5) PMEM :用于向用户空间提供连续的物理内存区域,DSP和某些设备只能工作在连续的物理内存上。源代码位于drivers/misc/pmem.c。

     

    6) Logger :一个轻量级的日志设备,用于抓取Android系统的各种日志。源代码位于drivers/staging/android/logger.c。

     

    7) Alarm :提供了一个定时器,用于把设备从睡眠状态唤醒,同时它还提供了一个即使在设备睡眠时也会 运行的时钟基准。源代码位于drivers/rtc/alarm.c。

     

    8)USB Gadget:驱动 一个基于标准 Linux USB gadget驱动框架的设备驱动,Android的USB驱动是基于gaeget框 架的。源代码位于drivers/usb/gadget/。

     

    9)Ram Console: 为了提供调试功能,Android允许将调试日志信息写入一个被称为RAM Console的设备里,它是一个基于RAM的Buffer。源代码位于drivers/staging/android / ram_console.c。

     

    10)timed device: 提供了对设备进行定时控制的功能,目前支持vibrator和LED设备。源代码位于drivers/staging/android /timed_output.c(timed_gpio.c)。

     

    11)Yaffs2 :是文件系统 Android采用Yaffs2作为MTD nand flash文件系统,源代码位于fs/yaffs2/目录下。Yaffs2是一个快速稳定的应用于NAND和NOR Flash的跨平台的嵌入式设备文件系统,同其他Flash文件系统相比,Yaffs2能使用更小的内存来保存其运行状态,因此它占用内存小。Yaffs2的垃圾回收非常简单而且快速,因此能表现出更好的性能。Yaffs2在大容量的NAND Flash上的性能表现尤为突出,非常适合大容量的Flash存储。

     

    那么为什么不自己开发一个内核而是使用Linux内核,这个牵扯到很多尽量描述一下,首先当时有了开源的Linux为什么还要在自己去开发内核,android的本质是一个基于Linux上运行的java虚拟机,Google只用了kernel所以只有系统的底层结构是一样的其他的东西在Android里都是不一样的尤其是编程接口,所以Android距离Linux比MAC OS距离Linux还要远。android是被google收购的,原来的小团队没有时间和精力去研发所以使用了上面说的开源的Linux(免费还免维护费),同时因为google是一个互联网公司,google是靠服务来盈利不像Apple是设备商依靠软件给设备服务,所以google是一个纯粹的软件提供者,为了让硬件厂商能够合作需要从硬件的角度思考问题(硬件厂商更愿意再有一定把握的平台进行开发),同时google也有比较好的对应措施去弥补Linux操作系统的一些缺点,从技术上失去了一些动力。

     

    关于内核的作用简单说就是提供了进程管理、文件网络管理、系统安全权限管理、以及系统与硬件设备通讯基础。而在无论Android还是iOS这类高度依赖框架的多层次操作系统上,内核对上层开发者来说是几乎不可见的,只能通过开放给你的框架接口进行相关操作。因此可以说内核对整个系统来说是基础性的,而非功能性。就整个Android工程来说主体交互、功能框架才是重中之重。再说说开发内核到底有多大好处,或者说性价比有多高的问题。作为整套系统的基础,内核的高效稳定可以说是重重之重,而任何一款软件的开发都要经历迭代过程,微软开发NT内核耗费大量资金与时间,而且至今还在不断改进与维护正是对此种迭代的最佳例证。而即使如此,经过将近十年的开发与维护,NT内核之效率与功能性仍弱于Linux。由于Linux的开源特性,大量个人与企业对其进行持续不断的维护与改进是Linux始终保持领先的重要原因,而微软以其一己之力自不能与其媲美。这实际上是告诉大家在已有开源Linux的前提下,自己开发系统内核实际上是一件吃力不讨好的事。因此使用来源Linux自然是省时省力省钱又保险的选择。另外值得一提的是苹果自主研发内核实际上是不准确的iOS与OSX其实都是基于UNIX内核。

     

     

     

    2.系统运行库层:

     

    通过一些c/c++库来为Android提供主要的特性支持,如SQLite提供了数据库的支持,OpenGL|ES库提供了3D绘图的支持,WebKit库提供了浏览器内核的支持等等。同时在这一层的还有Android运行时库提供了一些核心库,能够允许开发者使用JAVA语言来编写Android应用。还包含了虚拟机Dalvik但之后改为了ART运行环境,使每一个Android应用都有自己的进程,并且都有一个自己的Dalvik虚拟机实例,相较于JAVA的虚拟机Dalvik是专门为移动设备定制的,针对内存和CPU性能都有了优化。

    所以Android的系统运行库包含两部分,一个是系统库,另一个是运行时,Android系统的各个组件都在使用c/c++库,这些功能是通过Android应用框架暴露给开发人员的,系统库是应用程序框架的支撑,是连接应用程序框架层与Linux内核层的重要纽带,在程序运行时中执行其运行时分为核心库和Dalvik虚拟机两部分。

     

    系统库(九个):

    1、Libc:系统c库,是从BSD继承来的标准C系统函数库,专门为基于EmbeddedLinux的设备定制。

    2、Media Framework(多媒体库):Android系统多媒体库,基于PacketVideoOpen、CORE。该库支持录放.并且可以录制许多流行的音频视频格式.还有静态映像文件,包括MPEG4、H.264、MP3、AAC、JPG、PNG等。

    3、Surface Manager:主要负责管理针对显示系统的访问,并且为多个应用程序提供2D和3D图层的无缝融合。

    4、Webkit:浏览器。一个最新的web浏览器引擎,用来支持Android浏览器和一个可嵌入的Web视图。

    5、SGL:一个内置的2D图形引擎。

    6、SSL:位于TCP/IP与各种应用层协议之间为数据通信提供支持。

    7、OpenGL ES:3D效果的支持。基于OpenGLES 1.0 APIs实现;该库可以使用硬件3D加速或者使用高度优化的3D软加速。

    8、greeType:提供位图bitmap和向量vector的字体描述与显示。

    9、SQLite:一个对于所有应用程序可用、功能强劲的轻型关系型数据库引擎

     

    除了之上的主要系统类库之外,还有Android NDK,即Android原生库。NDK为开发者提供了直接使用Android系统资源,并采用C 或C++语言编写程序的接口。因此,第三方应用程序可以不依赖于Dalvik虚拟机进行开发。NDK提供了一系列从C或C++生成原生代码所需要的工具,为开发者快速开发 C 或 C++的动态库提供方便,并能自动将生成的动态库和Java 应用程序一起打包成应用程序包文件,即.apk文件。

    注意,使用原生库无法访问应用框架层API,兼容性可能无法保障。而且从安全性角度考虑,Android原生库用非类型安全的程序语言C/C++编写,更容易产生安全漏洞,原生库的缺陷也可能更容易直接影响应用程序的安全性。

     

    Android运行时:

    1、核心库:提供了Java语言API中的大多数功能,同时也包含Android的一些核心API.如android.OS、android.net、android.media等。

     

    2、Dalvik虚拟机:Android程序不同于J2ME程序(是java的一种运行环境),每个Android应用都运行在自己的进程上,享有Dalvik虚拟机为它分配的专有实例,并在该实例中执行。Dalvik虚拟机是一种基于寄存器的Java虚拟机,而不是传统的基于栈的虚拟机,并进行了内存资源使用的优化以及支持多个虚拟机的特点。设计成在一个设备可以高效地运行多个虚拟机。Dalvik虚拟机可执行文件格式是(.dex),dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。 大多数虚拟机包括JVM都是基于栈的,而Dalvik虚拟机则是基于寄存器的,所有的类都经由JAVA编译器编译,然后通过SDK中 的 "dx" 工具转化成.dex格式由虚拟机执行。Java编译器将Java源文件转为class文件,class文件又被内置的dx(具有转化为dex格式文件,该格式文件针对最小内存使用做了优化,这种文件在Dalvik虚拟机上注册并运行)。在一些底层功能方面,例如线程和低内存管理等.Dalvik虚拟机是依赖Linux内核的。

    Dalvik虚拟机是基于Apache的Java虚拟机,并被改进以适应低内存、低处理器速度的移动设备环境。Dalvik虚拟机依赖于Linux内核,实现进程隔离与线程调度管理、安全和异常管理、垃圾回收等重要功能。但Dalvik虚拟机并非传统意义上的Java虚拟机(JVM)。Dalvik虚拟机不仅不按照Java虚拟机的规范来实现而且两者不兼容。

     

    Dalvik和标准Java虚拟机有以下主要区别:

    (1)Dalvik基于寄存器,而JVM基于栈。一般认为,基于寄存器的实现虽然更多依赖于具体的CPU结构,硬件通用性稍差,但其使用等长指令,在效率速度上较传统JVM更有优势。

    (2)Dalvik经过优化,允许在有限的内存中同时高效地运行多个虚拟机的实例,并且每一个Dalvik应用作为一个独立的Linux进程执行,都拥有一个独立的Dalvik虚拟机实例。Android这种基于Linux的进程“沙箱”机制,是整个安全设计的基础之一。

    (3)Dalvik虚拟机从DEX(Dalvik Executable)格式的文件中读取指令与数据,进行解释运行。DEX文件由传统的、编译产生的CLASS文件,经dx工具软件处理后生成。

    (4 )Dalvik的DEX文件还可以进一步优化提高运行性能。OEM的应用程序可以在系统编译后,直接生成优化文件(.ODEX文件),第三方的应用程序则可在运行时在缓存中优化与保存,优化后的格式为DEY(.dey文件)。

     

    3.应用框架层:

     

    这一层主要提供了构建应用程序时可能用到的各种API,Android自带的一些核心应用就是使用这些API完成的。那什么是应用程序框架层,可以说是一个应用程序的核心,是一个共同使用和遵守的约定然后在这个约定上共同扩展,但程序保持主体结构的一致,其作用的是让程序保持清晰在满足不同需求的同时又不互相影响。而对于Android来提供给应用开发者的本身就是一个框架,所有的应用开发都必须遵守这个框架的原则,同时在这个基础上进行扩展可以访问核心应用程序所使用的API框架(即要实现某个功能就调用安卓系统自己提供的功能,如果不想调用就可以通过继承实现个性化扩展),安卓的应用框架提供开发Android应用程序所需的一系列类库采用重用机制,开发人员可以进行快速的应用程序开发方便高效的使用安桌平台本身的组件或者替换平台本身的各种应用程序组件。

     

    该框架包含:活动管理器、窗口管理器、内容提供者、视图系统、包管理器、电话管理器、资源管理器、位置管理器、通知管理器、XMPP服务。

     

     活动管理器:管理各个应用程序的生命周期以及通常的导航回退功能。作用:负责一新ActivityThread进程创建,Activity生命周期的维护。其自身也存在一个框架,本文就不再讨论,有兴趣的可以看一看。

     

     窗口管理器:管理所有的窗口程序,在安卓应用框架中窗口主要分为两种:

    (一)是应用窗口(一个activity有一个主窗口,弹出的对话框也有一个窗口,Menu菜单也是一个窗口。在同一个activity中,主窗口、对话框、Menu窗口之间通过该activity关联起来)。

    (二)是公共界面的窗口(系统级别的窗口如:最近运行对话框、关机对话框、状态栏下拉栏、锁屏界面等)窗口管理系统是基于C/S模式的。整个窗口系统分为服务端和客户端两大部分,客户端负责请求创建窗口和使用窗口,服务端完成窗口的维护,窗口显示等。

     

     内容提供器:使得不同应用程序之间存取或者分享数据。就是可以配置自己的Content Provider去存取其他的应用程序或者通过其他应用程序暴露的Content Provider去存取它们的数据,总的来说就是提供了一个数据共享机制。

     

     视图系统:构建应用程序的基本组就是文本框、按钮等。

     

     通告管理器:使得应用程序可以在状态栏显示自定义的提示信息,通过NotificationManager 、 Notification这两个类可以完成在状态栏显示提示的信息。

     

     

    管理器:安卓系统内的程序管理,Package Manger是一个实际上管理应用程序安装、卸载和升级的API。当我们安装APK文件时,Package Manager会解析APK包文件和显示确认信息。

         

    电话管理器:管理所有的移动设备 用于管理手机通话状态、获取电话信息(设备、sim卡、网络信息),监听电话状态以及调用电话拨号器拨打电话。

     

    资源管理器:提供应用程序使用的各种非代码资源。提供应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件、颜色文件等

            

    位置管理器:提供位置服务,LocationManager系统服务是位置服务的核心组件,它提供了一系列方法来处理与位置相关的问题,包括查询上一个已知位置、注册和注销来自某个。LocationProvider的周期性的位置更新、注册和注销接近某个坐标时对一个已定义的Intent的触发等。总的来说就是提供有关位置的操作。

         

    XMPP服务:例如提供Google Talk 服务,XMPP(Extensible Messageing and Presence Protocol:可扩展消息与存在协议):是一种即时消息协议用于信息的传输。是一种基于XML的开放式实时通信协议,XMPP是基于服务器的也是分散式的

     

     

    4.应用层

     

    所有安装在手机上的应用程序都是这个层,比如手机自带的程序或者下载的游戏等等。

    更多相关内容
  • PHP7中用opcache.file_cache导出脚本opcode实现源代码保护http://my.oschina.net/eechen/blog/539995下载PHPDroid: 基于WebView和PHP内置HTTP服务器开发Android应用http://my.oschina.net/eechen/blog/655689截图是...

    PHP7中用opcache.file_cache导出脚本opcode实现源代码保护

    http://my.oschina.net/eechen/blog/539995

    下载PHPDroid: 基于WebView和PHP内置HTTP服务器开发Android应用

    http://my.oschina.net/eechen/blog/655689

    f6252964fb71e55c14f66d11be9083a3.png

    截图是我在Ubuntu上用arm-none-linux-gnueabi-gcc交叉编译的Android版PHP(静态链接glibc等库).

    adb push ./php /data/local/tmp 上传到Android系统(小米4),直接 ./php -S 127.0.0.1:8181 跑Web服务.

    套个WebView就能用PHP(内置Web服务器和SQLite引擎)写Android应用了.

    生成的php用arm-none-linux-gnueabi-strip去掉符号表,zip压缩后约5MB.

    少用些图片,整个应用做到8MB以内应该没什么问题.

    http://my.oschina.net/eechen/blog/298027

    HHVM和PHP7都已经发出来了,还有具体的编译打包方法,可以自行按照教程构建出Nginx/Apache/MySQL,至于Android版PHP的交叉编译构建,参考的是DroidPHP的方法.

    我的Android App也基本写好了,已经跑在我的小米4上了.

    过程就是把/data/app/net.php.phpdroid.apk/assets/php/复制到/data/data/net.php.phpdroid/php/,

    然后Java exec调用/system/bin/sh执行命令,先给php/bin/start.sh赋予执行权限,然后执行start.sh,

    start.sh里给php/bin/php赋予执行权限,然后调用php生成用于标记WebView的UserAgent的随机串php/bin/ua,

    并调用php的fsockopen从8181开始在127.0.0.2上找到可用的端口php/bin/port,

    然后启动PHP的HTTP服务器,然后用echo $! > php/bin/pid记录PHP的PID,

    start.sh执行完后回到Java主程序,主程序读取UserAgent(php/bin/ua)并setUserAgentString和

    读取端口(php/bin/port)并loadUrl,从而打开WebView并访问本地PHP.

    退出关闭的时候则执行stop.sh调用kill杀死php/bin/pid.

    start.sh的开头也执行一次stop.sh,关掉可能没有被杀死的旧进程.

    补充一下User Agent验证的说明:

    /data/data/net.php.phpdroid/php/bin/php \

    -c /data/data/net.php.phpdroid/php/bin/php.ini \

    -S 127.0.0.2:8181 \

    -t /data/data/net.php.phpdroid/www \

    /data/data/net.php.phpdroid/php/auth.php

    其中auth.php是PHP内置的HTTP服务器的特性,就是每个请求都会经过auth.php处理.

    名字不要求是auth.php,可以随意取,加到php启动参数里就能生效.

    https://wiki.php.net/rfc/builtinwebserver

    //return false;

    $ua = file_get_contents(dirname(__FILE__).'/ua');

    if(isset($_SERVER['HTTP_USER_AGENT']) && $_SERVER['HTTP_USER_AGENT']===$ua) return false;

    else exit('Auth Failed');

    代码意思就是如果客户端User Agent不是/data/data/net.php.phpdroid/bin/ua,则拒绝访问.

    等我整理好,我会把这些资源全都放出来,授人以鱼也应该授人以渔,

    这些知识都是从网络上获得的,如果每个人都藏着掖着,那我也不会捕鱼,

    正是因为有的人乐于分享,知识才得以广泛传播.

    像patchelf便携式打包参考的就是百度技术博客的分享:

    http://lamp.baidu.com/2014/10/17/gou-jian-ke-sui-di-bu-shu-de-lampji-chu-huan-jing-bao/

    构建Android版PHP参考的则是DroidPHP的分享:

    https://github.com/DroidPHP/DroidPHP/blob/master/docs/Compiling.md

    Linux上,用tar.xz打包GCC -O3编译的php7cli(3MB)和依赖库php7libs(7MB),大小约10MB.

    因为打包了依赖库,所以能做到解压即用,适配所有Linux发行版.

    整个应用打包下来,可以做到不超过15MB.

    如果源代码不想被别人看到,PHP7支持用opcache.file_cache导出脚本opcode实现源代码保护,详情看:

    http://my.oschina.net/eechen/blog/539995

    我打包了适用于64位Linux的PHP7:

    http://my.oschina.net/eechen/blog/411534

    去掉里面的PHP-FPM和PHP-CGI,保留PHP CLI,整个PHP7环境就是10MB左右了.

    假设应用安装在/png/php/7.0.0,其下的www作为根目录,启动HTTP服务:

    /png/php/7.0.0/bin/php -S localhost:9393 -t /png/php/7.0.0/www

    浏览器做界面,访问localhost:9393打开应用.

    这两个步骤可以做成一个启动脚本start.sh:

    #!/bin/bash

    nohup /png/php/7.0.0/bin/php -S localhost:9393 -t /png/php/7.0.0/www >/dev/null 2>&1 &

    nohup xdg-open http://localhost:9393/ >/dev/null 2>&1 &

    关闭脚本stop.php就更简单了,调用kill关闭PHP CLI进程即可:

    shell_exec('kill '.getmypid());

    比如PHP调用系统自带命令lshw或者读取/proc/cpuinfo就能拿到各种硬件信息,包括CPU的即时运行频率等.

    PHP可以把命令返回的信息直接写在

    ,或者转为数组进行精确的哈希操作后输出.
     

    这样,像 雅黑探针 那样,通过Web界面就能获取像Windows上CPU-Z工具的硬件信息.

    Linux"一切皆文件"的思想方便PHP获取系统信息开发Linux桌面应用.

    /proc和/sys这两个文件系统里包含了Linux的各种运行时信息和硬件信息.

    通过man proc查查每项的说明,任何语言都能以文本形式访问里面的数据,比如PHP获取内存使用信息:

    $arr = explode("\n", file_get_contents('/proc/meminfo'));

    foreach($arr as $k => $v) {

    if(!empty($v)) {

    $tmp = explode(':', $v);

    $new[trim($tmp[0])] = trim($tmp[1]);

    }

    }

    echo 'MemTotal:   '.$new['MemTotal']."\n";

    echo 'MemFree:    '.$new['MemFree']."\n";

    echo 'Buffers:    '.$new['Buffers']."\n";

    echo 'Cached:     '.$new['Cached']."\n";

    echo 'SwapCached: '.$new['SwapCached']."\n";

    本地存储用SQLite,浏览器跟本地和服务器交互可以用AJAX或者WebSocket(Swoole),

    程序更新时pclose(popen('upgrade.php', 'r'))打开一个CLI进程用file_get_contents()或者curl获取更新包.

    进程间可以通过文件系统标记或者SQLite数据库进行通信.

    CodeSourcery基于GNU GCC改造的交叉编译器 arm-none-linux-gnueabi 编译的程序能兼容多种ARM架构.

    在Linux上把PHP移植到Android上运行的DroidPHP项目就用到了 arm-none-linux-gnueabi-gcc 这个交叉编译器:

    https://github.com/DroidPHP/DroidPHP/blob/master/docs/Compiling.md

    把PHP部署到客户端Android,WebView做界面,这样用网站开发技术HTML/CSS/JS/PHP/SQL就能够开发Android应用.

    DroidPHP编译教程里面有一些小错误,比如:

    LDFLAGS="-static -I$ROOTFS/lib -L$ROOTFS/usr/lib" \

    应该改为:

    LDFLAGS="-static -L$ROOTFS/lib -L$ROOTFS/usr/lib" \

    还有应该使用arm-none-linux-gnueabi的头文件,比如:

    mv /png/dev/android/glibc/usr/include /png/dev/android/glibc/usr/include_backup

    ln -s /png/dev/android/arm-2014.05/arm-none-linux-gnueabi/libc/usr/include /png/dev/android/glibc/usr

    因为PHP默认调用/bin/sh来执行命令,而Android上没有/bin/sh,只有/system/bin/sh.

    所以交叉编译前需要把/bin/sh该为/system/bin/sh:

    sed -i "s{/bin/sh{/system/bin/sh{" ext/standard/proc_open.c

    展开全文
  • Android 自己的应用改为系统应用

    万次阅读 多人点赞 2016-11-30 16:19:11
    所谓系统程序就是system/app目录中的程序,普通应用转换成系统程序后有稳定、减少...第一种:使用ADB命令app安装在system/app目录下转载:android 自己的应用改为系统应用这种方法的原理就是:1、把apk文件移动到

    刚才有个朋友问我,博主发生什么事了,给我发了几张截图,我一看,哦,原来是有个大帅哔看了文章,说是,博主,我能白嫖你的文章,我说年轻人,点个赞再走,他说不点,我说点一个,他说不点,我说点一个,他说不点,我说我这文章对你有用,他不服气,说要先看看。我说可以,很快啊,看完后,就是一个复制,一个粘贴,一个网页关闭,我大意了啊,没有删除文章。按传统博客的有用为止,他说已经输了啊。 后来他说他是乱点的,这可不是乱点的啊,训练有素。我劝年轻人好好点赞,耗子尾汁,谢谢朋友们

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/53406933 文章出自:薛瑄的博客

    所谓系统程序就是system/app目录中的程序,普通应用转换成系统程序后有稳定、减少内存(DATA)空间占用、恢复出厂设置后不会消失、修改系统时间、调用隐藏方法、系统关机重启、静默安装升级卸载应用等等等等优点,想知道怎么操作?接下来我们介绍三种方法。

    #第一种:使用ADB命令将app安装在system/app目录下

    参考:android 将自己的应用改为系统应用

    ##这种方法的原理就是:
    1、把apk文件移动到system/app目录,
    2、.so文件移动到system/lib目录。
    3、修改相应的权限

    ##操作步骤:

    1. 将你的手机数据线,插上,把你的设备设置为允许usb调试
    2. 打开命令终端cmd
    3. 输入命令 adb shell
    4. 确定能进入系统
    这里写图片描述

    5. 输入命令 mount
    这里写图片描述

    6. 因为system默认是只读文件夹,所以根据上面的提示输入下面命令,使其变为可读写
    mount -o remount /dev/block/nandd /system (图)
    这里写图片描述

    再出输入 mount 查看system和上面的不一样了,说明正确

    这里写图片描述

    7. 输入 exit 退出android系统终端

    8. 解压你的apk文件,进入查看lib/armeabi文件夹下有没有 .so文件,如果没有这种库文件的话,直接跳到第10步,(因为有些apk文件是要调用动态链接库的,你不拷贝的话,就没有办法运行!会报错)如果有的话, 将这些.so文件都拷贝到/system/lib文件夹下:*

    命令:adb push libiReader_txtparser.so system/lib
    这里写图片描述

    9、拷贝完了之后呢,要给这些库文件添加权限,看看别的库文件权限是几

    chmod   644  xxxxx.so
    

    这里写图片描述

    10. 将你的apk文件拷贝进入/system/app(该文件夹里存放着所以系统级别的apk),图中我是将iReader.apk拷贝过去的

    这里写图片描述

    11. 再次进入android终端 adb shell
    12. 进入system/app文件夹 cd system/app
    13. 查看其他apk的权限 ll 能看出区别

    这里写图片描述

    14. 修改iReader.apk权限使其和其他的一样 chmod 644 iReader.apk
    这里写图片描述

    15. 搞定这些之后,重启设备 reboot
    16. 看看系统里面是不是安装好了该应用,点击一下,看是否正常运行,可以的话,再检测是否无法卸载!

    #第二种:借助工具把app转为系统应用(原理和方法一一样)

    转载:安卓进阶教程:怎样把应用转换成系统程序

    RE管理器转换和LINK2SD都可以实现,任选其一即可

    ##使用RE管理器转换

    1、首先我们把需要转换的程序在电脑上用压缩软件打开 ,看有没有lib这个目录。如果有,再把lib目录打开,直到出现以.so结尾的文件,把文件都拖出来备用。

    这里写图片描述这里写图片描述

    2、把需要转换的应用(apk文件)连同刚拖出的.so文件(如果有),放到手机内存卡,
    3、用RE管理器复制到system目录,把权限更改如图,
    4、把更改权限后的apk文件移动到system/app目录,.so文件移动到system/lib目录。
    5、完成后重启手机,应用就转换成系统程序了。

    ##使用LINK2SD转换

    这里写图片描述这里写图片描述

    如果感觉以上方法麻烦,也可借助工具来操作,LINK2SD、钛备份等软件都可以把普通程序转换为系统程序,以LINK2SD为例,打开LINK2SD,找到需要软件的程序,点击,再点操作,选择转换系统应用,接着会有个确认窗口,确认后,重启手机程序就转换好了。

    #第三种:使用signapk打包成系统应用

    参考:
    android之使用signapk打包成系统应用,获取系统权限
    使用platform密钥来给apk文件签名的命令
    Android安全开发之通用签名风险
    关于android:sharedUserId="android.uid.system"这个系统级权限
    安装APK 时, 提示" 共享用户权限不完整" , 不能安装成功, 如何解决?
    https://github.com/android/platform_build/tree/master/target/product/security

    为了更好地理解下面介绍的两种方法的原理,先来学习几个概念:

    ##Android应用签名机制
    Android系统要求安装的应用必须用数字证书进行签名后才能安装,并且签名证书的私钥由应用开发者保存。签名证书的生成也由开发者自己生成。在应用安装时会校验包名(package name)和签名,如果系统中已经存在了一个相同的包名和签名的应用,将会用新安装的应用替换旧的;如果包名相同但是签名不同,则会安装失败。

    为什么需要数字签名?

    数字签名是防止要保护的内容被篡改,用非对称加密算法。先对要保护的内容进行消息摘要,用私钥对消息摘要进行加密,生成数字签名,将数字签名和要保护的内容一起分发出去。 内容接收者用公钥对数字签名解密得到发送者给的消息摘要A,内容接收者对接收到的内容进行用相同的消息摘要算法处理得到消息摘要B,对比A和B是否相同,来判定传送的内容是否被篡改。 正常的APK文件是个ZIP压缩文件,除了应用的可执行文件、资源文件,还包括这些可执行文件、资源文件的摘要信息,数字证书的公钥信息等。并且通过这些签名信息可以确定APP和其开发者的关系。

    进行签名需要的工具有哪些?

    对apk进行签名需要用到签名证书和签名工具。Android系统要求对APP进行签名的数字证书可以由开发者自己生成。签名工具有jarsigner和signapk。jarsigner是Java本身自带的一个工具,他也可以对jar进行签名的;而signapk是专门为了Android应用程序apk进行签名的工具。二者的区别是:jarsigner工具签名时使用的是keystore签名文件,signapk工具签名时使用的是pk8,x509.pem文件。

    签名后的文件都有哪些?

    应用签名完后在应用的META-INF目录下会有三个文件:

    CERT.RSA、CERT.SF和MANIFEST.MF。

    MANIFEST.MF中保存了所有其他文件的SHA1摘要并base64编码后的值。

    CERT.SF文件 是对MANIFEST.MF文件中的每项中的每行加上“rn”后,再次SHA1摘要并base64编码后的值(这是为了防止通过篡改文件和其在MANIFEST.MF中对应的SHA1摘要值来篡改APK,要对MANIFEST的内容再进行一次数字摘要)。

    CERT.RSA 文件:包含了签名证书的公钥信息和发布机构信息。

    对安装包的校验过程在源码的frameworks/base/core/java/android/content/pm/PackageParser.java类中可以看到

    什么是通用签名?

    搭建好Android开发环境后(使用Eclipse或Android Studio),对APK签名的默认密钥存在debug.keystore文件中。在linux和Mac上debug.keystore文件位置是在**~/.android路径下,在windows目录下文件位置是C:\user\用户名.android**路径下。

    除了debug.keystore外,在AOSP发布的Android源码中,还有以下几个证书是公开的,任何人都可以获取,在源码的build/target/product/security目录中:

    这里写图片描述

    这几个证书的作用:

    testkey

    Generic default key for packages that do not otherwise specify a key.

    platform

    Test key for packages that are part of the core platform.

    shared

    Test key for things that are shared in the home/contacts process.

    media

    Test key for packages that are part of the media/download system.

    verity

    Test Key for verifiedboot system imagein Android Lollipop. Sign boot.img,sign verity metadata in system.img.

    通用签名风险:

    (1)如果攻击者的应用包名与目标应用相同,又使用了相同的密钥对应用进行签名,攻击者的应用就可以替换掉目标应用;

    (2)另外目标应用的自定义权限android:protectionlevel为“signature”或者“signatureOrSystem”时,保护就形同虚设;

    (3)如果设备使用的是第三方ROM,而第三方ROM的系统也是用AOSP默认的签名,那么使用如果使用系统级签名文件签名过的应用,权限就得到了提升。

    ##具体的实现方法:

    ###第一种是需要在Android系统源码的环境下用make来编译:

    1. 在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"这个属性。
    2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行
    3. 使用mm命令来编译,生成的apk就有修改系统时间的权限了。

    ###第二种:

    下面着重介绍一个这个方法:

    1. 加入android:sharedUserId="android.uid.system"这个属性。

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              package="com.example.jant.addview"
              android:sharedUserId="android.uid.system" >
        <application
           ...(省略若干代码)
        </application>
    
    </manifest>
    

    2. 使用自己的签名文件,生成apk

    3. 使用通用签名来重新给apk文件签名。

    3.1 .准备好platform.pk8、platform.x509.pem和签名工具signapk.jar(3个文件的下载地址),还有自己的apk,放在同一个文件夹下。

    3.2 在cmd下进入到该文件夹后,使用如下命令:
    这里写图片描述

    3.3 回车后我们的文件夹下已经多了一个new.apk文件了,这就将我们的应用打包成系统应用


    你也可以在github中去下载,但是下载的是SignApk.java,需要进行一些处理,如下

    1.1.进入\build\target\product\security,找到【platform.pk8】和【platform.x509.pem】系统密钥。
    1.2.进入\build\tools\signapk找到SignApk.java,运行 javac编译成SignApk.class
    1.3.执行命令java com.android.signapk.SignApk platform.x509.pem platform.pk8 input.apk output.apk

    ##最后解释一下原理
    首先加入android:sharedUserId="android.uid.system"这个属性。通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中。那么把程序的UID配成android.uid.system,也就是要让程序运行在系统进程中,也就是系统应用。

    只是加入UID还不够,如果这时候安装APK的话发现无法安装,提示签名不符,原因是程序想要运行在系统进程中还要有目标系统的platform key,就是上面第二个方法提到的platform.pk8和platform.x509.pem两个文件。用这两个key签名后apk才真正可以放入系统进程中。第一个方法中加入LOCAL_CERTIFICATE := platform其实就是用这两个key来签名。

    这也有一个问题,就是这样生成的程序只有在原始的Android系统或者是自己编译的系统中才可以用,因为这样的系统才可以拿到platform.pk8和platform.x509.pem两个文件。要是别家公司做的Android上连安装都安装不了。试试原始的Android中的key来签名,程序在模拟器上运行OK,不过放到小米四上安装uibl,如下图,这样也是保护了系统的安全。

    这里写图片描述

    最后还说下,这个android:sharedUserId属性不只可以把apk放到系统进程中,也可以配置多个APK运行在一个进程中,这样可以共享数据,应该会很有用的。
    你在Manifest.xml里声明使用了shareuserid 或者一些特殊permission,比如你shareuserid到uid.system,就必须使用系统platform签名来签你的apk,否则是不能安装的,同理share到其他用户id或者其他process上也是得用跟那个process运行的apk一样的签名
    一般签名肯定是厂商私有的,你肯定是没办法了,除非机器烧的是开发版本(eng)

    #检验app是否已经是系统应用

    查看应用的进程属性,如果是system用户组,说明已经是系统应用。

    这里写图片描述

    关注我的公众号,轻松了解和学习更多技术
    这里写图片描述

    展开全文
  • AndroidLinux:你俩到底啥关系

    千次阅读 2022-03-05 19:19:56
    最近正在着手研究android,自己虽然还算是熟悉Linux,但对Android可是一窍不通,都说Android就是个装了UI的Linux,可到底和Linux有什么关系呢? 根据Linux官方文档,Android分为以下几层: 应用框架。应用...

    最近正在着手研究android,自己虽然还算是熟悉Linux,但对Android可是一窍不通,都说Android就是个装了UI的Linux,可到底和Linux有什么关系呢?

     根据Linux官方文档,Android分为以下几层:

    • 应用框架。应用框架最常被应用开发者使用。作为硬件开发者,您应该非常了解开发者 API,因为很多此类 API 都可以直接映射到底层 HAL 接口,并可提供与实现驱动程序相关的实用信息。

    • Binder IPC。Binder 进程间通信 (IPC) 机制允许应用框架跨越进程边界并调用 Android 系统服务代码,这使得高级框架 API 能与 Android 系统服务进行交互。在应用框架级别,开发者无法看到此类通信的过程,但一切似乎都在“按部就班地运行”。

    • 系统服务。系统服务是专注于特定功能的模块化组件,例如窗口管理器、搜索服务或通知管理器。应用框架 API 所提供的功能可与系统服务通信,以访问底层硬件。Android 包含两组服务:“系统”(诸如窗口管理器和通知管理器之类的服务)和“媒体”(涉及播放和录制媒体的服务)。

    • 硬件抽象层 (HAL)。HAL 可定义一个标准接口以供硬件供应商实现,这可让 Android 忽略较低级别的驱动程序实现。借助 HAL,您可以顺利实现相关功能,而不会影响或更改更高级别的系统。HAL 实现会被封装成模块,并会由 Android 系统适时地加载。如需了解详情,请参阅硬件抽象层 (HAL)

    • Linux 内核。开发设备驱动程序与开发典型的 Linux 设备驱动程序类似。Android 使用的 Linux 内核版本包含一些特殊的补充功能,例如低内存终止守护进程(一个内存管理系统,可更主动地保留内存)、唤醒锁定(一种 PowerManager 系统服务)、Binder IPC 驱动程序,以及对移动嵌入式平台来说非常重要的其他功能。这些补充功能主要用于增强系统功能,不会影响驱动程序开发。您可以使用任意版本的内核,只要它支持所需功能(如 Binder 驱动程序)即可。不过,我们建议您使用 Android 内核的最新版本。如需了解详情,请参阅构建内核一文。

    对我来说比较关心的就是Android的kernel采用的还是Linux kernel,但很明显Android加入了自己的东西,对Linux进行了一些修改。于是我开始思考,那Android开发是如何进行的呢?Android 10、11、12和哪些Linux kernel版本相对应?这便是今天的主题。

    Linux kernel release

     

    目前需要先讲述一下Linux目前开发版本的分类,主要分为四部分:

    • Prepatch

      由Linus Torvalds维护和发布,针对Mainline kernel添加了新的feature,主要供Linux开发者和狂热爱好者进行测试。后面有-rc+数字的版本就属于Prepatch版本,一般来说数字最大为7,rc7为最后一个prepatch版,之后就会出现下一个mainline版本。prepatch版本一般一星期更新一次。

    • Mainline

      Mainline tree由Linus Torvalds维护,每一个Mainline kernel一般9到10个星期会发布一个新的版本。

    • Stable

      每一个mainline kernel发布后,就被认为是stable的。比如目前正处于v5.17-rc6的开发中,上一个mainline版本v5.16就被认为是最新的stable版本,对于stable版本的bug fix需要邮件发送给该版本的maintainer,在github上面提交PR是不可行的:-)。

      在下一个mainline内核可用之前,通常只有几个错误修复内核版本,除非它被指定为“长期维护内核”(Long Term)。Stable内核更新根据需要发布,通常每周一次。

      稳定版本的编号开头为内核版本编号,末尾再添加一个数字。例如,Linus 发布了 4.4 内核,则基于此内核的稳定内核版本编号为 4.4.1、4.4.2、4.4.3,依此类推。表示稳定内核版本树时,该序列号通常简写为 4.4.y。每个稳定内核版本树由一位内核开发者维护,该开发者负责为该版本挑选所需的补丁程序以及管理审核/发布流程。

      稳定内核的维护期限为当前开发周期。Linus 发布新内核后,上一个稳定内核版本树就会停止维护,用户必须转为使用新发布的内核。

    • Longterm

      很多不同的 Linux 用户都表示希望延长对内核的支持,而不只是几个月时间。因此,长期维护(LTS) 内核版本应运而生,第一个 LTS 内核 (2.6.16) 在 2006 年发布。从那时起,每年都会选择一个新的 LTS 内核,并且内核社区会为该内核提供最少 2 年的维护支持

    最后需要提一下版本号这个东西,因为看一些早期的书籍,一直告诉我们版本号的奇偶具有含义,类似于w.xx.yy这种版本号,xx被称为major revision,yy被称为 minor revision,xx如果为奇数表示为开发版本,为偶数代表稳定版。但这个规则在2004年随着2.6版本的出现废弃了,版本号什么也不代表,只是单纯的数字罢了。

    Does the major version number (4.x vs 5.x) mean anything?

    No. The major version number is incremented when the number after the dot starts looking "too big." There is literally no other reason.

    同时minor revision也被废弃,从3.0版本开始后,就没有minor revision这个东西了。我们看到的minor revision属于稳定版本编号中的,mainline版本不再具有。总之现在的版本号没什么特殊含义。

    个人感觉Linux的开发流程为Linus维护着Mainline版本,然后发布Prepatch进行测试,随着测试结束和时间的推进,发布下一个Mainline版本,同时也成为新的稳定版,由对应的维护人员来管理针对该稳定版的bug,并进行更新,而Linus选取合适的feature继续下一个prepatch版本的构建和发布,不负责稳定版的bug report。类似于下面两条线

    5.16->5.17-rc1->5.17-rc2...(Mainline开发,Linus 负责,两三个月新版本)

    |--5.16.1--5.16.2--5.16.3....(Stable开发,专门Maintainer负责,两三个月结束)

    Android kernel

    说完Linux,我们要来说一下Android。

    由于各版本之间发生了大量更改(每个版本有 10000-14000 项更改),因此包含大型补丁程序集的基于 Linux 的设备在更新到新版内核时可能会遇到严重问题。因此,大多数 SoC 供应商开始使用 LTS 版本对其设备进行标准化,使这些设备能够直接从 Linux 内核社区接收错误和安全更新。Android同样采用LTS kernel来更新设备内核。

    AOSP 通用内核(也称为 Android 通用内核或 ACK)是 kernel.org 内核的下游,包含与 Android 社区相关但尚未合并到 Mainline 内核或长期支持 (LTS) 内核的补丁程序。这些补丁程序可能包括:

    • Android 功能所需的向后移植和精选的上游功能

    • 可供 Android 设备使用但仍处于上游开发阶段的功能(例如,Energy Aware Scheduler 任务放置优化)。

    • 对其他生态系统合作伙伴有用的供应商/原始设备制造商 (OEM) 功能(例如,sdcardfs)。

    android-mainline 是 Android 功能的主要开发分支。每当 Linus Torvalds 发布内核版本或候选内核版本时,Linux Mainline 内核就会合并到 android-mainline 中。在 2019 年之前,Android 通用内核是通过克隆最新声明的 LTS 内核并添加 Android 专用补丁程序来构建的。2019 年,这一过程变成了从 android-mainline 中分支出新的 Android 通用内核。这种新模型以递增的方式构建内核,从而避免进行大量的向前移植和测试 Android 补丁程序的工作。android-mainline 会经过大量持续不断的测试,因此该模型可保证内核自发布之日起就具有很高的质量。

    当上游声明新的 LTS 时,相应的通用内核就会从 android-mainline 分支出来。由于通用内核来自于android-mainline,厂商可以在上游声明 LTS 版本之前,通过从 android-mainline 进行合并来开始项目。创建新的通用内核分支后,合作伙伴可以将合并来源无缝更改为新的分支。

    其他通用内核分支从其关联 LTS 内核接收定期合并。这通常会在 LTS 版本发布后立即执行。例如,Linux 4.19.64 发布后,便会合并到 4.19 通用内核(例如 android-4.19-q)中。强烈建议合作伙伴定期执行从通用内核到其产品内核的合并,以便及时获取最新的 LTS 和特定于 Android 的问题修复。

    总结一下,可以理解为android-mainline跟随着Linux kernel的mainline同步前进,每当一个LTS版本的内核发布,就会从mainline中分出一个对应的通用内核分支,来跟随该LTS版本前进,每当LTS版本更新时,新的release就会被尽快合并到对应的通用内核分支,通用内核中包含与 Android 社区相关的的补丁程序。

    现在我们已经知道Linux kernel发展和Android中的通用内核发展之间的关系了,那Android platform release(Android 10、11、12这种)和Android中的通用内核有什么关系呢?

    功能内核和启动内核

    目前 Android 通用内核也分以下两种:

    • 功能内核

      包含最新 Android 平台版本功能的增强内核称为功能内核。对于 Android 11,功能内核基于内核版本 4.14.y、4.19.y 和 5.4.y。在过去的平台版本中,功能内核与启动内核相同。但在 Android 12 中,将有两个功能内核和三个启动内核。

    • 启动内核

      指定的启动内核可用于启动搭载特定 Android 平台版本的设备。对于 Android 11,可以使用基于内核版本 4.14.y、4.19.y 和 5.4.y 的内核启动设备。

    每个 Android 平台版本都支持基于三个 Linux 内核版本中的任何一个启动新设备。如下表所示,Android 11 的启动内核为 android-4.14-stableandroid-4.19-stableandroid11-5.4

    由于更新平台版本时通常不需要升级内核,因此缺少平台版本最新功能的内核仍然可以用来启动设备。因此,即使设备上的平台版本已升级到 Android 11,为 Android 10 设计的内核(例如 android-4.19-q)也可以在设备上使用。从 Android 12 开始,为了控制必须支持的稳定版 KMI 的数量,功能内核的数量将少于启动内核的数量。

     

    通用内核分支类型

    通用内核分支目前分为以下三种

    • KMI kernel branch(目前)

      KMI kernel有着稳定的kenel Module Interface,KMI通过内核版本和Android platform release来定义,所以分支按照 <androidRelease>-<kernel version>来命名,比如Android 11的5.4 KMI内核被命名为android11-5.4.。对于Android 12来说,还有两个额外的KMI kernel:android12-5.4android12-5.10.

    • legacy(以前)

      • dessert kernel branch

        只有启动内核才会创建dessert kernel,只接受来自LTS的合并,不添加新的feature,比如android-4.9-q 只接收LTS 4.9.y 分支的合并。

        因为Android 11抛弃了dessert命名,所以本该命名为android-4.14-randroid-4.19-r的分支现在称为android-4.14-stableandroid-4.19-stable.从Android 11开始支持KMI kernel而不是dessert kernel,所以命名换成了上面说的KMI命名。

      • release kernel branch

        针对每一个启动内核出现新的Android platform release时进行创建release kernel,当对应的kernel或platform release被抛弃时,该分支也会被抛弃。他们不接受LTS的patch,所以minor number从不发生变化,只在每个月Android Security Bullentin发布时,进行bulletin上patch的更新。

        但是在Android 11和之后的平台,合作伙伴必须从 dessert 或 KMI 内核进行合并,才能应用 Android Security bulletin 中引用的补丁程序,因为对于 Android 11 或更高平台版本,不会再创建发布内核。

    上面都是来自于Android官方文档中的内容,有些概念实在过于绕。个人理解,一个Android平台可对应多个通用内核(一般是三个),通用内核分为功能内核和启动内核,如果是Android 11及以前,我们可以对功能内核和启动内核不做区分。还有一些通用内核层次结构、KMI分支生命周期、内核兼容性的问题可以参考官方文档

    目前我们大体了解了Linux和android之间的关系。总结一下就是,Android底层的kernel基于Linux kernel,维持了一个android-mainline分支和上游的Linux kernel mainline同步(该主线由Linus维护,经过9-10个周期会发布新的版本,期间会进行prepatch版本的发布,用来测试),每当一个新的LTS版本确立后,就会从android-mainline中分支出对应的通用内核分支,加上针对android社区的补丁程序,形成通用内核,每当上游的LTS版本更新时,该分支也会进行合并,不同的通用内核根据上层的android platform release进行相关工作,用于启动不同的android平台。例如4.14版本的通用内核针对android 10和android 11会有android-4.14-qandroid-4.14-stable两个分支,但其内部都是基于Linux kernel v4.14.x这个LTS分支。我们可以根据adb输入uname -r 来了解手机内部的Linux kernel版本,之后寻找通用内核分支版本进行源代码的查看。

    展开全文
  • 首先为了理解安卓系统是怎么工作的,就先来看一下android的系统架构,其架构大至可以分为四层:linux内核层、系统运行库层、应用框架层和应用层,那就先说说这几层。 1.linux内核层: Android系统是基于Linux内核...
  • 首先为了理解安卓系统是怎么工作的,就先来看一下android的系统架构,其架构大至可以分为四层:linux内核层、系统运行库层、应用框架层和应用层,那就先说说这几层。 1.linux内核层: Android系统...
  • AndroidLinux 关系

    千次阅读 2021-07-19 19:11:32
      AndroidLinux 关系密切,Android 采用 Linux 作为内核,对 Linux 内核做了一定修改,使其适应移动设备上的应用Android 开始时是作为 Linux 的一个分支,后来由于无法并入 Linux 的开发树,被 Linux 内核组...
  • 传统的linux系统中的程序基本都依赖于glibc(至于什么是glibc可以百度去),而右边AOSP(Android Open-Source Project)的程序基本都是依赖于Bionic(由谷歌公司开发类库,用来替代glibc)。这就决定了要想移植linux...
  • 一、 APK 加固原理、 1、 Android 应用反编译、 2、 ProGuard 混淆、 3、 多 dex 加载原理、 4、 代理 Application 开发、 5、Java 工具开发、 6、Application 替换、
  • SSH:Secure Shell 安全外壳协议 建立在应用层基础上的安全协议 可靠,转为远程登陆会话和其他网络服务提供安全性的协议 有效防止远程管理过程中的信息泄露问题 SSH客户端适用于多种平台 SSH服务端几乎支持所有UNIX...
  • 一、前置操作 ( 移植 FFMPEG )、 二、FFMPEG PCM 采样转为 MP3 格式的命令、 三、Android FFMPEG 混音源代码完整示例、 四、博客源码、
  • 关于Gradle的Android插件本文不会过多的说明,只给一个抛砖引玉的提示,详细使用参见文档API及Gradle配置,其实个性化的构建配置一般都是Gradle与Groovy的编写,与Android插件没太多关系...2 Android应用编译框架 ====.
  • 这是网易公开课 密西西比河谷州立大学:Android应用程序开发 的笔记,旨在
  • LINUX应用开发(面试)

    千次阅读 2017-07-12 17:15:00
    LINUX应用开发工程师职位 本试卷从考试酷examcoo网站导出,文件格式为mht,请用WORD/WPS打开,并另存为doc/docx格式后再使用 说明:应用开发可考察的点非常多,关键的还是C语言和数据结构,此份试卷中包括了一部分...
  • 1. 生成APK签名文件 1.1 使用keytool命令生成.jks 2. 查看签名文件的签名信息 3.1 用指定的keystore 签名apk 3.2 使用platform.x509.pem和platform.pk8对apk签名 3.3 使用集成IDE对APK签名 ...7. 应用中获取签名信息
  • 下面的代码行在Java(AndroidStudio)中完美运行,但是在c#(Xamarin)中返回错误。不知道出了什么问题。我是C#的新手private final int NONE = -1, TOUCH_TOP_FIRST = 0, TOUCH_TOP_SECOND = 1, TOUCH_BOT_THIRD = 2,...
  • 收到很多前段小伙伴私信,vue开发的项目如何打包成android、ios应用,那么今天就带大家走一遍vue开发的项目如何打包,然后如何发布成android、ios安装程序。安装在自己的手机上呢? vue-cli4搭建的项目如何打包 基于...
  • 一篇文章帮你快速通过Linux期末考试
  • image.png声明:本文只用于个人学习交流,若不慎造成侵权,请及时联系我,立即...常见的车载电子操作系统有:QNX、Linux(Android,AaliOS)、Windows CE、iOS等,此外还有一些非主流操作系统如Wind River和micro-ITR...
  • 本文带你了解Android应用开发之Android 系统启动原理(art 虚拟机),希望本文对大家学Android有所帮助。Android 系统启动原理(art 虚拟机)一、虚拟机的启动Android 是一个 Linux 的虚拟机,当虚拟机启动的时候,会...
  • Java平台最初的目标是为嵌入式设备提供一个软件环境。然而,历史的怪圈却让Java成为了企业软件开发的首选语言。...本文为读者展示如何在Android设备上部署JavaFX应用程序。 任何致力于客户端开
  • 是否要从单片机转为嵌入式Linux

    千次阅读 多人点赞 2019-05-30 16:23:43
    作者:嵌入式老鸟火哥 授权转载于公众号嵌入式...尽管火哥目前从事Linux/Android方面的嵌入式开发工作,但是读书的时候也有5年左右单片机裸机和RTOS经验,之前面试也拿过一些做单片机stm32开发的offer, 所以今天分...
  • 本节书摘来自异步社区《Android Studio应用开发实战详解》一书中的第1章,第1.4节AndroidLinux的关系,作者 王翠萍,更多章节内容可以访问云栖社区“异步社区”公众号查看 1.4 AndroidLinux的关系在了解Linux和...
  • Android应用开发编译框架流程与IDE及Gradle概要

    万次阅读 多人点赞 2015-11-07 19:24:43
    1 背景建议阅读本文之前先阅读《Android Studio入门到精通》和《Groovy脚本基础全攻略》及《Gradle脚本基础全攻略》三篇博客作为背景知识,这样才能更好、更系统的串起来。本文的核心就是下图:关于Gradle的Android...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,491
精华内容 1,796
关键字:

将安卓应用转为linux应用