怎么让Android系统或Android应用执行shell脚本
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么让Android系统或Android应用执行shell脚本相关的知识,希望对你有一定的参考价值。
一、android应用启动服务执行脚本1 如何写服务和脚本
在android源码根目录下有/device/tegatech/tegav2/init.rc文件相信大家对这个文件都不陌生(如果不明白就仔细研读下android启动流程)。如果在该脚本文件中添加诸如以下服务:
service usblp_test /data/setip/init.usblpmod.sh
oneshot
disabled
注解:每个设备下都会有自己对应的init.rc,init.设备名.rc脚本文件。oneshot disabled向我们说明了在系统启动的时候这个服务是不会自动启动的。并且该服务的目的是执行/data/setip/init.usblpmod.sh脚本。脚本的内容你可以随便写,只要符合shell语法就可以了,比如脚本可以是简单的设置eth0:
# ! /system/bin/sh //脚本的开头必须这样写。
Ifconfig eth0 172.16.100.206 netmask 255.255.0.0 up//设置ip的命令
2、如何在应用中启动服务
1)首先了解下在服务启动的流程
1. 在你的应用中让init.rc中添加的服务启动起来。
首先了解下在服务启动的流程:
在设备目录下的init.c(切记并不是system/core/init/init.rc)
Main函数的for(;;)循环中有一个handle_property_set_fd(),函数:
for (i = 0; i < fd_count; i++)
if (ufds[i].revents == POLLIN)
if (ufds[i].fd == get_property_set_fd())
handle_property_set_fd();
else if (ufds[i].fd == get_keychord_fd())
handle_keychord();
else if (ufds[i].fd == get_signal_fd())
handle_signal();
这个函数的实现也在system/core/init目录下,该函数中的check_control_perms(msg.value, cr.uid, cr.gid)函数就是检查该uid是否有权限启动服务(msg.value就是你服务的名字),如果应用为root或system用户则直接返回1.之后就是调用handle_control_message((char*) msg.name + 4, (char*) msg.value),该函数的参数就是去掉1.ctl.后的start和2.你服务的名字。这个函数的详细内容:
void handle_control_message(const char *msg, const char *arg)
if (!strcmp(msg,"start"))
msg_start(arg);
else if (!strcmp(msg,"stop"))
msg_stop(arg);
else if (!strcmp(msg,"restart"))
msg_stop(arg);
msg_start(arg);
else
ERROR("unknown control msg '%s'\n", msg);
匹配start后调用msg_start.服务就这样起来了,我们的解决方案就是在检查权限的地方“下点功夫”,因为我们不确定uid,所以就让check_control_perms这个函数不要检查我们的uid,直接检查我们服务的名字,看看这个函数:
static int check_control_perms(const char *name, unsigned int uid, unsigned int gid)
int i;
if (uid == AID_SYSTEM || uid == AID_ROOT)
return 1;
/* Search the ACL */
for (i = 0; control_perms[i].service; i++)
if (strcmp(control_perms[i].service, name) == 0)
if ((uid && control_perms[i].uid == uid) ||
(gid && control_perms[i].gid == gid))
return 1;
return 0;
这个函数里面是必须要检查uid的,我们只要在for循环上写上。
if(strcmp(“usblp_test”,name)==0) //usblp_test就是我们服务的名字。
return 1;
这样做不会破坏android原本的结构,不会有什么副作用。
init.c和init.rc都改好了,现在就可以编译源码了,编译好了装到机子开发板上就可以了。 参考技术A android中执行shell有两种方式:
直接在代码中用java提供的Runtime 这个类来执行命令,以下为完整示例代码。
public void execCommand(String command) throws IOException
// start the ls command running
//String[] args = new String[]"sh", "-c", command;
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec(command); //这句话就是shell与高级语言间的调用
//如果有参数的话可以用另外一个被重载的exec方法
//实际上这样执行时启动了一个子进程,它没有父进程的控制台
//也就看不到输出,所以需要用输出流来得到shell执行后的输出
InputStream inputstream = proc.getInputStream();
InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
// read the ls output
String line = "";
StringBuilder sb = new StringBuilder(line);
while ((line = bufferedreader.readLine()) != null)
//System.out.println(line);
sb.append(line);
sb.append('\n');
//tv.setText(sb.toString());
//使用exec执行不会等执行成功以后才返回,它会立即返回
//所以在某些情况下是很要命的(比如复制文件的时候)
//使用wairFor()可以等待命令执行完成以后才返回
try
if (proc.waitFor() != 0)
System.err.println("exit value = " + proc.exitValue());
catch (InterruptedException e)
System.err.println(e);
2.直接安装shell模拟器,即已经开发好的android应用,启动后类似windows的dos命令行,可以直接安装使用,可执行常用的linux命令,应用在附件。
如何在android中为按钮设置动画?
【中文标题】如何在android中为按钮设置动画?【英文标题】:How to animate button in android? 【发布时间】:2013-08-14 00:57:04 【问题描述】:我正在制作一个 android 应用程序,并且我有一个按钮可以通向一个消息传递位置。在带有按钮的 Activity 上,我检查是否有任何未读消息,如果有,我想对按钮执行一些操作,让用户知道有未读消息。
我正在考虑让按钮水平振动,例如每 2 或 3 秒摇晃 3 次。
我知道如何在后台运行一个线程,它每 x 毫秒执行一次。但是我不知道该怎么做就是水平摇晃它3次。
有人可以帮忙吗?
我正在考虑使用 sin 函数,对于动画,我可以使用 sin 函数的输出来获取上下的值,我可以设置按钮的水平位置......但这似乎也是极端,有没有更好的方法?
【问题讨论】:
你想要动画还是按钮按下效果?? 【参考方案1】:我无法评论 @omega 的评论,因为我没有足够的声誉,但该问题的答案应该是这样的:
shake.xml
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="100" <!-- how long the animation lasts -->
android:fromDegrees="-5" <!-- how far to swing left -->
android:pivotX="50%" <!-- pivot from horizontal center -->
android:pivotY="50%" <!-- pivot from vertical center -->
android:repeatCount="10" <!-- how many times to swing back and forth -->
android:repeatMode="reverse" <!-- to make the animation go the other way -->
android:toDegrees="5" /> <!-- how far to swing right -->
Class.java
Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake);
view.startAnimation(shake);
这只是做你想做的事情的一种方式,可能还有更好的方法。
【讨论】:
如何横向摇晃?【参考方案2】:在动画文件夹中创建shake.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="10"
android:duration="1000"
android:interpolator="@anim/cycle" />
和 anim 文件夹中的 cycle.xml
<?xml version="1.0" encoding="utf-8"?>
<cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
android:cycles="4" />
现在在您的代码中添加动画
Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake);
anyview.startAnimation(shake);
如果你想要垂直动画,将fromXdelta和toXdelta值改为fromYdelta和toYdelta值
【讨论】:
这只是让它移动right
然后立即回到原始位置4次,但是我如何让它移动right
然后left
,然后right
然后@987654328 @像摇晃效果一样回到原来的位置?
如何让这个动画连续发生?
这个答案对我在 android 中实现类似抖动的动画很有帮助。
嘿@RVG 感谢代码,但是如何更改摇动速度?【参考方案3】:
类.Java
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_with_the_button);
final Animation myAnim = AnimationUtils.loadAnimation(this, R.anim.milkshake);
Button myButton = (Button) findViewById(R.id.new_game_btn);
myButton.setAnimation(myAnim);
对于onClick的按钮
myButton.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
v.startAnimation(myAnim);
);
在res目录下创建anim文件夹
右键,res -> New -> Directory
为新目录命名 anim
创建一个新的 xml 文件,将其命名为 milkshake
milkshake.xml
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="100"
android:fromDegrees="-5"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="10"
android:repeatMode="reverse"
android:toDegrees="5" />
【讨论】:
【参考方案4】:import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Transformation;
public class HeightAnimation extends Animation
protected final int originalHeight;
protected final View view;
protected float perValue;
public HeightAnimation(View view, int fromHeight, int toHeight)
this.view = view;
this.originalHeight = fromHeight;
this.perValue = (toHeight - fromHeight);
@Override
protected void applyTransformation(float interpolatedTime, Transformation t)
view.getLayoutParams().height = (int) (originalHeight + perValue * interpolatedTime);
view.requestLayout();
@Override
public boolean willChangeBounds()
return true;
我们去:
HeightAnimation heightAnim = new HeightAnimation(view, view.getHeight(), viewPager.getHeight() - otherView.getHeight());
heightAnim.setDuration(1000);
view.startAnimation(heightAnim);
【讨论】:
【参考方案5】:依赖
将它添加到您的根 build.gradle 的存储库末尾:
allprojects
repositories
...
maven url "https://jitpack.io"
然后添加依赖
dependencies
compile 'com.github.varunest:sparkbutton:1.0.5'
用法
XML
<com.varunest.sparkbutton.SparkButton
android:id="@+id/spark_button"
android:layout_
android:layout_
app:sparkbutton_activeImage="@drawable/active_image"
app:sparkbutton_inActiveImage="@drawable/inactive_image"
app:sparkbutton_iconSize="40dp"
app:sparkbutton_primaryColor="@color/primary_color"
app:sparkbutton_secondaryColor="@color/secondary_color" />
Java(可选)
SparkButton button = new SparkButtonBuilder(context)
.setActiveImage(R.drawable.active_image)
.setInActiveImage(R.drawable.inactive_image)
.setDisabledImage(R.drawable.disabled_image)
.setImageSizePx(getResources().getDimensionPixelOffset(R.dimen.button_size))
.setPrimaryColor(ContextCompat.getColor(context, R.color.primary_color))
.setSecondaryColor(ContextCompat.getColor(context, R.color.secondary_color))
.build();
【讨论】:
【参考方案6】:在 Kotlin 中,在 XML 之后是这样的:
定义视图:
val playDel = findViewById<ImageView>(R.id.player_del)
查找动画:来自 Android Lib 的此处
val imgAnim = AnimationUtils.loadAnimation(this, android.R.anim.fade_out)
连接到视图
playDel.animation=imgAnim
【讨论】:
【参考方案7】:首先创建shake.xml
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="100"
android:fromDegrees="-5"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="10"
android:repeatMode="reverse"
android:toDegrees="5" />
类.java
Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake);
view.startAnimation(shake);
【讨论】:
以上是关于怎么让Android系统或Android应用执行shell脚本的主要内容,如果未能解决你的问题,请参考以下文章