扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
网络的问题。shell脚本打开蓝牙多数是网络连接异常导致。
成都创新互联专注于南浔网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供南浔营销型网站建设,南浔网站制作、南浔网页设计、南浔网站官网定制、小程序定制开发服务,打造南浔网络公司原创品牌,更为您提供南浔网站排名全网营销落地服务。
1、首先打开电脑检查网络。
2、其次打开android程序进行测试网络连接是否异常。
3、最后重新连接网络后重新登录该程序即可。
一、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都改好了,现在就可以编译源码了,编译好了装到机子开发板上就可以了
该脚本是我在独立开发过程中,为了提升 Android 应用打包和运营的效率而开发的脚本。项目地址是,
如项目中的语言构成展示的,该脚本完全使用 Python 语言开发完成。
使用起来非常简单,首先你要准备如下的环境,
然后,通过编辑配置文件 config.yml 对脚本进行配置。比如,
YAML 格式也不算新颖,早在几年之前的 SpringBoot 里面就已经采用了这种格式。相比于使用 json 或者 properties 等格式的配置文件,它更加简洁。
1、使用 gradle 指令自动打包,区分 32 位和 64 位 :因为现在有些应用市场明确要求区分 32 位和 64 位,所以,打包的时候要分开进行打包。
2、打包完成之后将 APK 拷贝到指定的目录 :主要用来做本地的 APK 文件备份,后面也会用这里拷贝的 APK 文件进行自动化加固。
3、使用 diffuse 输出相对于上一个版本的 APK 版本差异报告 :diffuse 是 JakeWharton 开发的 APK, AAB, AAR 和 JAR 的对比工具。这里我用它对比当前版本和上一个版本的 APK 的信息,以实现对 APK 质量的监控。diffuse 项目的地址是
3、拷贝多语言资源到指定的目录,并自动提交到 Github 仓库以便于协助翻译 :对做国际化的应用的开发者而言,我们可以通过应用内的协助翻译功能借助社区的力量实现应用的多语言。这里我尽量将这个过程做得更加自动化。即在应用打包完成之后将应用内的多语言资源按照版本信息拷贝到指定的目录下。然后使用 Git 工具将其推送到 Github 等。具体的效果可以参考 .
4、自动打 tag 并提交到远程仓库 :该功能用来在打包完成之后使用为当前版本添加 Git tag,以便于后续根据版本回滚到指定的 Git 提交记录。
5、根据 Git 提交记录自动生成更新日志 :上面做了为项目自动添加 Git tag 的功能之后,我们可以根据当前版本到上一版本之间的 Git 提交记录的 comment 信息自动生成版本更新日志。虽然,这个这样生成的更新日志并不能直接用作发布时的更新记录,但在至少可以让我们直观得看到这个版本修改了什么。
6、使用 360 加固 对上述 APK 进行加固并输出到指定的目录 :加固操作其实非常简单,只需要一个 command 指令就可以完成了,
不过在使用上述命令之前需要先通过 GUI 的形式修改你在 360 加固中的渠道和签名信息(直接手动改文件也可以)。
7、上传打包 APK 到蓝奏云 :蓝奏云是现在很多开发者用来分享软件的一个云存储平台,100M 以下的文件可以免费存储,类似于百度云。上传蓝奏云之前需要先修改配置文件,
这里需要填入的 ylogin 和 phpdisk_info 可以在登录之后通过 Chrome 的开发工具查看 cookie 信息得到。目前能够做到自动化的一个方案就是使用上述两个信息。
8、通过 Telegram bot 将打包完成的渠道包和更新日志信息发送到 Telegram 群组 :对海外的用户我们可以通过 Telegram 作为一个交流的渠道。Telegram 是一个非常好用的聊天软件。它提供了 bot 功能,即一个可以推送消息的机器人。我们可以通过这个功能来在群组中推送消息、图片和文件。Telegram 的 bot 有非常强大的自定义性。其实我们完全可以基于爬虫和 bot 维护一个社区,然后通过在社区内推送广告来获得一些利益。这也不失为一个赚钱的渠道。使用 Telegram bot 之前需要在配置文件中填入如下信息,
这里的 token 是注册 bot 的时候得到的信息。chat_id 可以通过如下方式获取到:
即将 token 信息填入到上述 YourBOTToken 处。在返回的 json 结果中可以获取到 chat id 信息。
向群组推送信息的方式非常简单,一个 http 请求即可完成,
更多的协议可以参考这个文档:
9、完成上述操作之后使用邮件通知打包结果 :最后就是在完成了最终的打包操作之后通过 Email 发送一封邮件,内部包含了本次打包的 diff 信息等给指定的用户。使用邮件功能需要在配置文件中填写,
这里我们使用的是 QQ 邮箱来发送邮件。这里需要填写的 user 和 password 字段分别是邮箱和开通 smtp 服务时系统提供的密码信息。QQ 邮箱开通 SMTP 服务器其 官方文档 即可。
上述是该打包脚本的主要功能。后续我会添加更多功能。因为时间有限,有些功能需要修改一下才能使用。不过,许多功能我都封装成了独立的 Python 脚本,如果需要的话可以自己做细微的修改。对于这个脚本,如果你有更好的建议和想法,可以跟我交流~
android 官方说明
Android Init 语言由四大类语句组成,它们是 Actions、Commands、Services 和 Options。
所有这些都是面向行的,由空格分隔的标记组成。 c 样式的反斜杠转义可用于将空格插入到标记中。 双引号也可用于防止空格将文本分成多个标记。 反斜杠,当它是一行的最后一个字符时,可以用于换行。
以 # 开头的行(允许前导空格)是注释。
Actions 和 Services 隐式声明了一个新部分。 所有Commands或Options都属于最近声明的部分。 第一部分之前的Commands或Options将被忽略。
Actions 和Services 具有唯一的名称。 如果第二个 Action 或 Service 被声明为与现有的同名,则将其作为错误忽略。 (???我们应该覆盖而不是)
Actions 是命名的命令序列。 Actions 有一个触发器,用于确定动作何时发生。 当发生与Actions 的触发器匹配的事件时,该Actions 将添加到待执行队列的尾部(除非它已经在队列中)。
队列中的每个 action 都按顺序出队,并且该动作中的每个命令都按顺序执行。 Init 在活动中的命令执行“之间”处理其他活动(设备创建/销毁、属性设置、进程重 启)。
命令采取以下形式:
服务是在它们退出时启动并(可选)重新启动的程序。
服务采取以下形式:
选项是服务的调节器。他们影响init进程如何并且何时运行这个服务。
触发器是可用于匹配某些类型的字符串
事件并用于导致动作发生。
boot
这是 init 启动时将发生的第一个触发器
(在 /init.conf 加载后)
name=value
设置属性 name 时会发生这种形式的触发器
到特定值 value。
device-added-path
device-removed-path/pre
添加设备节点时会发生这些形式的触发器
或删除。
service-exited-name
这种形式的触发器在指定的服务退出时发生。
问题:需要通过shell脚本,执行“setprop rild.libargs -d /dev/ttyUSB2”命令,即:设置rild.libargs=-d /dev/ttyUSB2。
写法:
LTE_ARGS="rild.libargs"
DATA_PATH="-d /dev/ttyUSB2"
DATA_PATH2="-d /dev/ttyUSB3"
setprop " DATA_PATH"
说明:上面将$DATA_PATH加了双引号,即把“-d /dev/ttyUSB2”当做一个整体,如果不加的话会提示:“setprop: Max 2 arguments”。
android要执行脚本,只有通过本地的webview打开脚本页面。
调用步骤
1、设置webview支持脚本
webSettings.setJavaScriptEnabled(true);
2、打开脚本页面
mWebView.loadUrl("");//这里打开该app的asset目录下的demo.html,里面含有wave函数脚本
3、调用脚本
mWebView.loadUrl("javascript:wave()");//调用打开页面中的wave函数
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流