第一篇: 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" />
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)