Android系统启动之init.rc文件解析过程

Android系统启动之init.rc文件解析过程,第1张

第一篇: Android系统启动之bootloader

第二篇: Android系统启动之Init流程(上)

第三篇: Android系统启动之Init流程(下)

第四篇: Android系统启动之init.rc文件解析过程

第五篇: Android系统启动之zyogte进程

第六篇: Android系判哗统启动之zyogte进程java(上)

第七篇: Android系统启动之zyogte进程java(下)

第八篇: Android系统启动之SystemServer

Android init.rc文件由系统第一个启动的init程序解析。是启动系统服务使用的文件。

主要包含了四种类型的语句:

Action和services显式声明了一个语句块,而commands和options属于最近声明的语句块。

在第一个语句块之前 的commands和options会被忽略.

基本规则如下:

动掘蚂行作表示了一组命令(commands)组成.动作包括一个触发器,决定了何时运行这个动作。

注意: 当触发器的条件满足时,这个动作会被增加到已被运行的队列尾。假设此动作在队列中已经存在,那么它将不会运行.

一个动作所包括的命令将被依次运行。

在"动作"(action)里面的,on后面物隐跟着的字符串是触发器(trigger),trigger是一个用于匹配某种事件类型的字符串,它将对应的Action的执行。

触发器(trigger)有几种格式:

常见的格式:

command是action的命令列表中的命令,或者是service中的选项 onrestart 的参数命令.

命令将在所属事件发生时被一个个地执行.

常见命令:

服务是指那些须要在系统初始化时就启动或退出时自己主动重新启动的程序.

解释一下各个参数:

options是Service的修订项。它们决定一个服务何时以及如何运行.

使用例子:

源码路径 system/core/init/init.cpp 中:

开始解析rc文件.

ParseConfig函数在文件 core/init/init_parser.cpp 140行:

ParseConfigFile函数:

Android init.rc文件浅析

安卓系统启动--3init.rc解析

init.rc深入学习

Android开发环境对每一个需要Release的APK都会进行签名,在APK文件被安装时,Android系统会对APK的签名信息进行比对,以此来判断程序的完整性,最终确定APK是否可以正常安装使用,一定程度上达到安全的目的。

给一个APK文件的后缀名从.apk改为.zip或者.rar,然后利用解压工具进行解压,我们会在META-INF目录下看到四个文件: MANIFEST.MF、CERT.SF、INDEX.LIST、CERT.RSA

MANIFEST.MF(摘要文件): 程序遍历APK包中的所有文件,对非文件夹非签名文件的文件,逐个用SHA1生成摘要信息,再用Base64进行编码。樱棚如果APK包的文件被修改,在APK安装校验时,被修改的文件与MANIFEST.MF的校验信息不同,脊猜则程序将无法正常安装。

CERT.SF(对摘要文件的签名文件): 对于生成的MANIFEST.MF文件利用SHA1-RSA算法对开发者的私钥进行签名。在安装时只有公共密钥才能对其解密。解密之后将其与未加密的摘要信息进行比对,如果相符则文件没有被修改。

INDEX.LIST APK索引文件目录

CERT.RSA   保存公钥、加密算法等信息。

在APK进行安装时,可以通过MANIFEST.MF文件开始的环兆蠢环相扣来保证APK的安全性。但这些文件或者密钥如果被攻击者得到或者被攻击者通过某些技术手段攻破,则Android *** 作系统无法验证其安全性。

最近开始学习辩颤做Android下的封装和解封装技术,熟悉MediaExtractor和MediaMuxer的使携衡用。

1、MainActivity.java文件:

packagecom.example.tongjiangsong.mediaextractmuxer

importandroid.support.v7.app.AppCompatActivity

importandroid.os.Bundle

importandroid.view.View

importandroid.widget.Button

publicclassMainActivityextendsAppCompatActivity{

privateButton button

@Override

protectedvoidonCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_main)

        button = (Button)findViewById(R.id.button)

button.setOnClickListener(newView.OnClickListener() {

@Override

publicvoidonClick(View v){

newExtractorMuxerThread().start()

     洞御       }

        })

    }

}

2、ExtractorMuxerThread.java文件:

packagecom.example.tongjiangsong.mediaextractmuxer

importandroid.media.MediaCodec

importandroid.media.MediaExtractor

importandroid.media.MediaFormat

importandroid.media.MediaMuxer

importandroid.os.Environment

importandroid.widget.Toast

importjava.io.IOException

importjava.nio.ByteBuffer

importandroid.view.View

