Pik,一行代码集成主流SDK

作者: StormFeng | 来源:发表于2018-03-01 16:03 被阅读290次

关于Pik


Pik的出现,是为了将开发和SDK完全分开,开发只需要关注方法的调用和回调的处理,Pik充当一个中间人和劳动者的角色,完成SDK的集成。

Pik到底方便在哪里


开发背景

app集成QQ登录

常规做法

我们通常要去腾讯开放平台下载官方SDK,参考文档先是配置工程,又创建实例调用方法,又创建回调方法...或者自己已经对SDK进行了封装,只需要把代码拷到新工程就可以了,当然这对一个有一两年开发经验的也不过是分分钟的事儿。

续:开发背景

别高兴的太早,你上级领导说别的app都有微信登录、分享、支付,怎么我们没有,你二话不说,默默打开了微信开放平台...你上级领导又说了,支付宝这么方便你不用,你似不似傻,你叹了口气,又打开了支付宝开放平台...领导觉得还不过瘾,友盟、百度、高德、极光...

Pik是这样做的

然而在Pik里,你只需要这样:
PikSDK.getInstance().login_qq();
领导,可以QQ登录了...
PikSDK.getInstance().share_qq(params);
领导,可以QQ分享了...
PikSDK.getInstance().login_wechat();
领导,可以微信登录了...
PikSDK.getInstance().pay_wechat(orderJson);
领导,可以微信支付了...
PikSDK.getInstance().pay_alipy(this, payInfo);
领导,可以支付宝支付了...
...

领导摸着你的腿:你就是人人称赞的小王吧,来,这个月给你涨的工资...

详谈Pik


集成步骤
  1. 将sdk.jar拷贝到工程libs目录下,设置工程依赖
  2. AndroidManifest.xml中配置application节点信息
    android:name="com.w.pik.sdk.PikApplication"
    注:如果工程没有特定的Application,可直接使用PikApplication,如果有,可以继承PikApplication,或者在自己Application的onCreate方法中实现PikSDK.getInstance().onAppCreate(this)
  3. 在工程主Activity中调用
    PikSDK.getInstance().init(this)
  4. 在需要登录、分享、支付...的地方调用相应的方法即可。注意,实现这些方法的Activity要继承PikBaseActivity,重写onResult方法实现回调监听(Demo以QQ集成为例,完整演示使用方法)
  5. 打包生成 app.apk。(重要:Android studio 3.0及以上版本请在gradle.properties文件中添加android.enableAapt2=false)
项目配置
  1. 在Pik工具目录下的game文件夹中新建demo文件夹,将app.apk和签名文件key.jks拷贝到demo目录下。
  2. config.xml模板文件中配置需要集成的插件和签名文件的密码、别名
  3. Pik\plugin\tencent文件夹下的SDKManifest.xml文件中配置自己在腾讯开放平台申请的APPID
  4. 双击Pik目录下的Pik.bat即可自动将集成插件,在output文件夹下生成最终的签名apk。

结语


Pik工具似乎更适合经常需要集成第三方SDK的开发人员,完全剥离开发对第三方SDK的接触,只需要关注一些必须的APPID、APPSECRET...就可以同时集成任意多的SDK。

1、Demo地址:https://github.com/StormFeng/PikDemo.git
2、Pik工具地址:https://github.com/StormFeng/PikTool.git
3、联系方式:QQ 1170017470



2018.4.27 补充,Pik工具原理说明

别说话,先看一个再简单不过的例子: Hello world!

<!--布局文件-->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"/>

</LinearLayout>

<!--strings资源文件-->
<resources>
    <string name="hello_world">Hello World!</string>
</resources>

APP是这样子的:


MainActivity.jpg

嗯,客户说这界面纤毫毕现,回味无穷,韵味十足,耐人寻味,情景再现,精妙绝伦...可以发布啦!
于是你迫不及待的将打包后的app.apk发布到应用商店...
结果这款APP上架没多加竟异常火爆,引起了人们的广泛关注,这其中就有一个名叫尼欧的不法分子,尼欧专注捣蛋很多年,他默默的下载了这款app,用 apktool 工具反编译 app.apk ,得到下面这些文件:


app.apk内容.jpg
在res/values文件夹中尼欧发现了 strings.xml ,他打开这个文件,将其中的 “Hello World!” 改写成了 “Fuck The World!”。然后用 apktool 工具回编译得到apk文件后重新签名,上传到一个钓鱼网站上面...几天后,客户给你留言:"I will fuck you to die before you fuck the world..."

经过这次事件之后,虽然你背了锅被老板炒了鱿鱼,但是一个大胆的想法在你脑海中开始酝酿:如果我修改了smali文件夹中的内容会怎样?
你新建了一个工程,界面中有一个Button,点击之后会执行某种特异功能,什么特异功能?鬼才知道呢,你自己都没想好。于是,界面是这样的:


Button.jpg

工程中只有两个类:


类.jpg
MainActivity:
ublic class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void onClick(View view){
        UtilInterface util = null;
        try {
            util = (UtilInterface) Class.forName("com.example.administrator.test.Util").newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        if(util!=null){
            util.doSomeThing();
        }
    }
}

UtilInterface:

public interface UtilInterface {
    void doSomeThing();
}

这能干屌?这当然屌都不能干!工程中没有Util类,所以在onClick方法中会报无法找到类异常。但是你用接口抽象了这个点击的动作,给你以后扩展app的功能带来了无限的可能。
某天,你新交了一个小你18岁的女友,肤白貌美笑如花,你的心里乐呱呱,一高兴写了个Util类实现UtilInterface:

public class Util implements UtilInterface{
    @Override
    public void doSomeThing() {
        Log.d("Pik", "Love the world!");
    }
}

本来,反编译上面的抽象工程后得到的smali文件是这样的:


smali.jpg

你把上面的Util反编译后得到的 Util.smali 也放到这里面,然后回编译,之前报找不到类的异常竟然可以工作了,还嗲嗲的跟你说了声"Love the world!"
但,你小女友的爹地不乐意了,他觉得你们两个称兄道弟,你却想上他女儿,硬生生把你俩给拆散了,你悲痛万分,欲死欲仙,额!不对,欲死不能,到处发泄,又写了个Util类实现UtilInterface:

public class Util implements UtilInterface{
    @Override
    public void doSomeThing() {
        Log.d("Pik", "Fuck the world again and again!");
    }
}

得到Util.smali后,同样回编译,点击按钮之后你觉得泄愤了很爽!
于是,你把两次写的Util分别保存下来,爽的时候就Love,不爽的时候就Fuck!


思考

如果工程中你有这样的一个接口:

public interface IPikWechatUser {
    void login();
    void share(String content, String description, PikWXShareTarget target);
    void share(Bitmap bitmap, PikWXShareTarget target);
    void share(String url, String title, String description, Bitmap thumb, PikWXShareType type, PikWXShareTarget target);
    void pay(String s);
}

app1, app2, app3 ... 都有这些功能的调用,那么,这些功能只需要一次实现,然后反编译扩展到这些app就可以了吧。
如果上面这些工作都有脚本来执行,我们只需要配置需要用到的插件,SDK的相关id、key等信息,岂不是更方便!

最后

幸运的是,Pik就是用python写的脚本,不但将这仅仅只需要一次实现的事情做了,还承担了反编译、补充资源、补充smali文件...的功能,开发人员只需接入抽象层,和打包工具的配置
PS:最近工作有点忙,有空会把打包工具重新整理,加更多的功能(修改包名,修改app名,多渠道打包等等),写一份使用说明出来供大家批评指点,谢谢关注!

相关文章

  • Pik,一行代码集成主流SDK

    关于Pik Pik的出现,是为了将开发和SDK完全分开,开发只需要关注方法的调用和回调的处理,Pik充当一个中间人...

  • 广告sdk进度

    广告SDK0.1.alpha 当前完成进度 Banner集成完毕 集成 静默安装代码 Native 集成完毕 广告...

  • [iOS]一行代码集成空白页面占位图(基于runtime+MJR

    [iOS]一行代码集成空白页面占位图(基于runtime+MJRefresh思想) [iOS]一行代码集成空白页面...

  • iOS 无需SDK,一行代码调用主流地图

    在开发中,有时候我们并不需要太过于复杂的地图功能,或许只需要调用系统地图、高德、百度等主流地图就可以完成我们所需要...

  • grunt笔记篇

    主流前端集成方案 Yeoman webapp集成脚手架工具:代码校验,测试,压缩 Bower: 下载管理框架、库 ...

  • 微信APP支付-2 集成SDK

    官方文档 一、集成SDK 手动集成或者使用pod集成微信App支付的SDK,SDK文件包括 libWeChatSD...

  • Intellij IDEA 2017.3 中文翻译

    Intellij IDEA 是目前主流的代码编辑软件,也就是集成开发环境。集成开发环境现在的确是越来越集成到项目中...

  • Vin码识别汽车后市场

    Vin码扫描识别sdk技术产品简介 Vin码识别技术可支持Android、iOS主流移动操作系统,APP集成VIN...

  • 支付宝集成

    支付宝集成 一、相关文档 1. SDK集成流程 2. SDK下载地址 二、SDK集成流程 1. 2. 3. 自己制...

  • iOS Facebook 分享中的坑

    示例代码在末尾。示例代码在末尾。 今天用了Facebook的SDK,给app集成分享功能。本以为只要照着官方文档来...

网友评论

  • a6393228bea9:不需要去开发平台申请应用的话,怎么在分享的时候显示图标呢:cry:
    a6393228bea9:@StormFeng 原来如此
    StormFeng:各平台的APPID, APPKEY等信息还是需要申请的,这里简化的只是SDK集成工作
  • fangkyi03:这边其实还有一个问题 假设你以后功能非常多 集成了很多的sdk 但是我只用到里面的两个 比如微信 支付宝 但是打包的时候依旧会把所有的sdk都打包进去增大体积 不知道这点你要咋解决呢
    StormFeng:文章中 项目配置 的第二条:在config.xml模板文件中配置需要集成的插件和签名文件的密码、别名,当然不会没有用到的SDK也集成进去,这里是可选的,需要自己在配置文件里说明一下
  • fangkyi03:啥时候支持ios 到时候可以集成到rn里面
    StormFeng::broken_heart: 可惜我不会IOS
  • Syvvvvvv:这个需要收费吗?
    StormFeng:demo是免费的,最近没有精力去弄,后面闲的时候我会把脚本优化下,放出更多常用的常用的SDK的
  • lfork:强
  • 旧巷听风雨染尘:👍强,回头试试
    StormFeng:多谢支持,暂只开放腾讯SDK,Demo也以腾讯SDK为例做演示,遇到问题请联系我

本文标题:Pik,一行代码集成主流SDK

本文链接:https://www.haomeiwen.com/subject/hkbgxftx.html