publicclassExtractorMuxerThreadextendsThread{

@Override

publicvoidrun(){

super.run()

        mixer()

    }

publicvoidmixer(){

MediaExtractor videoExtractor =null

MediaExtractor audioExtractor =null

MediaMuxer mixMediaMuxer =null

String outputVideoFilePath = Environment.getExternalStorageDirectory().getAbsolutePath()+"/people.mp4"

String outputAudioFilePath = Environment.getExternalStorageDirectory().getAbsolutePath()+"/qishi.aac"

String outputFilePath = Environment.getExternalStorageDirectory().getAbsolutePath()+"/mixer.mp4"

try{

videoExtractor =newMediaExtractor()

            videoExtractor.setDataSource(outputVideoFilePath)

intvideoIndex = -1

MediaFormat videoTrackFormat =null

inttrackCount = videoExtractor.getTrackCount()

for(inti =0i <trackCounti++) {

                videoTrackFormat = videoExtractor.getTrackFormat(i)

if(videoTrackFormat.getString(MediaFormat.KEY_MIME).startsWith("video/")) {

                    videoIndex = i

break

                }

            }

audioExtractor =newMediaExtractor()

            audioExtractor.setDataSource(outputAudioFilePath)

intaudioIndex = -1

MediaFormat audioTrackFormat =null

            trackCount = audioExtractor.getTrackCount()

for(inti =0i <trackCounti++) {

                audioTrackFormat = audioExtractor.getTrackFormat(i)

if(audioTrackFormat.getString(MediaFormat.KEY_MIME).startsWith("audio/")) {

                    audioIndex = i

break

                }

            }

            videoExtractor.selectTrack(videoIndex)

            audioExtractor.selectTrack(audioIndex)

MediaCodec.BufferInfo videoBufferInfo =newMediaCodec.BufferInfo()

MediaCodec.BufferInfo audioBufferInfo =newMediaCodec.BufferInfo()

mixMediaMuxer =newMediaMuxer(outputFilePath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4)

intvideoTrackIndex = mixMediaMuxer.addTrack(videoTrackFormat)

intaudioTrackIndex = mixMediaMuxer.addTrack(audioTrackFormat)

            mixMediaMuxer.start()

ByteBuffer byteBuffer = ByteBuffer.allocate(1024*1024)

longvideotime

longaudiotime

            {

videoExtractor.readSampleData(byteBuffer,0)

if(videoExtractor.getSampleFlags() == MediaExtractor.SAMPLE_FLAG_SYNC) {

                    videoExtractor.advance()

                }

videoExtractor.readSampleData(byteBuffer,0)

longsampleTime = videoExtractor.getSampleTime()

                videoExtractor.advance()

videoExtractor.readSampleData(byteBuffer,0)

longsampleTime1 = videoExtractor.getSampleTime()

                videoExtractor.advance()

                videotime = Math.abs(sampleTime - sampleTime1)

            }

            {

audioExtractor.readSampleData(byteBuffer,0)

if(audioExtractor.getSampleFlags() == MediaExtractor.SAMPLE_FLAG_SYNC) {

                    audioExtractor.advance()

                }

audioExtractor.readSampleData(byteBuffer,0)

longsampleTime = audioExtractor.getSampleTime()

                audioExtractor.advance()

audioExtractor.readSampleData(byteBuffer,0)

longsampleTime1 = audioExtractor.getSampleTime()

                audioExtractor.advance()

                audiotime = Math.abs(sampleTime - sampleTime1)

            }

            videoExtractor.unselectTrack(videoIndex)

            videoExtractor.selectTrack(videoIndex)

while(true) {

intdata = videoExtractor.readSampleData(byteBuffer,0)

if(data <0) {

break

                }

                videoBufferInfo.size = data

                videoBufferInfo.presentationTimeUs += videotime

videoBufferInfo.offset =0

                videoBufferInfo.flags = videoExtractor.getSampleFlags()

                mixMediaMuxer.writeSampleData(videoTrackIndex, byteBuffer, videoBufferInfo)

                videoExtractor.advance()

            }

while(true) {

intdata = audioExtractor.readSampleData(byteBuffer,0)

if(data <0) {

break

                }

                audioBufferInfo.size = data

                audioBufferInfo.presentationTimeUs += audiotime

audioBufferInfo.offset =0

                audioBufferInfo.flags = audioExtractor.getSampleFlags()

                mixMediaMuxer.writeSampleData(audioTrackIndex, byteBuffer, audioBufferInfo)

                audioExtractor.advance()

            }

}catch(IOException e) {

            e.printStackTrace()

}finally{

if(mixMediaMuxer !=null) {

                mixMediaMuxer.stop()

                mixMediaMuxer.release()

            }

if(videoExtractor !=null){

                videoExtractor.release()

            }

if(audioExtractor !=null){

                audioExtractor.release()

            }

        }

    }

}

3、activity_main.xml文件:

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".MainActivity">

    <Button

android:id="@+id/button"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="解封装和封装!"

app:layout_constraintBottom_toBottomOf="parent"

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintRight_toRightOf="parent"

app:layout_constraintTop_toTopOf="parent"/>

</android.support.constraint.ConstraintLayout>

4、权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12205360.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存